关键词:
阅读本文前可先参考
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、 查看详情