内容简介:依赖版本以下库的最低支持版本已更改:org.springframework.cloud.netflix.feign.EnableFeignClients(@EnableFeignClients)
Spring Boot 2.0 需要 Java 8 或更高版本。不再支持 Java 6 和 7 了
在 Spring Boot 2.0 中,许多配置属性被重新命名/删除,开发人员需要更新
依赖版本
以下库的最低支持版本已更改:
- Elasticsearch 5.6
- Gradle 4
- Hibernate 5.2
- Jetty 9.4
- Spring Framework 5
- Spring Security 5
- Tomcat 8.5
包结构发送变更
org.springframework.cloud.netflix.feign.EnableFeignClients(@EnableFeignClients)
一、添加帮助转化 工具 包
此工具包可以帮助进行项目升级,打印出详细启动日志,帮助寻找问题点。在升级完成后请移除。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> </dependency> 复制代码
二、开启info health shutdown 端点访问
目前默认已经配置开启
默认只开放了 info、health 两个端点,剩余的需要自己通过配置 management.endpoints.web.exposure.include 属性来加载自己需要
如下:
management.endpoint.shutdown.enabled=true management.endpoints.web.exposure.include=shutdown,env,info,health management.endpoints.web.base-path=/ 复制代码
三、 Redis 的改变
在2.0后 redis 底层已经默认修改为使用的是Lettuce而不是 Jedis 作为 Redis 驱动程序,但是仍然支持 Jedis,如果您愿意,通过排除 io.lettuce:lettuce-core 并添加 redis.clients:jedis ,则可以自由切换依赖项。
SO。。。
配置也发生了改变,基础的ip,port是不变的,变得只是pool中的参数设置,如下
根据使用的是jedis /lettuce变为如下配置:
Lettuce
spring.redis.lettuce.pool.min-idle=5 spring.redis.lettuce.pool.max-active=300 spring.redis.lettuce.pool.max-idle=15 spring.redis.lettuce.pool.max-wait=5000 Jedis
spring.redis.jedis.pool.min-idle=5 spring.redis.jedis.pool.max-active=300 spring.redis.jedis.pool.max-idle=15 spring.redis.jedis.pool.max-wait=5000
四、Kafka
1、kafka 有版本兼容性问题
kafka 2.11.1.0 → kafka-client 1.0.0
kafka 0.11.0→ kafka-client .0.11.0
兼容出错将报
Magic v1 does not support record headers using spring boot 2.0 and kafka client 0.11.x 因 kafka 1.x client 兼容性问题的产生,问题如下: send client consumer client . 0.10.x. 1.x. OK 0.10.x 0.10.x. OK 1.x 1.x OK 1.x 0.10.x NO 1.x 0.11.x OK
五、静态资源被拦截
问题: 访问系统的时候登录样式没有加载
原因: 1.5版本时候META-INF/resources / resources / static / public 都是spring boot 认为静态资源应该放置的位置,会自动去寻找静态资源,而在spring boot 2.0则对静态资源也进行了拦截,当拦截器拦截到请求之后,但controller里并没有对应的请求时,该请求会被当成是对静态资源的请求。此时的handler就是 ResourceHttpRequestHandler,就会抛出上述错误。
解决方案: 解决办法就是,在拦截器那里排除静态资源的请求路径
/**
* 拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatternss("/toLogin","/login","/assets/**","/js/**");
}
复制代码
assets就是我放静态文件的目录
六、全局异常特殊处理
问题: 上一篇提到过的有些错误你可能想特殊对待处理的,现在对应代码标红,找不到对应的类
原因: 新版本后该方法去掉了,需要换成新的方法处理。
解决方案: 旧代码:
@Configuration
public class ContainerConfig {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(){
return new EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
}
};
}
}
复制代码
新代码:
@Configuration
public class ContainerConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage[] errorPages = new ErrorPage[2];
errorPages[0] = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
errorPages[1] = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
registry.addErrorPages(errorPages);
}
}
复制代码
七、拦截器过时
问题: 升级后,WebMvcConfigurerAdapter提示过时。
原因: 升级后的springBoot,使用了java8的特性 default 方法,所以直接实现 WebMvcConfigurer 这个接口即可。
解决方案: 旧:
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter 新:
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer
八、Sleuth Zipkin抽样抓取
以前是
spring.sleuth.sample.percentage=1.0f 现在
spring.sleuth.sampler.probability=1.0f
十、配置数据源
默认连接池已从 Tomcat 切换到 HikariCP。如果您过去 spring.datasource.type 在基于 Tomcat 的应用程序中强制使用 Hikari,现在可以删除重写。
特别是,如果你有这样的设置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
复制代码
|
现在可以这样修改:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
复制代码
十一、端点监控
需要注意的是在 2.x , management.security.* 属性消失, health 和 info 在默认情况下启用(与 health 默认情况下不显示其细节)。为了与这些新的默认值一致, health 已被添加到第一个匹配器。
由于2.0的改动较大,/bus/refresh全部整合到actuador里面了,所以之前1.x的management.security.enabled全部失效,不适用于2.0
所以需要以下配置
management.endpoint.shutdown.enabled=true management.endpoints.web.exposure.include=* management.endpoints.web.base-path=/
十二、默认动态代理策略
Spring Boot 默认使用 CGLIB 做动态代理代理(基于类的动态代理),包括对 AOP 的支持。如果你需要基于接口的动态代理,你需要将 spring.aop.proxy-target-class 设置为 false 。
十三、Web 环境
Spring Boot 应用程序现在可以在更多模式下运行,因此spring.main.web-environment现在不推荐使用,spring.main.web-application-type属性可以提供更多的支持。
如果您想确保应用程序不启动 Web 服务器,则必须将该属性更改为:
spring.main.web-application-type=none
注意:可以通过 SpringApplication 的 setWebApplicationType 方法实现。
十四、Spring Boot 应用程序事件更改
我们已经添加了一个新事件 ApplicationStartedEvent 。 ApplicationStartedEvent 在上下文刷新之后但在任何应用程序和命令行参数被调用之前发送。 ApplicationReadyEvent 在任何应用程序和命令行参数被调用后发送。它表示应用程序已准备好为请求提供服务。
十五、开发 Web 应用程序
嵌入式容器包装结构
为了支持响应式用例,嵌入式容器包结构已经被大幅度的重构。 EmbeddedServletContainer 已被重新命名为, WebServer 并且该 org.springframework.boot.context.embedded 包已被重新定位到 org.springframework.boot.web.embedded 。例如,如果您使用 TomcatEmbeddedServletContainerFactory 回调接口定制嵌入式 Tomcat 容器,则应该使用 TomcatServletWebServerFactory 。
特定于 Servlet 的服务器属性
许多 server.* 属性 ( Servlet 特有的) 已经转移到 server.servlet :
| 旧的属性 | 新的属性 | | --- | --- | | 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 |
十六、Servlet 过滤器
Servlet 过滤器的默认调度程序类型现在是 DipatcherType.REQUEST ; 这使 Spring Boot 的默认值与 Servlet 规范的默认值一致。如果您希望将过滤器映射到其他调度程序类型,请使用 FilterRegistrationBean 注册您的过滤器。
注意:Spring Security 和 Spring Session 过滤器配置 ASYNC , ERROR 以及 REQUEST 调度类型。
十七、使用 SQL 数据库
配置数据源
默认连接池已从 Tomcat 切换到 HikariCP。如果您过去 spring.datasource.type 在基于 Tomcat 的应用程序中强制使用 Hikari,现在可以删除重写。
特别是,如果你有这样的设置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> 复制代码
现在可以这样修改:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 复制代码
十八、Redis
现在使用的是Lettuce而不是 Jedis 作为 Redis 驱动程序 spring-boot-starter-redis 。如果您使用更高级别的Spring Data 构造,则应该发现变化是透明的。我们仍然支持 Jedis,如果您愿意,通过排除 io.lettuce:lettuce-core 并添加 redis.clients:jedis ,则可以自由切换依赖项。
十九、Elasticsearch
Elasticsearch 已经升级到 6.0+。与 Elastic 宣布嵌入式 Elasticsearch 不再受支持一致 ,自动配置 NodeClient 已被删除。 TransportClient 可以通过使用 spring.data.elasticsearch.cluster-nodes 提供要连接的一个或多个节点的地址来自动配置。
二十、Spring Boot Actuator
Spring Boot 2 为 Actuator 带来了重要变化,无论是内部还是面向用户,请查阅参考指南中的 更新部分 和 新的Actuator API文档 。
您应该期望编程模型,配置密钥和某些端点的响应格式发生变化。Actuator 现在在 Spring MVC,Spring WebFlux 和Jersey 上得到本地支持。
构建
Actuator 的代码分为两个模块:现有的 spring-boot-actuator 和新的 spring-boot-actuator-autoconfigure 。如果您使用原始模块( spring-boot-actuator )导入 actuator,请考虑使用 spring-boot-starter-actuator 启动器替代它。
Keys 的配置结构
Endpoints 基础配置 key 已经统一:
| 旧的属性 | 新的属性 | | --- | --- | | `endpoints..*` | `management.endpoint..*` | | `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 |
基本路径
所有 endpoints 默认情况下都已移至 /actuator 。
我们修改了 management.server.servlet.context-path 的含义:它现在是 server.servlet.context-path 的端点管理的等价替代(只有在设置了 management.server.port 时才有效)。另外,您还可以使用新的单独属性 management.endpoints.web.base-path 为管理端点设置基本路径。
例如,如果你设置 management.server.servlet.context-path=/management 和 management.endpoints.web.base-path=/application ,你就可以在下面的路径到达终点健康: /management/application/health 。
如果你想恢复 1.x 的行为(即具有 /health 代替 /actuator/health ),设置以下属性:
management.endpoints.web.base-path=/
审计事件 API 更改
AuditEventRepository 现在有一个包含所有可选参数的单一方法。
Endpoints
要通过 HTTP 使执行器端点可用,它需要同时 启用 和 公开 。默认:
- 无论您的应用程序中是否存在和配置 Spring Security ,只有端点
/health和/info端点都是暴露的。 - 所有端点,但
/shutdown已启用。
您可以按如下方式公开所有端点:
management.endpoints.web.exposure.include=* 您可以通过以下方式显式启用/shutdown端点:
management.endpoint.shutdown.enabled=true 要公开所有(已启用)网络端点除env端点之外:
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env
要公开所有(已启用)网络端点除 env 端点之外:
| 1.x 端点 | 2.0 端点(改变) | | --- | --- | | `/actuator` | 不再可用。 但是,在 `management.endpoints.web.base-path` 的根目录中有一个映射,它提供了到所有暴露端点的链接。 | | `/auditevents` | 该`after`参数不再需要 | | `/autoconfig` | 重命名为 `/conditions` | | `/docs` | 不再可用 | | `/health` | 现在有一个 `management.endpoint.health.show-details` 选项`never`, `always`, `when-authenticated`,而不是依靠 `sensitive` 标志来确定 `health` 端点是否必须显示全部细节。 默认情况下,`/actuator/health`公开并且不显示细节。 | | `/trace` | 重命名为 `/httptrace` |
端点属性已更改如下:
-
endpoints.<id>.enabled已经转移到了management.endpoint.<id>.enabled -
endpoints.<id>.id没有替换(端点的 ID 不再可配置) -
endpoints.<id>.sensitive没有替代品(请参见 执行器安全 ) -
endpoints.<id>.path已经转移到了management.endpoints.web.path-mapping.<id>
端点格式
/actuator/mappings 端点大改变
JSON 格式已经更改为现在正确地包含有关上下文层次结构,多个 DispatcherServlets, 部署的 Servlet 和 Servlet 过滤器的信息。详情请参阅 #9979 。
Actuator API 文档的相关部分提供了一个示例文档。
/actuator/httptrace 端点大改变
响应的结构已经过改进,以反映端点关注跟踪 HTTP 请求 - 响应交换的情况。
二十一、JPA 下findOne 改变
findOne方法是findOne(Example
example) 返回Optional
使用方式:
findOne(Example.of(obj))
二十二、feign 变为openFeign
spring-cloud-starter-feign
变更为
spring-cloud-starter-openfeign
二十三、MongoClient的变化
public class MongoAutoConfiguration {
private final MongoClientOptions options;
private final MongoClientFactory factory;
private MongoClient mongo;
public MongoAutoConfiguration(MongoProperties properties,
ObjectProvider<MongoClientOptions> options, Environment environment) {
this.options = options.getIfAvailable();
this.factory = new MongoClientFactory(properties, environment);
}
@PreDestroy
public void close() {
if (this.mongo != null) {
this.mongo.close();
}
}
@Bean
@ConditionalOnMissingBean
public MongoClient mongo() {
this.mongo = this.factory.createMongoClient(this.options);
return this.mongo;
}
}
复制代码
二十四、Redis Cache Manager 变化
使用redis 做缓存,在1.5.x 和 2.x 下有一些不同之处,因底层变为Lettuce 所以有些构造方法也变了
cloud 1.5.x
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager= new RedisCacheManager(redisTemplate);
cacheManager.setDefaultExpiration(60);
Map<String,Long> expiresMap=new HashMap<>();
expiresMap.put("Product",5L);
cacheManager.setExpires(expiresMap);
return cacheManager;
}
复制代码
cloud 2.x
/**
* 配置CacheManager
*
* @param redisTemplate
* @return
*/
@Bean
@SuppressWarnings("unchecked")
public CacheManager cacheManager(
RedisTemplate<?, ?> redisTemplate) {
// RedisCache需要一个RedisCacheWriter来实现读写Redis
RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(redisTemplate.getConnectionFactory());
// SerializationPair用于Java对象和Redis之间的序列化和反序列化
// Spring Boot默认采用JdkSerializationRedisSerializer的二进制数据序列化方式
// 使用该方式,保存在redis中的值是人类无法阅读的乱码,并且该Serializer要求目标类必须实现Serializable接口
// 本示例中,使用StringRedisSerializer来序列化和反序列化redis的key值
RedisSerializationContext.SerializationPair keySerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(
new StringRedisSerializer());
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisSerializationContext.SerializationPair valueSerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(
jackson2JsonRedisSerializer);
// 构造一个RedisCache的配置对象,设置缓存过期时间和Key、Value的序列化机制
// 这里设置缓存过期时间为1天
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1))
.serializeKeysWith(keySerializationPair).serializeValuesWith(valueSerializationPair);
return RedisCacheManager.builder(writer).cacheDefaults(config).build();
}
复制代码
持续更新。。。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 微前端说明书
- iOS开发CoreText使用说明书
- 给卷积神经网络“修理工”的一份“说明书”
- 你好,SMI: service mesh 互操作性说明书
- 如何组织一个全方位的软件项目工作任务说明书
- Google 发布其非 Linux 系操作系统 Fuchsia 说明书
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Hacking Growth
Sean Ellis、Morgan Brown / Crown Business / 2017-4-25 / USD 29.00
The definitive playbook by the pioneers of Growth Hacking, one of the hottest business methodologies in Silicon Valley and beyond. It seems hard to believe today, but there was a time when Airbnb w......一起来看看 《Hacking Growth》 这本书的介绍吧!