Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您能够在全部环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,所以它们与Spring应用程序很是契合,但能够与任何以任何语言运行的应用程序一块儿使用。随着应用程序经过从开发人员到测试和生产的部署流程,您能够管理这些环境之间的配置,并肯定应用程序具备迁移时须要运行的一切。服务器存储后端的默认实现使用git,所以它轻松支持标签版本的配置环境,以及能够访问用于管理内容的各类工具。很容易添加替代实现,并使用Spring配置将其插入。html
以上内容为官方直译
1. pom.xml
中添加Maven依赖java
<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. 添加注解支持git
@SpringBootApplication @EnableConfigServer public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
3. application.yml
配置github
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配置中心服务端配置完毕。web
4. 运行概览spring
咱们在远程仓库中添加一个config-client-dev.properties的文件,内容以下:json
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)
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会从新读取配置文件