springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)

MinggeQingchun MinggeQingchun     2022-10-21     186

关键词:

阅读本文前可先参考

​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客

https://blog.csdn.net/MinggeQingchun/article/details/125337347

一、加解密

在Git仓库中明文存储配置信息值,对于某些敏感的配置内容(例如数据库账号、密码等),应该加密存储,config server 对配置内容提供了加密与解密支持

安装JCE

config server的加解密功能依赖Java Cryptography Extension(JCE)

Java 8 JCE下载地址:

JCE Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download

下载得到JCE的zip压缩包并解压,将其中的jar包覆盖到JDK/jre/lib/security目录下;

对称加密

config server提供了加密与解密的接口,分别是

加密接口:http://localhost:8888/encrypt

解密接口:http://localhost:8888/decrypt  (这个接口我们不需要用,解密是config-server自动完成的)

1、在原项目 springcloud-8-service-config 中添加bootstrap.properties配置文件,配置密钥

#设置对称密钥,用这个密钥进行加密和解密
encrypt.key=springcloudconfig123456

2、运行项目,验证加解密:(可通过Postman调用)

加密

解密

3、修改 git仓库的配置文件application-dev.properties,将数据库账户、密码修改,上传到Git仓库,运行springcloud-8-service-config查验

注:

加密的字符串前面一定要带 cipher ,不然会是普通字符串,不会被解密,如下

访问 http://localhost:8888/master/application-dev.properties

得到秘钥原文

二、 配置信息局部刷新

实际应用生产中,不免需要修改远端配置文件,不可能重启客户端服务去获得最新的配置。

Spring Boot 的actuator提供了一个刷新端点/refresh,我们可以访问客户端的 /refresh 端点进行刷新;访问该端点需要使用 POST 方式,需要提前引入依赖 actuator

1、在 spring cloud server 服务端项目 springcloud-8-service-config 添加依赖

<!-- spring-boot-starter-actuator
            SpringBoot的一个监控actuator提供了一个刷新端点/refresh,我们可以访问客户端的 /refresh 端点进行刷新
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2、在spring cloud config 客户端项目 springcloud-8-service-config-consumer 的Controller上添加注解 @RefreshScope 注解,添加这个注解的类会在配置更新时得到处理

RefreshScope是spring cloud提供的一种特殊的scope实现,用来实现配置、实例热加载

@RefreshScope
@RestController
public class GoodsController 
    //产品服务的接口地址(直连)
//    private final String GOODS_SERVICE_URL = "http://localhost:9001/service/goodList";

    //产品服务的接口地址 (注册中心服务名)
//    private final String GOODS_SERVICE_EUREKA_URL = "http://springcloud-3-service-eureka-provider/eureka/service/goodList";

//    @Autowired
//    private RestTemplate restTemplate;

    //feign的远程调用客户端34-SPRINGCLOUD-SERVICE-GOODS
    @Autowired
    private ProviderConfigGoodsRemoteClient goodsRemoteClient;

    /**
     * 读取远程配置中心的配置信息
     */
    @Value("$eureka.client.service-url.defaultZone")
    private String defaultZone;

    /**
     * 读取远程配置中心的配置
     */
    @GetMapping("/springcloud/getConfig")
    public @ResponseBody Object getConfig() 
        return defaultZone;
    

    @GetMapping(value = "/springcloud/eureka/config/goodList")
    public String getGoodList(Model model) 
        //调用远程的一个controller, restful的调用,通过feign这种声明式的远程调用,goodsRemoteClient就像dubbo里面的接口层一样
        List<Goods> goodsList = goodsRemoteClient.goods();
        model.addAttribute("goodsList", goodsList);
        return "goods";
    

3、在spring cloud config 客户端项目 springcloud-8-service-config-consumer 的配置文件加上

#配置 spring boot 监控端点的访问权限
#暴露 endpoints,由于endpoints 中会包含很多敏感信息,除了 health 和 info 两个支持直接访问外,其他的默认不能直接访问
management.endpoints.web.exposure.include=*

4、访问http://localhost:8888/actuator/refresh 进行手动刷新配置

三、Spring Cloud Bus + RabbitMQ 全局刷新

使用/actuator/refresh端点手动刷新配置虽然可以实现刷新,但所有微服务节点的配置都需要手动去刷新,如果微服务非常多,其工作量非常庞大

有没有配置“一次通知,处处生效”的的自动刷新方式呢?Spring Cloud Config 配合 Bus 就可以实现配置的动态刷新。

Spring Cloud Bus 又被称为消息总线,它能够通过轻量级的消息代理(例如 RabbitMQ、Kafka 等)将微服务架构中的各个服务连接起来,实现广播状态更改、事件推送等功能,还可以实现微服务之间的通信功能。可以将Spring Cloud Bus想象成一个分布式的Spring Boot Actuator

目前 Spring Cloud Bus 支持两种消息代理:RabbitMQ 和 Kafka。

Spring Cloud Bus 的基本原理

Spring Cloud Bus 会使用一个轻量级的消息代理来构建一个公共的消息主题 Topic(默认为“springCloudBus”),这个 Topic 中的消息会被所有服务实例监听和消费。当其中的一个服务刷新数据时,Spring Cloud Bus 会把信息保存到 Topic 中,这样监听这个 Topic 的服务就收到消息并自动消费。

Spring Cloud Bus 动态刷新配置的原理

当 Git 仓库中的配置发生了改变,我们只需要向某一个服务(既可以是 Config 服务端,也可以是 Config 客户端)发送一个 POST 请求,Spring Cloud Bus 就可以通过消息代理通知其他服务重新拉取最新配置,以实现配置的动态刷新。

Spring Cloud Bus 动态刷新配置的工作原理,如下图所示:

Spring Cloud Bus 实现配置的动态刷新需要以下步骤:

1、当 Git 仓库中的配置发生改变后,运维人员向 Config 服务端发送一个 POST 请求,请求路径为“/actuator/refresh”

2、Config 服务端接收到请求后,会将该请求转发给服务总线 Spring Cloud Bus。

3、Spring Cloud Bus 接到消息后,会通知给所有 Config 客户端。

4、Config 客户端接收到通知,请求 Config 服务端拉取最新配置。

5、所有 Config 客户端都获取到最新的配置

1、Config server服务端 

1、springcloud-8-service-config 添加依赖

<!-- spring-cloud-starter-bus-amqp -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

<!-- spring-boot-starter-actuator -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、添加 RabbitMQ 配置

#配置rabbitmq
spring.rabbitmq.host=192.168.133.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=root
spring.rabbitmq.password=root

3、开启spring cloud bus,默认是开启的,也可以省略该配置

#开启spring cloud bus,默认是开启的,也可以省略该配置
spring.cloud.bus.enabled=true

4、打开所有的web访问端点

#打开所有的web访问端点
management.endpoints.web.exposure.include=*

2、Config Client客户端配置

1、添加spring-cloud-starter-bus-amqp 依赖(其他各个微服务用于接收消息,那么也需要有spring cloud bus的依赖和RabbitMQ的连接信息)

<!-- spring-cloud-starter-bus-amqp -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2、 配置RabbitMQ

#配置rabbitmq
spring.rabbitmq.host=192.168.133.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=root
spring.rabbitmq.password=root

3、启动  springcloud-8-service-config,post方式请求地址:http://localhost:8888/actuator/bus-refresh

如果返回成功,则RabbitMQ将收到消息,然后微服务会消费消息,config的所有客户端的微服务配置都会动态刷新

springcloud-springcloud之config分布式配置;config注册至eureka;集成security安全认证(十七)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347https://blog.csdn.net/MinggeQingchun/arti 查看详情

springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347一、加解密在Git仓库中明文存储配置信息值,对于某些敏感... 查看详情

springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情

springcloud-springcloud之security服务安全机制(二十)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringSecurity微服务的Rest服务都是基于http请求的,因此很有可能暴露在公网上,任何人都可能调用访问&#... 查看详情

springcloud-springcloud之gateway网关(十三)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中... 查看详情

springcloud-springcloud之zuul和gateway网关(十四)(代码片段)

SpringCloudGateway是SpringCloud的一个子项目。而zuul则是Netflix公司的项目,只是Spring将zuul集成在SpringCloud中使用而已。因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目ZuulZuul是netflix公司的... 查看详情

springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务... 查看详情

springcloud-springcloud之apolloconfig携程阿波罗配置中心(二十一)(代码片段)

由于SpringCloud自带的Config需要配合Bus使用,且不能实时刷新,因此市面上出现了很多开元的配置中心市面上开源的配置中心Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同... 查看详情

springcloud-springcloud根/父项目,开发准备(代码片段)

一、SpringCloud开发项目工程说明在后续的SpringCloud工程项目开发,以及博文中,都要注意此文说明!1、SpringCloud本身并不是一个拿来即可用的框架,它是一套微服务规范,共有两代实现。(1)SpringCloudNet... 查看详情

springcloud-springcloudalibaba之gateway集成sentinel(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Gateway网关(十三)_MinggeQingchun的博客-CSDN博客_spring.cloud.gateway.routes[0]SpringCloud-SpringCloudAlibaba之Sentinel规则持久化(十)_MinggeQingchun的博客-CSDN 查看详情

springcloud-springcloudnetflix之ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具Ribbon是Netflix公司发布的开源组件,其主要功... 查看详情

springcloud-springcloudnetflix之hystrixdashboard仪表盘监控(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125308948https://blog.csdn.net/MinggeQingchun/article/de 查看详情

springcloud-springcloudnetflix之eureka,ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客我们首先来看下不需要注册服务中心,服务消费者直接调用服务提供者一、服务消费者直接访问服务提供者1、服务提... 查看详情

springcloud-springcloudnetflix之zuul网关;路由(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中间的路由被称... 查看详情

springcloud-springcloud简介(代码片段)

1,springcloud简介​springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降... 查看详情

c++11之基于范围的for循环(代码片段)

系列文章C++11之正则表达式(regex_match、regex_search、regex_replace)C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理C+... 查看详情

c++11之追踪返回类型(代码片段)

系列文章C++11之正则表达式(regex_match、regex_search、regex_replace)C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、 查看详情

c++11之委派构造函数(代码片段)

系列文章C++11之正则表达式(regex_match、regex_search、regex_replace)C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、 查看详情