自然不用说,那肯定是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主版本上,做好备份事情后在进行升级(升级肯定有坑点,以是备份是必须的)
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的,但是升级之后,问题就涌现来了,后来用下面的这段配置办理 了升级的问题,代码如下。如果对你的项目有帮助欢迎关注今日头条 @架构师速成记
@Configurationpublic 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替代
@Configurationpublic 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 propertyNew propertyserver.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 propertyNew propertyendpoints.<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.6Gradle 4Hibernate 5.2Jetty 9.4Spring Framework 5Spring Security 5Spring Integration 5 (see also their migration guide)Tomcat 8.5Spring Boot 2.x 新特性总结及迁移指南(转)
https://blog.csdn.net/zzhuan_1/article/details/84975942
3.12 springboot2.x 的 RedisCacheManager变革
RedisCacheManager已经没有了单参数的布局方法
....
END
还有 其他问题暂时没有 汇总完,下一章节进行汇总,如果对您的项目有帮助欢迎关注
更多信息关注@架构师速成记