Spring Cloud Config
简介
在创建项目的时候,为每个项目都配置了一个或者多个配置文件。通过修改配置文件中的参数我们可以创建出不同的服务环境。这存在一些问题:
服务拆分越多,配置项也就越多。某项服务进行了调整,其他服务也需要相应调整。如果配置项都在每个项目的配置文件中配置,那么只要一有改变,就得改配置文件;
当修改了配置之后,必须重启服务,否则配置无法生效。
Spring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置中心服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
功能
集中管理配置文件;
不同环境不同配置,动态化的配置更新,分环境部署;
运行期间动态调整配置,不再需要在每个服务器部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息;
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置;
将配置信息以REST接口的形式暴露。
简单来说Spring Cloud Config实现了在不重启项目的情况下,刷新项目配置的功能。
搭建Config
搭建Spring Cloud项目
搭建以Consul作为注册中心的spring cloud项目
在Gitee上创建配置文件
①创建仓库,命名为cloud-config
②管理仓库,把仓库设为公开的
③新建文件,命名为cloud-dev.yml
④编辑cloud-dev.yml
info: cloud-dev-7071
搭建Config服务端
①创建maven子模块,命名为cloud-config-server7071
②导入依赖
<dependencies> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
③创建application.yml配置文件
server: port: 7071 spring: application: name: cloud-config-server cloud: config: discovery: enabled: true #gitee仓库地址 server: git: uri: https://gitee.com/AGi_R/cloud-config.git search-paths: - cloud-config #gitee仓库分支 label: master #consul注册中心配置 consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name}
④创建启动类,添加@EnableConfigServer注解
@EnableConfigServer @EnableDiscoveryClient @SpringBootApplication public class ConfigServer7071 { public static void main(String[] args) { SpringApplication.run(ConfigServer7071.class, args); } }
⑤启动注册中心,启动Config服务端,访问http://localhost:7071/master/cloud-dev.yml进行测试
创建Config客户端
①创建maven子模块,命名为cloud-config-client7081
②导入依赖
<dependencies> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--spring boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
③创建bootstrap.yml配置文件
server: port: 7081 spring: application: name: cloud-config-client cloud: #注册中心 consul: port: 8500 host: localhost discovery: service-name: ${spring.application.name} config: #config服务端地址 uri: http://localhost:7071 label: master name: cloud #gitee仓库里面的cloud-dev的前部分cloud profile: dev #gitee仓库里面的cloud-dev的后部分dev management: endpoints: web: exposure: include: "*"
④创建启动类
@EnableDiscoveryClient @SpringBootApplication public class ConfigClient7081 { public static void main(String[] args) { SpringApplication.run(ConfigClient7081.class, args); } }
⑤创建controller,添加@RefreshScope注解
@RefreshScope @RestController public class ConfigClientController { @Value("${info}") //获取gitee仓库中cloud-dev.yml里面的info的值 private String info; @GetMapping("/") public String getInfo() { return info; } }
⑥启动注册中心,启动Config服务端,启动Config客户端,访问http://localhost:7081/进行测试
⑦在gitee中修改info的值,进行测试
info: cloud-dev-abcdefg #修改之后的值
⑧这时我们需要向Config客户端发送一个POST请求,刷新info的值
⑨再进行测试
问题
我们要想刷新客户端的配置,需要向客户端发送POST请求curl -X POST "http://clientIp:port/actuator/refresh"。如果客户端过多,我们也需要发送更多的请求,工作量也随着增加,这时我们就需要Spring Cloud Bus了。Spring Cloud Bus可以解决我们所遇到的问题。
Spring Cloud Bus
简介
Spring Cloud Bus是消息总线,用来连接分布式系统的所有节点。它将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
消息总线
消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。
搭建Bus
准备Kafka环境
②解压,放大硬盘根目录下(不然启动时会报错)
③进入conf目录,复制zookeeper和Kafka配置文件到bin目录下的Windows目录下(为了启动时方便操作)
④进入bin目录下的Windows目录下打开cmd,输入zookeeper-server-start.bat zookeeper.properties命令启动zookeeper
⑤进入bin目录下的Windows目录下打开cmd,输入kafka-server-start.bat server.properties命令启动Kafka
创建Bus服务端
①创建maven子模块,命名为cloud-config-server-bus-kafka7072
②导入依赖
<dependencies> <!--bus kafka--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-kafka</artifactId> </dependency> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
③创建application.yml配置文件
server: port: 7072 spring: application: name: cloud-config-server-bus cloud: consul: port: 8500 host: localhost discovery: service-name: ${spring.application.name} config: discovery: enabled: true server: git: uri: https://gitee.com/AGi_R/cloud-config.git search-paths: - cloud-config label: master #kafka消息总线 kafka: bootstrap-servers: - localhost:9092 management: endpoints: web: exposure: include: "*"
④创建启动类,添加@EnableConfigServer注解
@EnableConfigServer @EnableDiscoveryClient @SpringBootApplication public class ConfigBusKafka7072 { public static void main(String[] args) { SpringApplication.run(ConfigBusKafka7072.class, args); } }
创建Bus客户端
①创建maven子模块,命名为cloud-config-client-bus-kafka7091
②导入依赖
<dependencies> <!--bus kafka--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-kafka</artifactId> </dependency> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--spring boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
③创建bootstrap.yml配置文件,添加Kafka配置
server: port: 7091 spring: application: name: cloud-config-client-bus cloud: #注册中心 consul: port: 8500 host: localhost discovery: service-name: ${spring.application.name} config: #config服务端地址 uri: http://localhost:7072 label: master name: cloud #gitee仓库里面的cloud-dev的前部分cloud profile: dev #gitee仓库里面的cloud-dev的后部分dev #Kafka配置 kafka: bootstrap-servers: - localhost:9092 management: endpoints: web: exposure: include: "*"
④创建启动类
@EnableDiscoveryClient @SpringBootApplication public class ConfigClientBus7091 { public static void main(String[] args) { SpringApplication.run(ConfigClientBus7091.class, args); } }
⑤创建controller,添加@RefreshScope注解
@RefreshScope @RestController public class ClientBusController { @Value("${info}") //gitee配置文件中的info的值 private String info; @GetMapping("/") public String getInfo() { return info; } }
测试
①修改gitee中的info的值
info: cloud-dev-7072
②依次启动Consul注册中心,zookeeper,Kafka,Bus服务端,Bus客户端
③再启动一个Bus客户端
④访问http://localhost:7072/master/cloud-dev.yml获取cloud-dev.yml内容
⑤访问http://localhost:7091/和http://localhost:7092/进行测试
⑥修改gitee中info的值
info: cloud-dev-123456xyz
⑦这次只需要向Bus服务端发POST请求curl -X POST "http://serverIp:port/actuator/bus-refresh"即可实现其他节点的配置文件数据刷新
⑧只想修改其中某一个可以使用这个命令curl -X POST "http://serverIp:port/actuator/bus-refresh/clientname:port"