Spring Cloud 升级Finchley.SR2稳定版本详细方案(双12福利)

版权声明:更多信息请关注 wwws.shinians.com 官网 https://blog.csdn.net/zzhuan_1/article/details/84960855

                                 升级攻略

1.升级必读                           

当我们决定升级SpringCloud的时候,首先要考虑的第一个问题是什么?

自然不用说,那肯定是SpringCloud的主版本的问题,是要升级到什么版本,是F版还是G版本

这里给几点建议(亲采坑经验)

企业开发用Finchley.SR2(稳定版本),个人开发随意。

升级的时候用的是Greenwish M3 pre最新版本(需要配置maven地址配成Spring提供的仓库地址,暂时没有提交到其他仓库)可是遇到了很多问题,最要命的是bug不好找解决方案。不到半天的时间就降为了F稳定版本。

SpringCloud 版本说明

下图是在官网一个关于SpringCloud版本的说明(截至2018年12月 12日)希望能帮助您

cloud版本 SNAPSHOT: 快照版本,随时可能修改 ;
M: MileStone;M1表示第1个里程碑版本,一般同时标注PRE,表示预览版版;
SR: Service Release,SR1表示第1个正式版本,一般同时标注
GA:(GenerallyAvailable),表示稳定版本
所以企业开发选择稳定版本吧即可,无需犹豫(特殊情况除外) 。更多信息关注 @架构师速成记

2 详细步骤

2.1合并svn版本,做好备份工作

提交个人代码,合并到svn主版本上,做好备份工作后在进行升级(升级肯定有坑点,所以备份是必须的)

 2.2 pom文件升级

之前版本

启动之前版本&&升级前 pom文件

pom文件

开始升级 父pom文件升级

 <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

做完两个引入就升级完了?NO,因为F版本和之前的D版本区别还是很大的,所以尼懂得,继续下一步。

子模块各个pom需要升级的引入jar(版本变动,引入也变化很大,如eureka、feign等)

eureka

<!--eureka-server服务端引入 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

feign

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

zuul

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

....其它的组件根据用户引入做成相应更改,不再一 一列出。

以上几个组件都发生了变化,所以进行更正为对应版本的引入即可

 

2.3 Java类排查导包问题

jar版本发生了变化,自然下一就是更改java类导入的包路径,要不然一路标红

如feign的 引入 

去除错误的引入后重新引入  :import org.springframework.cloud.netflix.feign.FeignClient;

java的问题还是挺多的,根据报错地方进行排查即可,这些都是比较明显的问题,比较容易排查,下面列一下比较隐晦的bug。如下所示。 如果对您的项目有帮助欢迎关注  @架构师速成记

3.常见 问题汇总

3.1、Eureka 注册中心显示服务的ip地址不显示

问题描述:   如下图所示注册 中心不显示服务的ip地址了,尴尬了

UP (1) - ${spring.cloud.client.ipAddress}:7006

解决方案:

eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
     defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
    prefer-ip-address: true 

将${spring.cloud.client.ipAddress}改成${spring.cloud.client.ip-address}

eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
     defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    prefer-ip-address: true 

3.2、zuul网关集合springsecurity_JWT 颁发token_但是Authorization无法传递到response的header中

1.默认情况下,zuul不会将敏感的http首部,如(Cookie,Set-Cookie)和Authorization转发到下游服务,要让Zuul传播HTTP首部Authorization,需要在zuul服务网关的application.yml或者application.properties中,设置以下配置:

这样设置:

E:\IdeaWkSpace\SmartCommunity\sc-gateway\src\main\resources\application.properties

spring.application.name=sc-gateway
server.port=8040
zuul.host.socket-timeout-millis=60000
zuul.host.connect-timeout-millis=10000
#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.url=spring-cloud-producer

#zuul.sensitive-headers="Cookie", "Set-Cookie", "Authorization")
zuul.sensitive-headers="Cookie","Set-Cookie"  //注意这里就是这样设置的

上面是提出的一种解决方案,暂时没有那样设置,我们采用下面的这种做法

核心思路就是Authorization这种敏感关键字用其他如x-user-token代替

//传递token的备用字段
public static final String HEADER_X_USER_TOKEN = "x-user-token";

解决方案:

 String token=  request.getHeader(JwtUtil.HEADER_AUTH);

        log.info("访问token{}",token);

        //是否开启 token认证,获取登陆用户
        if(!StrUtils.isBlank(token)){
         try {
             UserInfo userInfo=JwtUtil.getInstance().validateToken(token);
             if(!StrUtils.isBlank(userInfo)) {
                 ctx.addZuulRequestHeader(JwtUtil.HEADER_AUTH,token);

                 ctx.addZuulRequestHeader("x-user-id", userInfo.getId());
                 ctx.addZuulRequestHeader(JwtUtil.HEADER_X_USER_TOKEN,token);
//                 ctx.addZuulRequestHeader("x-role-code", request.getRequestURL().toString());
             }
         }catch (Exception ex){
public class UserTokenIntercepter extends HandlerInterceptorAdapter {
    private static final Logger log = LoggerFactory.getLogger(UserTokenIntercepter.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse respone, Object arg2) throws Exception {
        String token=  request.getHeader(JwtUtil.HEADER_AUTH);
        //默认情况下,zuul不会将敏感的http首部,如(Cookie,Set-Cookie)和Authorization转发到下游服务,要让Zuul传播HTTP首部Authorization,需要在zuul服务网关的application.yml或者application.properties中,设置以下配置:zuul.sensitive-headers="Cookie","Set-Cookie"

        //如果无法传递换成其他的字段传递token
        if(StrUtils.isBlank(token)){
            token=  request.getHeader(JwtUtil.HEADER_X_USER_TOKEN);
        }
        //respone.setCharacterEncoding(Constant.CONTENT_TYPE);
        if (!StrUtils.isBlank(token)){
            ApplicationContextHolder.setToken(token);
        }
        return true;
    }

3.3、跨域问题

问题描述
前端 vue 框架,后台 php,百度跨域问题后台加这段代码 
header("Access-Control-Allow-Origin: *");

加了之后报这个错: 
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

引用网上比较常见的讨论,截图如下

在升级之前因为需要验证码 保持session一致性,所以配置withCredentials是true的,但是升级之后,问题就出现来了,后来用下面的这段配置解决 了升级的问题,代码如下。如果对你的项目有帮助欢迎关注今日头条 @架构师速成记

@Configuration
public class WebMvcFilterConfigurerAdapter implements WebMvcConfigurer {
    /**
     * 解决跨域的问题
     * @return
     */
 @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 允许cookies跨域
        config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
        config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
        config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
        config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
...
}

3.4 WebMvcConfigurerAdapter过时问题

解决思路:用WebMvcConfigurer替代

@Configuration
public class WebMvcFilterConfigurerAdapter implements WebMvcConfigurer {
    @Bean
    public HandlerInterceptor getSecurityInterceptor(){
        return new SecurityInterceptor();
    }
    /**
     * 配置静态资源
     */
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");
//        super.addResourceHandlers(registry);
    }
.....
}

3.5 Feign报错'xx.FeignClientSpecification', defined in null, could not be registered.

错误描述:

版本使用的是SpringBoot: 2.0.6.RELEASE,SpringCloud: F稳定版
报错:

The bean 'xxxx.FeignClientSpecification', defined in null, could not be registered. 
A bean with that name has already been defined in null and overriding is disabled.

Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: 
Invalid bean definition with name xxxx.FeignClientSpecification' defined in null: 
Cannot register bean definition [Generic bean: class [org.springframework.cloud.openfeign.FeignClientSpecification]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'xxxx.FeignClientSpecification': There is already [Generic bean: class [org.springframework.cloud.openfeign.FeignClientSpecification]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.

解决:多个接口上的@FeignClient(“相同服务名”)会报错,overriding is disabled

在application.yml中配置:

spring:
  main:
    allow-bean-definition-overriding: true

暂时 这么解决,不知有没有“后患”,欢迎其他人留言,共同讨论,谢谢。

3.6 .Error:(4, 40) java: 程序包com.fasterxml.jackson.annotation不存在
 <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
3.7 .Caused by: java.lang.IllegalStateException: Failed to introspect Class [com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure] from ClassLoader [sun.misc.Launcher$AppClassLoader@18
将druid升级到1.1.10


3.8 Servlet-specific server properties

A number of server.* properties that are Servlet-specific have moved to server.servlet:

Old property New property

server.context-parameters.*

server.servlet.context-parameters.*

server.context-path

server.servlet.context-path

server.jsp.class-name

server.servlet.jsp.class-name

server.jsp.init-parameters.*

server.servlet.jsp.init-parameters.*

server.jsp.registered

server.servlet.jsp.registered

server.servlet-path

server.servlet.path

3.9 Endpoints infrastructure key have been harmonized:

Old property New property

endpoints.<id>.*

management.endpoint.<id>.*

endpoints.cors.*

management.endpoints.web.cors.*

endpoints.jmx.*

management.endpoints.jmx.*

management.address

management.server.address

management.context-path

management.server.servlet.context-path

management.ssl.*

management.server.ssl.*

management.port

management.server.port

3.10 Developer Tools

Hot swapping

As the Spring Loaded project has been moved to the attic, its support in Spring Boot has been removed. We advise to use Devtools instead.

Devtools Remote Debug Tunnel

The support for tunnelling remote debugging over HTTP has been removed from Devtools.

总的来说热部署插件注意下 就ok

3.11 Dependency Versions(版本依赖)

The minimum supported version of the following libraries has changed:

  • Elasticsearch 5.6

  • Gradle 4

  • Hibernate 5.2

  • Jetty 9.4

  • Spring Framework 5

  • Spring Security 5

  • Spring Integration 5 (see also their migration guide)

  • Tomcat 8.5

Spring Boot 2.x 新特性总结及迁移指南(转) 

https://blog.csdn.net/zzhuan_1/article/details/84975942

3.12 springboot2.x 的 RedisCacheManager变化

RedisCacheManager已经没有了单参数的构造方法 

....

END

还有 其他问题暂时没有 汇总完,下一章节进行汇总,如果对您的项目有帮助欢迎关注 @架构师速成记

猜你喜欢

转载自blog.csdn.net/zzhuan_1/article/details/84960855