生活中我是一个爱吃螃蟹的人,工作中我也是一个敢吃且爱吃螃蟹的人。只要有时间,同样的业务场景我都想用用新东西,这样一切才能进步。我就是我,敢怼天、敢怼地,工作中的一些事都敢怼领导,但是不是因为看不得这个领导,一起都是为了精益求精,为了工作,为了心中的巨人。
今天主体上结束了一个项目的工作,自我调整下,明天正式进入另一个产品的研发,还是一个人在战斗,微服务一个人做,还好业务线分的不是特别细。今天主要分享下微服务大版本的升级,由2.3.8->目前稳定的最新2.4.3&2020.0.1。
一、版本号变更最新
这个我就不多说了,我这边是在大的项目下建的module(每个服务是一个)。各位根据自己情况改,有的是统一定义在外面,有的是直接在dependency里面的version里。
二、eureka注册中心启动失败
1、com.sun.jersey.client.apache4.config.DefaultApacheHttpClient4Config没有找到
在这里插入图片描述
解决办法:(翻墙找到原因->官网)
在这里插入图片描述
问题参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/3959
官网描述:
在这里插入图片描述
官网参考:https://docs.spring.io/spring-cloud-netflix/docs/3.0.1-SNAPSHOT/reference/html/#eurekaclient-without-jersey
解决方式:
很清楚,就是要引入这几个包,但是我这里要说的是,你千万不要直接复制粘贴,我就是复制粘贴无效的(可能),建议最好是手敲一边,让自动引包。另外说下,官网是没有版本号的,我本地jersey-apache-client4包不写版本号倒是不报错,但是报红,所以我写了版本号。

<dependencies>
   <!-- eureka注册中心客户端支持 -->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>
   <!-- eureka注册中心服务端支持 -->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
   </dependency>
   <!-- springCloud 2020以上版本配合eureka需要 -->
   <dependency>
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-client</artifactId>
       <version>1.19.4</version>
   </dependency>
   <dependency>
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-core</artifactId>
       <version>1.19.4</version>
   </dependency>
   <dependency>
       <groupId>com.sun.jersey.contribs</groupId>
       <artifactId>jersey-apache-client4</artifactId>
       <version>1.19.4</version>
   </dependency>

</dependencies>

PS:
这个是因为spring-cloud-starter-netflix-eureka-server导致需要的哦,貌似与springCloud新版本与openFeign服务的调用也有关,现在已经使用Spring RestTemplate 做服务调用了。
2、endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8761/eureka/}, exception=java.net.ConnectException: Connection refused: connect
在这里插入图片描述
原因:
配置文件没有生效,那为什么没有生效呢?
我这里是写在bootstrap.yml里的,而实际上此次升级版本后,这个配置文件时根本没有生效的。
真正的原因:
2020版本以后,官方重构了bootstrap引导配置的加载方式。添加spring-cloud-context是没有用的,需要的是引入bootstrap支持:

<!-- 2020版本以后,添加spring-cloud-context是没有用的,因为官方重构了bootstrap引导配置的加载方式 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

三、服务的启动
我这里eureka启动了,配置中心也启动了,启动服务的时候又出现配置文件读取不到,那不用说,肯定是配置文件没有取到,报错了:
在这里插入图片描述
处理这个首先是进入了一个误区,以为是以为版本升级了,发生的变化。然后各种百度,Google都没有资料,要知道现在新版本的还是用的人非常少,都是啃官网,但是官网也有坑啊。
版本肯定是跟着springCloud更新了的
示例代码:
在这里插入图片描述
这都没更新过,应该是没有变动
看代码提交时间,应该是没有改动,所以怀疑不是config的配置问题,用postman直接请求配置中心获取一个配置试试:
在这里插入图片描述
正常的,于是又把所有配置一起就报错了:
url:
{{apiUrl}}/fsihouse-thread,fsihouse-jdbc,fsihouse-redis,fsihouse-global-config,fsihouse-common-service/prod
逐个减发现是global配置有问题,经过检查发现,应该是现在新版本的指定环境配置发生改变导致的:
原先:

spring:
  profiles:
    active: prod

现在:

spring:
  config:
    activate:
      on-profile: dev

验证,将配置获取url的最后prod改为dev,就是正常不报错了。
到此升级为springCloud2020.0.1 + springBoot2.4.3就完成了。这里因为还处于开发初期阶段,还有很多没有写死,比如熔断、降级还没有完全使用Hystrix,不然还真不好升级,毕竟现在Hystrix已经不推荐了。下阶段就用推荐的resilience4j。
四、最后补充下升级后导致的gateway跨域
我这边没用配置,而是用的自定义Fillter + 自定义CorsConfiguration。本次升级只需要改动CorsConfiguration设置,直接上代码吧:

		CorsConfiguration corsConfiguration = new CorsConfiguration();

        //1,允许任何来源
        corsConfiguration.setAllowedOriginPatterns(Collections.singletonList("*"));
        //2,允许任何请求头
        corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
        //3,允许任何方法
        corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
        //4,允许凭证
        corsConfiguration.setAllowCredentials(true);
        //配置前端js允许访问的自定义响应头
        corsConfiguration.addExposedHeader("My-Token");
        corsConfiguration.addExposedHeader("My-UserId");
        // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
        corsConfiguration.setMaxAge(MAX_AGE);
        return corsConfiguration;

原因:

This is a part of security, you cannot do that. If you want to allow credentials then your Access-Control-Allow-Origin must not use *. You will have to specify the exact protocol + domain + port. For reference see these questions :
Access-Control-Allow-Origin wildcard subdomains, ports and protocols
Cross Origin Resource Sharing with Credentials
Besides * is too permissive and would defeat use of credentials. So set http://localhost:3000 or http://localhost:8000 as the allow origin header.

官方描述,其实意思也就是配置了allowCredentials为true后,不能将allowedOrigins设置为*,那么这就有几种处理方式了
1、在这里将他改为前端域名,即可解决
2、官方提供了setAllowedOriginPatterns,这个可以设置 *
这个应该是从springBoot2.4.0就这样的。就写到这里希望能帮到大家,共同进步。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐