SpringCloud09-Config和Bus
SpringCloud09-Config和Bus
1. Config
- 当微服务数量上升到一定高度的时候,运维成本增加,就需要一个配置中心来做同一个的配置管理。
- 配置中心分为服务端和客户端。服务端可以直接从GitHub中最新的配置信息;客户端则是注册进注册中心中的实例,从配置中心的服务端拉取配置。
- Config官网。https://docs.spring.io/spring-cloud-config/docs/current/reference/html/。
2.创建配置中心服务端cloud-config-center-3344
- pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- yml
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
# git 地址
uri: https://gitee.com/****/springcloud-config
# 搜索的目录,Git具体的仓库,不配置也可以。
#search-paths:
# - springcloud-config
# 具体的分支
label: master
eureka:
instance:
hostname: cloud-config-service
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
- Main
@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class CloudConfigCenter3344Main {
public static void main(String[] args) {
SpringApplication.run(CloudConfigCenter3344Main.class, args);
}
}
- gitee上创建配置文件。
config:
info: "master branch,springcloud-config/config-dev.yml version=1"
- 访问。http://localhost:3344/master/config-dev.yaml。
- 官网推荐的访问规则。/{label}/{application}-{profile}.yml。label,分支;application,可以是对应的应用名称;profile,环境,dev/test/prod。
3.创建配置中心客户端cloud-config-client-3355
- pom.xml不变。
- 要使用bootstrap.yml。
server:
port: 3355
spring:
application:
name: cloud-config-client
cloud:
config:
# 相当与配置 /{label}/{application}-{profile}.yml
# 这里的name相当与 application
label: master
name: config
profile: dev
# 从http://127.0.0.1:3344获取配置信息
uri: http://127.0.0.1:3344
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
fetch-registry: true
register-with-eureka: true
- Main
@EnableEurekaClient
@SpringBootApplication
public class CloudConfigClient3355Main {
public static void main(String[] args) {
SpringApplication.run(CloudConfigClient3355Main.class, args);
}
}
- controller
@Slf4j
@RefreshScope // 配置更新时,刷新配置信息
@RestController
public class ConfigController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String configInfo() {
return configInfo;
}
}
- application.yml和bootstrap.yml的说明。
- applicaiton.yml是用户级的资源配置项。bootstrap.yml是系统级的,优先级更加高。
- bootstrap.yml主要应用于从外部获取配置信息。
4.刷新配置信息
-
如果修改gitee上的配置信息,配置中心的服务端会获取到修改的配置信息,而配置中心的客户端不会获取到最新的配置信息,如果想让配置中心的客户端更新配置信息,就需要重启服务。
-
使用命令让配置中心的客户端刷新配置信息。
- 添加依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
- 暴露刷新配置信息的接口
management: endpoints: web: exposure: # include: "*" # 只是将 actuator的特定端口暴露出去 # refresh 配置改变后的刷新端口 include: info,health,beans,env,refresh
- controller上添加@RefreshScope注解
@Slf4j @RefreshScope // 配置更新时,刷新配置信息 @RestController public class ConfigController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String configInfo() { return configInfo; } }
- 发送刷新的命令。curl -X POST "http://localhost:3355/actuator/refresh"。
5.Bus
- Bus主要解决,配置信息修改后需要通过curl命令刷新每个配置中心客户端的配置的问题。
- Bus官网。https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/。
- Bus基本原理。利用消息中间件,让ConfigClient监听MQ中同一个topic(默认是Spring Cloud Bus),当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。
6.RabbitMQ安装和运行
- Erlang,RabbitMQ的运行环境。下载地址https://www.erlang.org/downloads, 下载完成后直接下一步,直到安装完成。
- RabbitMQ下载地址,https://github.com/rabbitmq/rabbitmq-server/releases。
- RabbitMQ的安装。进入sbin目录,执行rabbitmq-plugins.bat enable rabbitmq_management命令来安装插件,不安装插件,http://localhost:15672/,RabbitMQ的可视化界面无法访问。
- RabbitMQ通过Windows的任务管理直接启动。
- RabbitMQ启动后的访问地址。http://localhost:15672/,账号和密码,guest guest。
7.Bus的两种工作方式。
- 利用消息总线触发一个客户端/bus/refresh,由这个客户端刷新所有客户端的配置。
- 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,有服务端刷新所有客户端的配置。
- 推荐使用第二种。第一,第一中方式打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责;第二,第一种方式破坏了微服务各节点的对等性。
8.创建配置中心客户端cloud-config-client-3366-整合Bus
- pom.xml
<!-- 消息总线 + RabbitMQ -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!-- 配置中心 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- yml
server:
port: 3366
spring:
application:
name: cloud-config-client
cloud:
config:
label: master
name: config
profile: dev
uri: http://127.0.0.1:3344
# rabbitmq的配置信息
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
# 暴露配置刷新接口
management:
endpoints:
web:
exposure:
include: refresh
-
其他配置修改
- Config服务端同步添加spring-cloud-starter-bus-amqp依赖。
- Config服务端yml配置修改,暴露busrefresh接口。
management: endpoints: web: exposure: include: busrefresh
-
通过Bus刷新配置的命令,curl -X POST "http://localhost:3344/actuator/busrefresh"。
-
通知指定微服务刷新的命令。curl -X POST "http://localhost:3344/actuator/busrefresh/cloud-config-client:3355, 通过服务的名称+端口号指定刷新的微服务。
-
Bus客户端启动后,会默认定义RabbitMQ的springCloudBus的topic。