SpringCloud - Spring Cloud 之 Config分布式配置;加解密;配置信息局部刷新;Spring Cloud Bus+RabbitMQ全局刷新(十六)

阅读本文前可先参考

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、 在springcloudserver服务端项目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、 在springcloudconfig客户端项目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、 在springcloudconfig客户端项目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服务端接收到请求后,会将该请求转发给服务总线SpringCloudBus;

3、 SpringCloudBus接到消息后,会通知给所有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、 开启springcloudbus,默认是开启的,也可以省略该配置

#开启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依赖(其他各个微服务用于接收消息,那么也需要有springcloudbus的依赖和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的所有客户端的微服务配置都会动态刷新

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: