开始
Spring Boot 最新版本曾经到了3.1.x版本,线上目前用的2.1版本官网曾经进行反对,目前打算先做肯定的技术预研,在不降级JDK的前提下,削减降级坡度,事后降级到2.7.10版本GA版本。
SpringBoot官网版本反对阐明:(写这边文章时从2.7.9变成了2.7.10)
官网文档:https://spring.io/projects/spring-boot#support
官网Github Release: https://github.com/spring-projects/spring-boot/releases/tag/v2.7.10
spring cloud 版本
外面降级jar包,修复logger包的破绽,fastjson破绽也会随着这次降级一道修复
废话不多说,间接开始:
依赖解决与性能降级
SpringBoot主包降级
咱们将springboot主包从2.1.9.RELEASE 批改为2.7.10.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.10</version> <relativePath/> </parent>
SpringCloud组件降级
目前Spring Cloud Alibaba 与cloud 基于spring boot 2.7.10的兼容版本
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.5</version></dependency><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.5.0</version></dependency>
这时候发现SpringCloud被逼在2020版本移除了对Netflix OSS大部分组件的反对
Spring Cloud官网尤其着重指出ribbon、hystrix 和 zuul 从Spring Cloud 2020.0正式版公布后将不再被Spring Cloud反对。在目前最新的Spring Cloud 2020.0中仅仅剩下了Eureka。然而留给Eureka的工夫也不多了。
其中ribbon 替换为SpringCloud LoadBalance 组件,收录在SpringCloud Commons 外面
文档如下:
参考博客:https://docs.spring.io/spring-cloud-commons/docs/current/refe...
应用上和ribbon没有什么不同,应用 @LoadBalanced 手动申明 RestTemplate Bean
@ConditionalOnMissingBean(RestTemplate.class) @LoadBalanced @Bean public RestTemplate restTemplate(@Qualifier("myMappingJackson2HttpMessageConverter") MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter) { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add(new CoreHttpRequestInterceptor()); //RestTemplate解决Date数据类型反序列化的问题,应用自定义的MappingJackson2HttpMessageConverter笼罩 restTemplate.getMessageConverters().add(5, mappingJackson2HttpMessageConverter); return restTemplate; }
hystrix能够思考应用Spring Cloud Alibaba的Sentinel做熔断和流控
上面开始做hystirx到Sentinel迁徙:
首先是pom替换
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency><!-- <dependency>--><!-- <groupId>org.springframework.cloud</groupId>--><!-- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>--><!-- </dependency>--> <!--ribbon-->
我的项目外面持续应用openfeign做rpc调用,将application.properties外面feign的熔断实现配置批改为sentinel实现。
# 去掉# feign.hystrix.enabled: true# 改为如下即可feign.sentinel.enabled: true
这里成心将order服务配置错,查看rpc调用信息,能够看到应用了loadbalance 和sentinel
FeignClient基于sentinel对fallbackFactory对立降级的优化解决
因为熔断须要,业务降级时,须要手写fallback业务,然而并不是所有的RPC都须要写降级代码,所以才有了定义对立业务Reuslt返回fallback降级信息,代替框架的没有配置就throw Exception的逻辑。
之前Netflix时,是feign联合hystrix做,当初降级后,须要应用sentinel逻辑再改一遍。
参考博客:https://blog.csdn.net/qq_40592377/article/details/105142856
cloud的 openfeign和alibaba 的sentinel包外面移除了如下包依赖,测底和hystrix辞别了
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hystrix</artifactId> <version>10.4.0</version> <scope>compile</scope> </dependency>
这里是从新批改后的代码
批改处1 应用反射结构SentinelInvocationHandler是因为他不提供public构造方法
批改处2 应用了我本人定义的对立Result业务谬误Result的FeignFallback。
Feign对于上游参数的透传 TODO
之前是自定义HystrixConcurrencyStrategy实现,在微服务之间RPC调用时,实现申请的业务header值,跨线程池透递
目前改用sentinel之后,还没有钻研透彻,有待后续优化。
Bean循环援用的问题
重启零碎,发现报错如下,因为SpringBoot 2.6开始默认禁止循环援用,这时候改业务就有麻烦,先批改为强制批准。
> Description: The dependencies of some of the beans in the application context form a cycle: 略 ↓ sqlSessionFactory defined in class path resource [com/suike/config/database/MyBatisConfig.class] ┌─────┐ | dataSource defined in class path resource [com/suike/config/database/MyBatisConfig.class] ↑ ↓ | dataSourceDev defined in class path resource [com/suike/config/database/dataSource/DruidDBConfigDev.class] ↑ ↓ | dataSourceInitializer └─────┘
在我的项目Starter文件中批改 setAllowCircularReferences(Boolean.TRUE);
public static void main(String[] args) { log.info(">>>>>>>> steamcdk-activitys 启动开始 >>>>>>>>>"); SpringApplication application = new SpringApplication(ActivityStarter.class); //临时先容许循环援用,前面再清理业务。做标准 application.setAllowCircularReferences(Boolean.TRUE); application.run(args); log.info(">>>>>>>> steamcdk-activitys 启动实现 >>>>>>>>>"); }
参考:https://blog.csdn.net/Dug_Zhang/article/details/122225331
依赖组件Nacos Server版本升级
重启我的项目,再次报错:
ErrCode:-401, ErrMsg:Client not connected,current status:STARTING
询问度娘得悉,Alibaba2.2.7中nacos client 依赖的server 必须也是2.x 以上,而我这边我的项目之前用的是nacos-servcer-1.4.1
没辙,去nacos官网查1.x降级2.x降级文档:
nacos git地址: https://github.com/alibaba/nacos/releases
nacos2.0降级文档: https://nacos.io/zh-cn/docs/2.0.0-upgrading.html
覆盖文件,而后批改下配置就好了,双写先开着,老零碎还在用。
ErrCode:-400, ErrMsg:Could not initialize class com.alibaba.nacos.common.remote.client.grpc.GrpcSdkClient
nacos 升级成2.2.0 ,以下是alibaba 官网版本匹配
Springfox 降级为Springdoc
重启一下,T T,持续!
网上说如果要持续用Springfox,只须要加一段配置
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
然而前面必定还会有兼容性问题,再次求助得悉:Spring基于Swagger3本人做了一套基于openapi3标准的文档我的项目,叫springDoc.
参考:https://zhuanlan.zhihu.com/p/439255980
忙活了半天,还是决定替换成SpringDoc,首先是springfox 曾经很久没有更新了
其实,改版后发现Springdoc 的确做的比springfox更适宜spring体系。
文档地址:https://springdoc.org/#demos
替换注解,重写OpenAPI的配置文件,参考文档,胜利平滑替换
Redis线程池改变
特地留神,spring date redis 依赖的commons-pool2 2.9.0会报错,须要另外申明为最新
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.11.1</version></dependency>
在Springboot 2x当前,底层拜访redis曾经不再是jedis了,而是lettuce
这边配置批改为应用lettuce链接池
MYSQL连接器 版本升级
MySQL的链接驱动, 从 8.0.31 开始,从原来的 mysql:mysql-connector-java 改为 com.mysql:mysql-connector-j
网关中,对于exclude Url匹配规定降级
> org.springframework.web.util.pattern.PatternParseException: No more pattern data allowed after {*...} or ** pattern element
谬误直观展现是门路统配问题,可是之前没有问题啊,起初通过一通查找发现是spring降级到5.3之后门路统配产生了变动,官网给出的解释是“In Spring MVC, the path was previously analyzed by AntPathMatcher, but it was changed to use PathPatternParser introduced in WebFlux from Spring 5.3.0.”。
2、具体解决是把/**/*.html 改为 /*/*.html
,我的项目中可能波及多个文件,都要改:
OK,批改完重启。不出所料再次遇到问题
网关应用Loadbalancer代替Ribbon实现负载平衡
拜访服务网关进行路由时,找不到服务
gateway配置一切正常,鉴权也没有问题,nacos也失常注册,然而路由的时候就是找不到服务
解决办法:在pom.xml文件中增加如下依赖:
<!--客户端负载平衡loadbalancer--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
起因:因为springcloud2020弃用了Ribbon,因而Alibaba在2021版本nacos中删除了Ribbon的jar包,因而无奈通过lb路由到指定微服务,呈现了503状况。
所以只须要引入springcloud loadbalancer包即可
fastJson重大破绽,降级为1.2.83版本
我的项目启动时,退出如下代码
/* * Fastjson存在近程代码执行破绽 降级到最新版本1.2.83 关上autotype性能 * @see https://github.com/alibaba/fastjson/wiki/enable_autotype */ParserConfig.getGlobalInstance().addDeny("com.rush.gameup");
非必须降级
Mybatis-plus从3.2降级到3.5
mybatis-plus能够说是用lambda预发写sql,体感十分丝滑。
在3.5中,次要改变是代码生成器的api降级,变得更弱小了。
这里我通过mybatis-generator生成时指定我形象出的一套扩大父类,能够放慢不少开发速度
更进阶的话,手挫 100% 符合本人业务的vm、ftl模板,设想空间很大。
也能够体验下@EnumValue,@TableLogic的“花活”。
文档地址 https://baomidou.com/pages/24112f/
Gateway应用knife4j聚合swagger文档并优化ui
降级后的spring doc的UI好看了一些
然而当初有一个国人开源的更弱小的UI插件:knife4j
界面成果如下图,下拉框里会列出nacos外面注册的所有服务,knife4j会主动拆卸进来,选中即可查看文档
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-gateway-spring-boot-starter</artifactId> <version>4.1.0</version></dependency>
最新4.1版本Gateway只须要如下的简略配置,就能够主动注册和聚合所有微服务的swagger文档,比我之前手动写个聚合页应用体验要强上许多。
knife4j: gateway: # 指定服务发现的模式聚合微服务文档,并且是默认`default`分组 strategy: discover discover: # 指定版本号(Swagger2|OpenAPI3) version: openapi3 enabled: true enabled: true
参考文档:https://doc.xiaominfo.com/docs/changelog/x/4.1