欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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。