自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(324)
  • 收藏
  • 关注

原创 Mybatis报错:Unsupported conversion from LONG to java.sql.Timestamp

如果实体类标注了@Builder注解,则此注解会把默认的构造方法全部改成私有的,则Mybatis在通过无参构造方法反射创建对象时,就会找不到构造方法,抛出Unsupported conversion from LONG to java.sql.Timestamp异常。这里完全可以抛出一个 MethodNotException,可以快速定位到是没有公开的空参构造方法的原因,这里Myabtis可以做优化。Mybatis在封装结果集的时候,如果方法返回的是对象,则会去调用这个对象的无参构造方法。

2024-04-07 10:53:51 217

原创 SpringBoot根据配置类动态加载不同环境下的自定义配置

Profile 注解可以根据当前环境加载当前配置类,而@PropertySource可以加载其他jar包下的classpath文件。

2024-03-31 22:11:13 309

原创 Nginx配置请求头携带原始请求信息

在浏览器向nginx发送请求时,nginx会将请求转发给SpringBoot,此时由于是nginx给SpringBoot发送的请求,所以SpringBoot获取到的请求IP是192.168.1.2,而并非是浏览器的192.168.1.1,如果想要获取原始的请求IP,应在nginx的配置文件加上以下配置。$proxy_add_x_forwarded_for:如果请求是从代理服务器转发过来的,该变量会包含原始客户端的 IP 地址。$request:当前请求的行,包括请求方法、URI 和协议类型。

2023-12-17 21:54:36 402

原创 Prometheus集成AlertManager实现告警

在receivers配置项中配置告警接收者的配置信息,可以配置邮件、企业微信以及自定义的webhooks,webhooks就是一个Http接口,当alertManager触发告警时,会自动调用配置的接口。编写一个SpringBoot的控制器,用于AlertManager告警时触发的回调。通过yml文件配置prometheus触发的告警规则。

2023-09-25 22:14:32 375

原创 SpringBoot集成Prometheus实现监控

这个指标的指标名是jvm_memory_max_bytes,标签是 {application=“blog”,area=“heap”,id=“Eden Space”,},而指标值是 7.1630848E7,将来使用PromQL查询时,标签可以起到筛选条件的作用。通过拿到MeterRegistry 自定义指标,这里定义了两种类型的指标,一种是Counter 计数器,值只增不减,一种是gauge,gauge类型可以随意修改。可以在上述的input输入框中输入PromQL进行对指标的查询。可以看到最新的指标值。

2023-09-21 23:43:48 683

原创 窗口延时、侧输出流数据处理

AllowedLateness 需要设置一个延时时间,注意这个时间决定了窗口真正关闭的时间,而且是加上WaterMark的时间,例如 WaterMark的延时时间为2s,AllowedLateness 的时间为2s,那一个10的滚动窗口,0-10这个单位窗口正常的关窗时间应该是超过12s的数据到达之后就关窗。使用 OutputTag API 保证窗口关闭的数据依然可以获取,窗口到达AllowedLateness 时间后将彻底关闭,此时再属于该窗口范围内的数据将会流向 OutputTag。

2023-09-09 22:38:21 438

原创 自定义封装异步任务组件,实现FutureTask功能

就是取决于当前对象的标签,例如我有一个翁,标签是 钥匙,那我需要一个处置东西的工具、而这个处置东西的工具也可以打标签,例如可以处置杯子、处置木头、处置钥匙等,那这个地方的意思就是我需要一个Consumer类型的对象,这个对象的标签是T,而T是哪里来的,T是在创建当前对象的时候定义好的,也就是类似常说的出厂设置,这个实例在创建的时候就知道自己的泛型,即 某个翁在制造好出厂的时候就打好标签了。泛型就相当于翁的一个标签,标识着此翁装配的东西,有的实例方法需要的参数也是带着泛型的,例如AsyncTask中的。

2023-09-07 21:17:50 168

原创 时间语义与窗口

在DataStream上游数据流通过assignTimestampsAndWatermarks 分配watermark@Override@OverridecreateWatermarkGenerator 方法用于返回 WatermarkGenerator@PublicWatermarkGenerator 两个方法分别对基于事件的WaterMark以及周期性的生成watermark两种生成策略发射watermark。

2023-09-03 17:19:53 304

原创 线上集群数据不同步问题解决

生产环境部署101、102两台服务器,使用Nginx做负载均衡返回html页面,两台JVM分别做了内存的数据缓存,前端页面在进行数据修改时,随机发送到了某台服务器上,此台服务器更新了自己的缓存,但另一台服务器还是修改之前的数据,这就导致两台JVM的数据不一致,自然发生了问题。在负载均衡 高可用的情况下 要慎用 JVM 内存做缓存。

2023-08-25 16:55:45 90

原创 Maven生命周期、阶段与目标

常用的 mvn 命令后面跟的参数其实不是生命周期而是阶段,例如 mvn clean 表示找到clean这个生命周期,然后从这个这个生命周期最开始的阶段到clean这个阶段也就是 pre-clean、clean。光有阶段还不够,代码的编译、测试、打包其实都是通过一个个的插件目标做的,这些插件目标其实就是一个个的Java类,一个阶段可以绑定一个或多个目标,例如执行 mvn package 就可以看到每个插件绑定的目标。在maven中,每一个生命周期都对应多个阶段。

2023-08-22 23:29:07 162

原创 多线程实现与管理

线程也有自己的TID。假设有有一个存取队列的场景,有A、B两个线程,一个线程去队列中存数据,另一个线程取队列中的数据,但是取数据的线程不知道存的线程什么时候放,如果使用while去一直监听的话,这样会造成系统资源的浪费,更好的一种做法就是取线程如果获取不到数据,则进入等待状态,待存线程存入数据后 再通过取线程去获取。上述的 synchronized 锁的对象是有严重的线程安全问题的,因为每次锁的都是一个新创建出来的新对象,这个对象是刚创建出来的,对象头中的锁信息没有,则每次来一个线程都可以进入方法执行。

2023-08-20 22:29:38 213

原创 双线程利用wait、notifyAll实现交替打印输出

notify 方法,唤醒同一个synchronized 锁对象调用wait方法进入等待状态的线程,notify方法不会释放锁,会正常执行业务逻辑,唤醒了wait线程以后,被唤醒的哪些wait线程可以执行代码了,但是必须要等到notify的线程执行到wait时才可以,因为synchronized 代码块保证了同一时刻最多只能有一个线程去执行。wait和notify是线程之间通信的重要方法,明确这两个方法的执行时机,会不会释放锁,释放锁之后的操作等等。

2023-08-20 18:01:09 160

原创 Https、CA证书、数字签名

在使用了非对称加密算法保证浏览器与服务器通信安全以后,似乎还是有一个问题没有解决,那就是如果服务器发送给浏览器公钥的过程中被中间人拦截,中间人替换成自己的公钥发送给浏览器,那么浏览器再用假的公钥加密随机数,发给服务器,此时再度被中间人攻击,由于浏览器加密用的是假的公钥,所以攻击者可以用自己的私钥进行解密,然后再用浏览器的公钥加密,发给浏览器,这个时候,攻击者已经完全拿到的浏览器生成的随机数了,那么后续双方的通信也都可以被轻松破解。在可预见的时间范围内,这几种算法的安全性依然是相当高的。

2023-08-13 17:03:01 1169

原创 Kubeadm安装K8s集群

使用docker images 可查看下载的镜像信息。此时只有master节点是NotReady状态。编辑kube-flannel.yml。提示以下信息则表示初始化成功。再次查看master节点信息。改成虚拟机的网卡名称。

2023-08-13 13:19:55 336

原创 Docker-compose应用

docker-compose的文件格式为yml格式,可以批量配置多个容器的配置,挂载的数据卷、映射的端口等等。通过编写好的yml文件,使用docker-compose 一键启动配置好的容器或者停止容器。Docker-compose 是Dcoker官方推出的Docker容器的一键编排工具,使用Docker-compose可以批量启动容器、停止容器等等。直接下载已经编译好的二进制文件即可。运行yml文件中的所有容器。

2023-08-07 21:28:36 221

原创 Idea使用Docker插件实现maven打包自动构建镜像

在cmd终端运行 mvn clean package docker:build命令可以构建一个镜像,其中clean package这两个是常用的插件命令,maven内置好了,而docker:build 这个是作用于package后的生命周期的build的阶段,作用就是将打好的jar包构建成一个镜像。右击docker镜像,可以创建新的容器,并且可以监控容器日志输出,docker的日志收集是将容器内的标准输出以及错误输出重定向到了宿主机的某个文件中,这样就可以看到容器的运行信息了。配置docker服务地址。

2023-08-07 20:52:43 1643

原创 Docker制作SpringBoot镜像

此命令会将宿主机的 /opt/module/docker/java/mount/ 目录下的内容 挂载到 容器中的 /opt/mount/ 目录下,如果容器目录不存在,则会自动创建,然后把宿主机目录的内容给同步过去。如果宿主机和容器内都有的文件 ,则会以宿主机的为准,如果修改宿主机或者容器内的文件,都会进行相互同步,这里要注意的一点是,容器的宿主的文件要是提前存在的。这些镜像名和标签名都是none的,被称为虚悬镜像,可以理解为过时镜像,当新发布的镜像名和标签与就镜像一致时,旧镜像自然就成了虚悬镜像。

2023-08-06 17:28:19 759

原创 Dockerfile定制Tomcat镜像

RUN : RUN后面跟着linux常用命令,如RUN echo xxx >> xxx,注意,RUN 不能用于执行命令,因为每个RUN都是独立运行的,RUN 的cd对镜像中的目录无效。ENV 设置环境变量 : ENV MYSQL_ROOT_PASSWORD 123456 ,用于设置操作系统级别的环境变量,程序可以获取操作系统的变量进行配置和使用。定制Tomcat镜像实现可以访问默认的index.html,并将宿主机的文件复制到容器中。COPY : 用于将宿主机的文件,复制到容器中。构建Docker镜像。

2023-08-04 23:47:02 874

原创 使用docker 搭建nginx + tomcat 集群

Docker创建一个容器是秒级启动,同时支持挂载,端口映射等,通过此也可以发现Docker的强大,尤其是搭建负载均衡,快速扩容和缩容等。由于nginx的端口映射到了宿主机的8000,此时访问8000,就相当于在负载均衡的访问3台tomcat。使用cp命令,将容器中的nginx配置文件复制到宿主机上。此时重启nginx,将ngxin的配置文件挂载到宿主机。进入到nginx容器内部,找到Nginx的配置文件。修改配置文件,做负载均衡。

2023-08-03 22:05:28 1420

原创 解决外部主机无法访问Docker容器的方法

Docker也是同理,net.ipv4.ip_forward=1 可以看作是在centos 虚拟机上安装了一个网卡,专门用于桥接Docker容器的网络。这个时候vmware在win10上安装了一个虚拟网卡,这样才可以使用,此时是只有宿主机才能访问的,其他局域网内的机器是无法访问的。保存以后即可生效,这个配置是开启linux的ip数据包转发功能,允许linux将ip数据包转发到另一个网段的数据上。例如VMware虚拟机是安装在win10上的,如果使用的NAT模式,则默认两个不同的网段是无法直接通信的。

2023-08-02 22:16:47 1494

原创 Jenkins配置自动化构建的几个问题

也就是认证相关的报错问题,大概可以想到git仓库的类似,为jenkins提供git的用户名密码等,第二个报错是jenkins解析pom文件时报的错,还定位到了具体的行和列,这里容易让人产生误导,总是以为pom文件写的有问题,可以本地运行的时候明明是完全没问题的,要不是后面提示了获取镜像,根据不会去考虑settings文件的问题,这也是一些解决问题的经验吧,仔细阅读报错信息。springboot的依赖没有从阿里云的镜像拉取,而是从默认的镜像拉取,导致一直拉取不到,这里把下面的那个默认镜像注释了就可以了。

2023-07-29 16:40:44 400

原创 Java客户端IMQP协议获取邮箱邮件列表

Java客户端与邮件服务器交互需要获取到邮件服务器的授权码,这里以qq邮箱为例,说明授权码的获取方式登录qq邮箱后,点击主页的设置点击账户点击生成授权码发送短信验证码后,可以得到最新的授权码。

2023-07-20 14:35:04 521 1

原创 非对称加密、数字签名JDK实现

最后还是需要Cipher 这个对象去实现加解密,同时还要注意,Cipher加解密的结果不一定是一堆完整的字符串,所以往往还需要结合Base64或者Base58等可读性算法来存储或者传输。对于此类加密算法的实现有 RSA,ECC等,也就是说 对称加密,消息摘要以及非对称加密 是一些算法思想,基于思想才有的实现。那么非对称加密的算法实现就是RSA和ECC等。数字签名的过程和RSA的加密解密还有有些相似的,只不过就是在验证数字签名的时候这里要注意,一定是将原文和Base64转码后的签名字节数组去比较。

2023-07-18 17:25:15 247

原创 对称加密、消息摘要的JDK实现

除了基本的加密算法外,JDK中还实现了加密模式与填充模式,加密模式有两种,分别是 ECB与CBC,前者是块加密,每个块使用相同的秘钥,而CBC是每个块使用不同的秘钥,还需要用到IV向量。此类加密算法与对称加密有所不同,此类算法通常是将原文加密后生成一个固定长度的密文,注意,这里是固定长度的,也就是不管原文有多长,密文总是固定长度的,这里是和对称加密算法有区别的。然后将每个组的3个字节,拆成4个字节,3 * 8 = 4 * 6,拆成4个字节后,每个字节还少2位,此时需要在。

2023-07-17 10:48:54 135

原创 Java反射-反射API、类加载过程

Java反射API是Java语言实现动态性的关键,它允许动态的创建对象、赋值、以及调用对象的方法,同时反射也是实现动态代理的关键,涉及到反射相关的几个类主要有 Class、ClassLoader,Field、Method、Constructor、Proxy等。因为在Java中一切皆对象,当然,编译后的class字节码文件也会被JVM创建出一个唯一的Class类型对象,类就是类,对象就是对象,对象有属性可以调方法,任何对象也不例外,无需把这些对象想复杂化。这个时候仅仅是完成了类的加载过程,之后才是创建对象。

2023-07-12 23:07:41 171

原创 mysql将某一列的数据根据固定字符拆分后判断存不存在

如果是0,则说明在开头匹配到了1157这个字符串,此时需要根据1157这个字符串的长度去找这个长度 + 1 在大字符中下标处的字符,例如1157的长度是4,4+1 = 5,则需要在大字符串中找下标为5的字符,结果11574这个字符串下标为5的字符是4,这样就不对了,因为如果是个独立的1157,下标为5的这个位置必须是一个逗号,。如果不是0,这个时候需要判断前一位的下标是不是逗号,以及长度+1位的下标是不是逗号(当然不排除子字符串恰好处于末尾的情况)。如果不相等,则需要判断返回的结果是不是0。

2023-07-12 15:50:34 546

原创 SpringBoot 异常处理机制

在SpringBoot项目中,如果业务逻辑发生了异常,则首先看发生异常的类中有没有@ExceptionHandle能处理,如果能,则执行方法进行处理,如果没有,则去找全局的@ControllerAdvice注解,进行异常处理,如果还是不能处理,则继续看SpringMVC的异常处理机制能否处理,这里SpringMVC的异常处理机制就是可以处理默认的十几种异常,如请求类型错误Method Not Allowed,如请求体内容错误等,如果不能处理,则走SpringBoot提供的异常处理机制。

2023-07-12 13:17:55 505

原创 前端发送Fetch请求实现流式请求、模拟打字机效果等

这里的逻辑是每次监听到后端的流式数据以后,动态拼接上已有的字符串,然后将markdown转为html格式,然后继续拼接上这个span标签一起渲染到页面上,这个时候再开启个定时器,定时器获取到这个标签,动态的调整这个标签的opcatity透明度就可以实现光标闪烁的效果了。onmessage的主要逻辑就是累加所有流式数据返回的内容,然后渲染到页面上,这里需要注意的是接口返回的为markdown格式的数据,所以还需要用到一个markdown转html的依赖库。npm 方式安装类库。

2023-07-07 11:04:14 4361 6

原创 Axios跨域请求携带cookie

如当前访问的域是10.99.160.11 :8080 这个端口,那么当向10.99.160.11 :8080 这个端口发请求时,由于不存在跨域,则可以顺利携带cookie,但是当向 10.99.160.11 :9100这个端口发请求时,此时发生了跨域,当发生跨域请求时,默认是不能携带cookie的,此时需要设置axios的withCredentials :配置项。但是使用axios发起跨域请求时,需要设置withCredentials:true 配置属性才能生效。

2023-06-06 17:48:28 2200 1

原创 @Import注解与自定义派生注解的使用

典型的应用就是像mybatis这些第三框框架提供的@MapperScan注解,@FeginClient注解等,这些注解都不是Spring官方注解,但在Bean组件上标识这个注解以后,就会给容器中导入Bean,究其原理就是这些非官方注解的注解元数据上都有@Import注解。以MapperScan为例。Import注解可以给容器中批量导入Bean,并可解析这个类中的Spring支持的注解,例如@Autowried、@Schedule 等等。这就是@Import注解的强大作用。

2023-06-06 14:20:17 105

原创 MySql Order by 字段出现重复导致 limit 分页后的数据错乱

所以此时的解决办法有2个,一个是order by 后面根据一个唯一的列去排序,如果还是优先想根据重复的列去排序,则可以使用多列排序。当使用mysql 进行分页查询出现数据不一致问题时候 可以看看order by 后面列数据是否有重复值。说明当order by 列中有重复值的时候,mysql server 会看自己心情随机处理返回结果。但是加了limit以后就出现问题了,原本以为是截取的前10条,结果出现了数据错乱的情况。共有28条数据,确实是按照event_time排序的。在官方文档 有这样一句话。

2023-06-02 22:49:04 952

原创 SpringBoot中@ConditionalOnMissingBean注解失效

在今天测试使用@ConditionalOnMissingBean注解给容器中动态导入Bean时发现存在此注解失效的情况。原以为容器中只会有一个Dog对象,但是经过运行测试后,发现容器中竟然存在两个Dog对象。也就是说此时@ConditionalOnMissingBean注解失效了,原本以为Spring会把此注解的元数据信息解析到BeanDefination中,最后发现居然是加载顺序的问题。如果把以上代码的两个方法更换一下顺序即可解决此问题。

2023-06-02 14:03:50 695

原创 Tomcat抛出ClientAbortException后导致IO流无法关闭问题

在Java中,使用URL类发送http请求时,如果调用的是一个文件下载接口,而此接口返回的文件数据较大时,如果客户端突然关闭连接,则HttpServletResponse的输出流在写数据的时候会抛出一个ClientAbortException。这个时候是可以通过异常堆栈信息看到到底是哪一行出的错的。方法里面报了错之后,后面的代码就不会执行了。当outputStream在输出时,如果抛出异常,则代码块中的后续close操作没有被执行,而正式因为没有被执行,导致一个输入流维护的http socket一直阻塞。

2023-06-01 15:35:21 520

原创 HttpServletResponse 设置ContentType

通过设置响应头 Content-Disposition 让浏览器实现弹窗下载,这里下载的话,ContentType可以根据文件名动态获取也可以直接写成application/octet-stream,只因下载不是预览,只是下载下来查看。可以设置成图片、PDF等。如果浏览器无法识别或者无法解析文件类型,会直接进行下载,可以处理的类型为预览效果。这里的ContentType比较重要,浏览器根据此响应头来判断需要如何解析响应体的内容类型。

2023-05-18 16:29:56 2037

原创 Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题

首先通过增加日志打印,排查方法的哪一步出现了问题,因为9200的tomcat服务器所有的静态资源是可以正常返回的,这排除了服务器问题,比较离奇的时候,所有的日志打印地方都可以正常输出,可以正常请求到sdd.com的结果,但是就是返回不了数据,这一步至少确定了 从9200发送sdd.com是没问题的。在cal.com上线后,用户发起请求,发现9200端口上的静态页面请求可以返回,而ajax请求数据无法返回,所有的ajax请求是做了代理的,代理到了sdd.com。这就导致匹配不起来了。

2023-05-11 15:58:38 2684 2

原创 SpringBoot异常重定向/error问题

但是注意,这里捕获的是RuntimeException,如果程序里抛出的是Exception,那就完蛋了,此时SpringMVC就找不到合适的异常处理方法了,只能是自己接管处理,此时springmvc会请求转发到/error,这个error路径有可能会被我们写的拦截器给拦截到,进而造成一些其他异常。SpringBoot 编写了全局异常处理器以后 发送请求报错。

2023-05-09 15:26:40 881

原创 Hive 建表客户端报错 missing EOF at “/“

后来把sql中的注释去掉以后,或者把注释开头替换成 – 此异常便可以解决。在创建表时,我使用的是idea客户端,报了如下错误。

2023-05-02 18:11:11 3212

原创 Hive metastore 元数据mysql库中文乱码

例如我们要查询某个表的数据,mysql会先去看这个表的数据用的什么编码规则,例如GBK,然后再根据这个编码规则解析成字符串,再把这个字符串用 character_set_results 指定的参数去编码好,发送给客户端。character_set_database这个参数指定的是数据库存储数据时用什么编码,默认是拉丁编码,如果数据库的表不指定编码,则默认继承库的编码,如果字段不设置编码,则默认继承表的编码。所以hive表默认使用latin编码时就已经出现了乱码,则再去解析数据传给客户端时自然也是乱码的。

2023-04-30 12:14:44 105

原创 说说Java日志那些事

日志是每个应用程序在开发的过程中必不可少的组件,通过日志输出可以获取项目的一些运行信息,监控项目的运行指标等,同时,通过学习Java日志框架还可以学习到桥接器与适配器模式等。

2023-04-23 23:36:14 429

原创 Jsoup解析Html踩坑问题

No-Break-Space 的简写为nbsp,这个字符就对应了html内的 空格,这个空格和普通的32空格是完全一样的,没有任何区别,但是在进行例如 startWith(" “) endsWith(” ")等方法时 空格都是半角空格,所以此时一定要注意。在html文件中的 空格 会被解析为 全角空格,全角空格在unicode编码中的码值时12288,而正常的space空格在uncoide中的码值时32,这里在转换时要注意。Jsoup在解析Html时,转换的空格存在以下问题。

2023-04-16 16:32:14 209

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除