什么是Spring Cloud Config
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。很容易添加替代实现,并使用Spring配置将其插入。
以上内容为官方直译
项目集成之配置中心
Config Server
1. pom.xml
中添加Maven依赖
<parent>
<!-- spring boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<!-- netflix-eureka-client-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<!-- Spring Cloud Config Server -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. 添加注解支持
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3. application.yml
配置
spring:
application:
name: config-server
cloud:
config:
enabled: true
server:
git:
# git仓库地址
uri: https://github.com/kevin-yang-work/SpringcloudConfig/
# 配置仓库路径下的相对搜索位置,可以配置多个
search-paths: respo
username:
password:
# svn:
# uri: http://svn.kevin.com/svn/repos/config-repos/
# # 客户端来选择
## default-label: trunk
# username: kevin
# password: kevin
# search-paths: demo
name: config-client
# 仓库的分支,默认为master
label: master
# profiles:
# # 如果使用subversion必须加
# include: subversion
server:
port: 8888
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Git仓库信息根据实际情况进行填写
SVN仓库配置见注释内容,后续做详细说明
这里我们将
配置服务中心
注册到
Eureka
,实现配置服务中心的高可用
至此springCloud配置中心服务端配置完毕。
4. 运行概览
我们在远程仓库中添加一个config-client-dev.properties的文件,内容如下:
foo = foo version 3
其中
config-client
对应到客户端
spring.cloud.config.name
属性,
dev
对应到客户端
spring.cloud.config.profile
属性
启动程序,访问http://localhost:8888/config-…
{"name":"config-client","profiles":["dev"],"label":null,"version":"dd5e327223129b3d6d73a5e87b8cdf0a4031619c","state":null,"propertySources":[{"name":"https://github.com/kevin-yang-work/SpringcloudConfig//respo/config-client-dev.properties","source":{"foo":"foo version 3"}}]}
返回以上结果证明配置服务中心可从远程仓库获取到配置信息
HTTP具有以下格式的资源(作为客户端访问格式说明):
/{name}-{profiles}.properties
/{name}-{profiles}.yml
/{label}/{name}-{profiles}.properties
/{label}/{name}-{profiles}.json
/{name}-{profiles}.json
/{label}/{name}-{profiles}.yml
其中
name
作为
spring.cloud.config.name
注入,
profiles
作为
激活的配置文件
或者
spring.cloud.config.name
注入,
label
是可选的git标签(默认为master)
Config Client
1. pom.xml
引入Maven依赖
<parent>
<!-- spring boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<!-- netflix-eureka-client-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<!-- Spring Cloud Config Client-->
<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>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. application.yml
配置
spring:
application:
name: config-client
cloud:
config:
name: config-client
label: master
profile: dev
# uri: http://localhost:8888/
discovery:
enabled: true
service-id: config-server
server:
port: 8882
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
这里我们将服务端和客户端都注册到
服务注册中心(Eureka)
,那么可以通过
discovery
下的属性进行
配置服务中心
注册,如果不使用服务注册中心,指明
spring.cloud.config.uri
属性为配置服务中心地址即可
至此配置服务中心客户端配置完毕。
4. 运行概览
添加REST接口,从配置中心读取foo属性。
@SpringBootApplication @RestController public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } @Value("${foo}") String foo; @RequestMapping(value = "/hi") public String hi(){ return foo; } }
启动程序访问http://localhost:8881/hi,结果如下:
foo version 3
广播远程应用配置文件的更新
上述实现客户端从配置中心读取配置文件中的属性,但是如果配置文件属性有变更,如何将更改应用到所有的客户端呢?这就是此节需要讲述的内容。我们通过Spring Cloud Bus实现通知配置文件的变更。
1. pom.xml
引入Maven依赖
<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>
<dependency>
<!-- 配置重试机制需要 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<!-- 配置重试机制需要 -->
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
消息服务总线
需要
actuator
的支持,这里还加入了
重试机制
的依赖,如果不需要可以忽略
2. application.yml
的变更
spring:
rabbitmq:
host: rabbitmq.kevin.com
port: 5672
username: rabbitmq
password: rabbitmq
management:
endpoints:
web:
base-path: /
exposure:
include: "*"
这里消息服务总线我们需要rabbitMq的支持,请自行配置rabbitMq环境
同样对于
actuator
,我们在这里暴露所有端口,如应用到生产,请谨慎选择,这里用到的
endpoint
为
bus-refresh
,用于配置文件的更新注意:management.endpoints.web.base-path定义监控根路径,默认为:/actuator
3. 运行概览
启动一个eureka-server,一个confg-server,两个config-client,端口为:
8881
,
8882
访问 http://localhost:8881/hi 浏览器显示:
(或访问 http://localhost:8882/hi)
foo version 3
这时我们去代码仓库将foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/bus-refresh,你会发现config-client会重新读取配置文件
附加说明
- 本文参考资料