参考:http://www.ityouknow.com/springcloud
首先,需要明确一个配置中心提供的核心功能应该有什么
- 提供服务端和客户端支持
- 集中管理各环境的配置文件
- 配置文件修改之后,可以快速的生效
- 可以进行版本管理
- 支持大的并发查询
- 支持各种语言
Spring Cloud Config可以完美的支持以上所有的需求。
Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud使用git或svn存放配置文件,本项目以git做为示例。
git配置中心
创建git仓库,存放配置文件
首先,在git中创建一个仓库,存放我们的配置文件,如下:创建了一个仓库叫做:spring-cloud-demo,建立一个文件夹:config-repo,存放两个配置文件:config-dev.properties,config-test.properties
比如,我们经常需要配置我们的数据源,我们配置了两个数据源,生产环境的配置保存在config-dev.properties中:
同样的,在测试环境的配置保存在config-test.properties中。
提供端
添加依赖:
在server端中添加依赖,(当然了,spring-boot的依赖也得要的)
org.springframework.cloud
spring-cloud-config-server
1.4.4.RELEASE
本地配置
首先,添加如下配置:
eureka:
client:
service-url:
defaultZone: http://localhost:9999/eureka/ #将服务注册到那个注册中心去
server:
port: 7777
spring:
application:
name: demo-provider
cloud:
config:
server:
git:
uri: https://github.com/aBreaking/spring-cloud-demo/ #github 仓库地址
search-paths: config-repo #配置中心
username: github账号
password: github密码
启动类注解
在启动类中添加@EnableConfigServer注解
@SpringBootApplication
@EnableConfigServer
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
启动provider
直接在浏览器中输入:http://localhost:7777/config-test.properties或者http://localhost:7777/config-dev.properties
这里的地址为:ip:port/配置文件名。可看到如下:
或者,输入url:http://localhost:7777/config/test
你会看到如下:你的配置中心的信息
即配置中心搭建成功。
使用端
添加依赖
在client端中添加依赖:(当然了,spring-boot的依赖也得要的)
org.springframework.cloud
spring-cloud-starter-config
1.4.4.RELEASE
本地配置
此时,有两种调用方式,一种是直接根据server端的地址(ip:port)来进行配置调用,第二种是server端作为provider注册到注册中心去。很明显,第二种方式的配置要优于第一种,因为server端的地址一旦改变的话,那么client端还得做配置的修改,很麻烦,此外,为了保证保证高可用,可以配置多个server端,如果某一台server挂掉,也不会有影响。
1、直接使用server端
添加一个配置文件:bootstrap.properties。spring初始化时会先加载该配置文件,加载顺序优于applicaiton.properties。添加内容如下:
spring.cloud.config.name=config
spring.cloud.config.profile=test
spring.cloud.config.uri=http://localhost:7777
spring.cloud.config.label=master
同样application.properties中也得有配置:
spring.application.name=demo-consumer
server.port=8888
2、从注册中心中获取
那么,首先,需要将server注册到注册中心去,正常的服务注册操作即可。可参考
https://blog.csdn.net/abreaking2012/article/details/81363718
server端注册到注册中心后,client端bootstrap.properties进行配置:
spring.cloud.config.name=config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=demo-provider #server端的应用名
eureka.client.service-url.defaultZone=http://localhost:9999/eureka/ #注册中心的地址
创建controller
接下来直接使用即可。创建一个controller,如下:
@RestController
public class ClientController {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@RequestMapping("/test")
public String test(){
return "测试环境数据源连接信息:url:"+url+",username:"+username+",password:"+password;
}
}
启动项目
在浏览器中输入:http://localhost:8888/test,即可得到配置中心的配置信息:
动态刷新
一个问题
配置中心就这样能够搭建成功。那么一个问题来了:
我们修改一下配置文件,再push到远程仓库,这时,我们再次访问server端:http://localhost:7777/config-dev.properties,OK,你会发现,server端正常刷新了数据,即跟远程仓库的数据是同步的,没问题。这时,我们再访问下client端:http://localhost:8888/test,发现client端并没有动态刷新数据,还是老的数据。所以,我们还得需要为client端动态刷新。
添加依赖
只需要对client端进行操作即可,添加spring-boot-starter-actuator依赖。
org.springframework.boot
spring-boot-starter-actuator
1.4.4.RELEASE
Controller添加注解
还得需要对client端具体的Controller添加@RefreshScope注解,使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
@RestController
@RefreshScope // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
public class ClientController {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@RequestMapping("/ds")
public String ds(){
return "测试环境数据源连接信息:url:"+url+",username:"+username+",password:"+password;
}</code></pre>
refresh刷新
正常启动项目后,每次配置文件数据修改后,client要想同步,需要以post的方式访问url:http://localhost:8888/refresh这个地址,才能进行同步,如下:
这时,再次访问原client中的地址:http://localhost:8888/test。数据更新了。
后记
如果consumer启动出现如下异常:java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.url' in value "${jdbc.url}"。
确保consumer项目中没有spring-cloud-config-server依赖
发表评论