内容简介:依赖版本以下库的最低支持版本已更改: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 说明书
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与问题求解
韦斯 / 清华大学出版社 / 2011-8 / 89.50元
《数据结构与问题求解(Java语言版)(第4版)》是专为计算机科学专业的两个学期课程而设计的,从介绍什么足数据结构开始,继而对高级数据结构与算法进行分析。《数据结构与问题求解(Java语言版)(第4版)》以独特的方式,清晰地将每种数据结构的接口与其实现分离开来,即将如何使用数据结构与如何对数据结构编程相分离。《数据结构与问题求解(Java语言版)(第4版)》从抽象思维和问题求解的角度出发,为数据结......一起来看看 《数据结构与问题求解》 这本书的介绍吧!