config-server-bus动态更新配置
程序员文章站
2022-06-20 08:51:10
config server用来搭建配置中心,而配置信息一般使用gitlab仓库来存储,这样在你的配置发生改变时,不需要从新打包,而如果使用 的试,则需要从新打一个config server的jar包。 配置的热更新 当你的服务的配置信息发生改变时,一般来说需要从新重启你的服务,配置信息才能生效,这对 ......
config-server用来搭建配置中心,而配置信息一般使用gitlab仓库来存储,这样在你的配置发生改变时,不需要从新打包,而如果使用native
的试,则需要从新打一个config-server的jar包。
配置的热更新
当你的服务的配置信息发生改变时,一般来说需要从新重启你的服务,配置信息才能生效,这对于我们来说是不友好的,所以springcloud有一种消息总线的方式来实现配置信息的热更新,更你的服务不需要从新启动。
项目搭建
eureka-server
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-netflix-eureka-server</artifactid> </dependency>
程序添加注解
@springbootapplication @enableeurekaserver public class eurekaserverapplication { public static void main(string[] args) { springapplication.run(eurekaserverapplication.class, args); } }
yml文件
server: port: 8761 eureka: instance: hostname: localhost client: registerwitheureka: false fetchregistry: false serviceurl: defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/ server: enable-self-preservation: false #自我保护机制 eviction-interval-timer-in-ms: 30000 #及时踢出已关停的节点
config-server
它是配置中心,其它服务如果通过config-server在eureka里的服务名去连接它,这种是以eureka为核心;也可以单独指定,并把eureka的信息写到config-server仓库里,这是以config-server为核心,这两种方式都可以,咱们这个例子是以eureka为核心的,所以config-server也是一个eureka-client.
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-config-server</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid> </dependency>
程序添加注解
@springbootapplication @enablediscoveryclient @enableconfigserver public class configserverapplication { public static void main(string[] args) { springapplication.run(configserverapplication.class, args); } }
添加yml配置
spring: application: name: config-server cloud: config: server: git: uri: git@github.com:***/config_repo.git username: *** password: *** searchpaths: '{profile}' server: port: 8888 eureka: client: service-url: defaultzone: http://localhost:8761/eureka/
config-client-service1
这是我们具体的业务服务,它是一个eureka-client也是一个config-client,它需要把自己注册到eureka里,也需要从config-server拉自己的信息,它需要有配置信息的热更新,所以这需要引用amqp
包和actuator
健康检测包。
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-config</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-bus-amqp</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-actuator</artifactid> </dependency>
程序添加注解
@springbootapplication @enablediscoveryclient @restcontroller @refreshscope public class service1application { @value("${auth.name:empty}") string author; public static void main(string[] args) { springapplication.run(service1application.class, args); } @getmapping("/hello") public string hello() { return author; } }
添加yml文件
spring: cloud: bus.trace.enabled: true #配置动态更新 rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest config: discovery: enabled: true #这块表示启用service-id不用uri service-id: config-server #这块是服务的id label: master profile: svt application: name: service1 server: port: 8081 eureka: instance: prefer-ip-address: true #基于ip地址的注册而不是主机名 client: service-url: defaultzone: http://localhost:8761/eureka logging: level: org: springframework: security: debug management: endpoints: web: exposure: include: bus-refresh
配置更新
当你的config_repo
仓库有文件更新时,你可以调用任意一个服务去触发它,测试的代码如
curl -v -x post "http://localhost:8081/actuator/bus-refresh"
如果成功后,一般会返回httpstatuscode:204
的状态码,当然这种也是手动更新,如果希望动态更新,可以在gitlab或者github上对config_repo项目添加webhook的事件,当有分支合并到dev或者master时,去自动触发bus-refresh。