美文网首页
Spring Cloud F & Spring Boot

Spring Cloud F & Spring Boot

作者: 架构技术专栏 | 来源:发表于2019-01-08 17:56 被阅读16次

    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中的参数设置,如下

    image.png

    根据使用的是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就是我放静态文件的目录

    image.png

    六、全局异常特殊处理

    问题:
    上一篇提到过的有些错误你可能想特殊对待处理的,现在对应代码标红,找不到对应的类

    原因:
    新版本后该方法去掉了,需要换成新的方法处理。

    解决方案:
    旧代码:

    @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.xmanagement.security.*属性消失,healthinfo在默认情况下启用(与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

    注意:可以通过 SpringApplicationsetWebApplicationType 方法实现。

    十四、Spring Boot 应用程序事件更改

    我们已经添加了一个新事件ApplicationStartedEventApplicationStartedEvent在上下文刷新之后但在任何应用程序和命令行参数被调用之前发送。 ApplicationReadyEvent在任何应用程序和命令行参数被调用后发送。它表示应用程序已准备好为请求提供服务。

    十五、开发 Web 应用程序

    嵌入式容器包装结构

    为了支持响应式用例,嵌入式容器包结构已经被大幅度的重构。 EmbeddedServletContainer已被重新命名为,WebServer并且该org.springframework.boot.context.embedded包已被重新定位到org.springframework.boot.web.embedded。例如,如果您使用TomcatEmbeddedServletContainerFactory回调接口定制嵌入式 Tomcat 容器,则应该使用TomcatServletWebServerFactory

    特定于 Servlet 的服务器属性

    许多server.* 属性 ( Servlet 特有的) 已经转移到server.servlet

    <colgroup><col><col></colgroup>

    旧的属性 新的属性
    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 已经统一:

    <colgroup><col><col></colgroup>

    旧的属性 新的属性
    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

    基本路径

    所有 endpoints 默认情况下都已移至 /actuator

    我们修改了 management.server.servlet.context-path 的含义:它现在是 server.servlet.context-path 的端点管理的等价替代(只有在设置了 management.server.port 时才有效)。另外,您还可以使用新的单独属性 management.endpoints.web.base-path 为管理端点设置基本路径。

    例如,如果你设置management.server.servlet.context-path=/managementmanagement.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端点之外:

    <colgroup><col><col></colgroup>

    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<S> example) 返回Optional<S>

    使用方式:

    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();
    }
    

    持续更新。。。


    qrcode_for_gh_13314ac27929_258.jpg

    相关文章

      网友评论

          本文标题:Spring Cloud F & Spring Boot

          本文链接:https://www.haomeiwen.com/subject/wqubrqtx.html