最近有一个数据统计服务需要升级SpringBoot
的版本,由1.5.x.RELEASE
直接升级到2.3.0.RELEASE
,考虑到没有用到SpringBoot
的内建SPI
,升级过程算是顺利。但是出于代码洁癖和版本洁癖,看到项目中依赖的MyBatis
的版本是3.4.5
,相比当时的最新版本3.5.5
大有落后,于是顺便把它升级到3.5.5
。升级完毕之后,执行所有现存的集成测试,发现有部分OffsetDateTime
类型入参的查询方法出现异常,于是进行源码层面的DEBUG
找到最终的问题并且解决。
最近在做创业项目的时候因为有比较多的新需求,需要频繁基于DDL
生成Mybatis
适合的实体、Mapper
接口和映射文件。其中,代码生成器是MyBatis Generator(MBG)
,用到了Mybatis-Generator-Core
相关依赖,这里通过一篇文章详细地分析这个代码生成器的使用方式。本文编写的时候使用的Mybatis-Generator
版本为1.4.0
,其他版本没有进行过调研。
Hystrix
在2018年11月20日之后已经停止维护,最后一个提交记录是:Latest commit 3cb2158 on 20 Nov 2018
,最后一个正式版本为1.5.18
。鉴于目前所在公司的技术栈是Spring Cloud
,熔断和降级组件主要用的还是Hystrix
,这里就Hystrix
的完整列表做一个分析记录,方便以后可以随时查询。本文主要参考:Hystrix Configuration。其中,命令配置是针对HystrixCommand
,主要包括命令执行(execution)配置、命令降级(fallback)配置、熔断器(circuit breaker)配置、度量统计(metrics)配置和请求上下文配置。
最近的一个项目中涉及到文件上传和下载,使用到JUC的线程池ThreadPoolExecutor
,在生产环境中出现了某些时刻线程池满负载运作,由于使用了CallerRunsPolicy
拒绝策略,导致满负载情况下,应用接口调用无法响应,处于假死状态。考虑到之前用micrometer + prometheus + grafana搭建过监控体系,于是考虑使用micrometer做一次主动的线程池度量数据采集,最终可以相对实时地展示在grafana的面板中。
最近在项目中使用了SpringCloud,基于Zuul搭建了一个提供加解密、鉴权等功能的网关服务。鉴于之前没怎么使用过Zuul,于是顺便仔细阅读了它的源码。实际上,Zuul原来提供的功能是很单一的:通过一个统一的Servlet入口(ZuulServlet
,或者Filter
入口,使用ZuulServletFilter
)拦截所有的请求,然后通过内建的com.netflix.zuul.IZuulFilter
链对请求做拦截和过滤处理。ZuulFilter
和javax.servlet.Filter
的原理相似,但是它们本质并不相同。javax.servlet.Filter
在Web应用中是独立的组件,ZuulFilter
是ZuulServlet
处理请求时候调用的,后面会详细分析。
最近在做一个新项目的时候引入了一个架构方面的需求,就是需要检查项目的编码规范、模块分类规范、类依赖规范等,刚好接触到,正好做个调研。
很多时候,我们会制定项目的规范,例如:
还有很多其他可能需要定制的规范,最终可能会输出一个文档。但是,谁能保证所有参数开发的人员都会按照文档的规范进行开发?为了保证规范的实行,Archunit以单元测试的形式通过扫描类路径(甚至Jar)包下的所有类,通过单元测试的形式对各个规范进行代码编写,如果项目代码中有违背对应的单测规范,那么单元测试将会不通过,这样就可以从CI/CD层面彻底把控项项目架构和编码规范。
前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer
和MethodInterceptor
之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理。
CGLIB,即Code Generation Library,是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(例如Spring)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib。
CGLIB的github简介:CGLIB - 字节码生成库,是用于生成和转换Java字节码的高级API。它被AOP、测试、数据访问框架用于生成动态代理对象和拦截字段访问。(原文:cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access.)
CGLIB提供两种类型的JAR包:
本文中使用的CGLIB依赖为:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.2.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
最近线上的项目使用了spring-actuator
做度量统计收集,使用Prometheus进行数据收集,Grafana进行数据展示,用于监控生成环境机器的性能指标和业务数据指标。一般,我们叫这样的操作为"埋点"。SpringBoot中的依赖spring-actuator
中集成的度量统计API使用的框架是Micrometer,官网是Micrometer.io。在实践中发现了业务开发者滥用了Micrometer的度量类型Counter
,导致无论什么情况下都只使用计数统计的功能。这篇文章就是基于Micrometer分析其他的度量类型API的作用和适用场景。