Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持。使用Config Server,您可以在中心位置管理所有环境中应用程序的外部属性。客户端和服务器上的概念与SpringEnvironment
和PropertySource
抽象,因此它们非常适合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=configserver
(configserver.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