开始

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