Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持。使用Config Server,您可以在中心位置管理所有环境中应用程序的外部属性。客户端和服务器上的概念与SpringEnvironmentPropertySource抽象,因此它们非常适合Spring应用程序,但可以与以任何语言运行的任何应用程序一起使用。在应用程序从开发人员到测试人员再到生产人员的整个部署过程中,您可以管理这些环境之间的配置,并确保应用程序具有它们迁移时所需的一切。服务器存储后端的默认实现使用git,因此它可以轻松支持配置环境的标记版本,并且可以通过各种工具来访问这些内容来管理内容。添加替代实现并将其插入Spring配置很容易。


定位属性源的默认策略是克隆git存储库(位于spring.cloud.config.server.git.uri)并使用它来初始化mini SpringApplication。迷你应用程序Environment用于枚举属性源并将其发布在JSON端点上。


HTTP服务具有以下形式的资源:


/ {application} / {profile} [/ {label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties


消息总线 Spring Cloud Bus

    Spring Cloud Bus将轻量级消息代理程序链接到分布式系统的节点。然后可以将其用于广播状态更改(例如,配置更改)或其他管理指令。该项目包括AMQP和Kafka经纪人实施。另外,在类路径上找到的任何Spring Cloud Stream绑定程序都可以作为传输工具使用。

Spring Cloud Bus将轻量级消息代理程序链接到分布式系统的节点。然后可以使用此代理来广播状态更改(例如配置更改)或其他管理指令。一个关键思想是,总线就像是横向扩展的Spring Boot应用程序的分布式执行器。但是,它也可以用作应用之间的通信渠道。该项目为AMQP经纪人或Kafka提供了入门服务。

服务端:

Spring Cloud Config Server为外部配置(名称-值对或等效的YAML内容)提供了一个基于HTTP资源的API。通过使用@EnableConfigServer注释,服务器可嵌入到Spring Boot应用程序中.

像所有Spring Boot应用程序一样,它默认在端口8080上运行,但是您可以通过各种方式将其切换到更传统的端口8888。最简单的方法(也就是设置默认配置存储库)是通过使用启动它的spring.config.name=configserverconfigserver.yml在Config Server jar中有一个)。另一种是使用您自己的application.properties


 


pom.xml
<!-- 服务端配置依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <!-- 动态刷新 -->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-config-monitor</artifactId>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
            <version>3.0.0</version>
        </dependency>

application.yml
server:
  port: 8888

spring:
  application:
    name: cloud-config-server
management:
  endpoints:
    web:
      exposure:
        include: '*'

bootstrap.yml

spring:
  profiles:
    active: dev
  cloud:
    config:
      server:
        git:
          uri: https://github.com/liuyunxiah/cloud-config-repo.git #使用file:前缀,它应该在本地存储库中工作
#          basedir: target/config
#          search-paths: /
          skip-ssl-validation: true
          timeout: 5
          default-label: main
        accept-empty: true #在未找到应用程序的情况下Server返回HTTP 404状态。默认情况下,此标志设置为true。
 
主启动

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableConfigServer //表明这是一个配置中心的服务端。
@EnableDiscoveryClient
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class);
    }
}

客户端:

要在应用程序中使用这些功能,可以将其构建为依赖于spring-cloud-config-client的Spring Boot应用程序(例如,请参阅config-client或示例应用程序的测试用例)。添加依赖项最方便的方法是使用Spring Boot启动器org.springframework.cloud:spring-cloud-starter-config

pom.xml

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <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>

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bus-amqp -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
            <version>3.0.0</version>
        </dependency>

application.yml

server:
  port: 8083
spring:
  rabbitmq: #  #rabbitmq相关配置:15672是Web管理界面的端口;5672是MQ的访问端口
    host: localhost
    port: 5672
    username: guest
    password: guest
  application:
    name: cloud-config-client

bootstrap.yml

spring:
  cloud:
    config:
      uri: http://localhost:8888 #服务端地址
      label: main
      profile: dev
      name: cloud-config-client
management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动:

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@RestController
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

controller测试:使用curl 请求接口

@RefreshScope //刷新
@RestController
@EnableAutoConfiguration
@RequestMapping("/config/client")
public class ClientController {

    //TODO* curl -X POST http://localhost:8083/actuator/refresh 调用此地址告诉client配置了

    @Value("${test.version}")
    String version;

    @RequestMapping("/")
    public String home(){
        return "Hello World!" + version ;
    }

}


同时创建一个同样的客户端,测试在服务端进行广播通知,两个客户端是否可以同时刷新配置信息 bus : 1.配置在服务器 2.配置在客户端(不采用) 全局刷新: curl -X POST http://localhost:8888/actuator/bus-refresh 差异化处理: curl -X POST http://localhost:8888/actuator/bus-refresh/cloud-config-client:8083