在服务中经常会遇到一些易变的参数,例如数据库地址、超时时间等等。这些参数与代码关系耦合度低,但是每改一次就去修改代码中的参数,再去编译部署 显得很蠢,于是就有了配置中心得个实现。目前用的比较多的配置中心有SpringCloudConfig和携程的 Apollo 。 SpringCloudConfig的好处是和SpringCloud绑定,全家桶(有好处有坏处,你懂的),部署简单;而Apollo部署比较麻烦,它首先要把部署地址写死在apollo-client中编译出来, 然后在配置项目中引用apollo-client……(既然是配置中心,为什么配置中心本身不能做到代码和参数的解耦?!)当然,这都是我一些私货, 事实上apollo功能十分强大,权限功能完整,并且支持多语言,大家都知道携程的技术栈主要是.net。两种各有长短,有兴趣的同学可以去github上看看, 文档说明十分详细。书归正传,接下来主要讲Spring Cloud Config。
Config的配置同样简单:加入依赖 spring-cloud-config-server
,入口类加入注解 @EnableConfigServer
和 @EnableDiscoveryClient
,
前一个注解是使能Config注册中心,后一个则是注册到Eureka上,让其他服务找到该服务。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> 复制代码
@EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class ConfigApplication { public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } } 复制代码
首先说注册中心Eureka相关内容,服务注册地址 eureka.client.serviceUrl.defaultZone
以及自己是谁 spring.application.name
即可。
我在这里加上 prefer-ip-address
的配置,后面会相信说明。
spring: application: name: config-server eureka: instance: prefer-ip-address: true client: serviceUrl: defaultZone: http://localhost:8761/eureka/ 复制代码
然后是就是配置中心相关内容。配置中心一般采用git或svn才作为配置存储端,官方文档上还有以jdbc数据库来存储的,本文以git来说明。
其中 spring.cloud.config.server.uri
是配置文件存放的git地址,为了更直观演示,我在gitee上配置相应的内容。
而 search-paths
则是在该库下的搜索路径,我们这里配置成了 '{application}'
代表不同服务会去git项目下找与项目名( spring.application.name
)对应的文件。
其规则为 {application}-{profile}.yml
例如,服务A中 spring.application.name: fuwu1
,则服务A在启动的时,配置中心则会找 git.uri
下的 fuwu1.yml
文件交给服务A作为配置。
服务A启动时,带有 -Dspring.profiles.active=master
参数时,则会配置中心则会找 git.uri
下的 fuwu1-master.yml
文件交给服务A作为配置。
配置同样需要有权限管理,而配置中心的权限逻辑和git相同(如果你使用git作为存储后端)。
我们可以配置 username
和 password
,如果需要有更高的要求,还可以和git一样,配置公钥私钥。在git上放上公钥,
在 private-key
这里直接填写私钥内容,你甚至可以代码上去掉权限信息,而在部署的服务器中配上私钥。总之,git是怎么配它就是怎么配置。
(git相关内容点击这里)
还有一种配置路径的逻辑大概是这样: uri: git@your-git-address:your-config-repo/{application}.git
,不同的项目配置放在不同的仓库,
这样可以配置不同仓库的权限。如果是这样配置,仓库里的文件命规则是 application-{profile}.yml
。
spring: cloud: config: server: git: uri: git@gitee.com:yangzijing/config.git search-paths: '{application}' #uri: git@your-git-address:your-config-repo/{application}.git #private-key: #username: yourusername #password: yourpassword 复制代码
客户端配置同样也是两类,eureka的配置和config的配置,要注意这些配置要写在bootstrap.yml中。简单来讲bootstrap和application的区别, bootstrap.yml中的配置先启动,application.yml中的配置后启动,而需要动态配置的配置项则写在application.yml中。
Eureka相关的配置不再赘述,主要关心一下config的配置。配置可以有两种,1)指定config的ip,直接在 spring.cloud.config.uri
配上地址即可。
2)通过Eureka找到Config的地址,配置 spring.cloud.config.discovery.enabled=true
和 discovery.service-id
(这里的service-id和config项目的 spring.application.name
名字一致,其默认值是configserver)。
spring: application: name: api-admin cloud: config: #uri: http://ip:port discovery: enabled: true service-id: config-server 复制代码
在api-admin项目中,增加了一个 from
配置,在 application.yml
可写可不写,如果写,还可以添加默认值 from: ${from:hello}
;如果不写,也可以,
同样也可以在java文件中直接引用,例如:
@Value("${from}") private String from; 复制代码
但是要注意的是,使用了配置中心功能后,如果占位符(${xxx})没有被正确替换,整个程序是会报错了,不管你用了没用默认值,这个是不科学的。
在引用了配置的类上添加 @RefreshScope
注解,即可实现自动刷新,还有一点,需要在git中的webhook(例如GitHub,GitLab,Gitee)添加上http://config-ip:port/bus/refresh即可。
流程大致为: git仓库更新 -> 触发webhook-> 触发config的刷新端点-> config通知应用 -> 应用刷新配置内容。
在调试过程中发现一个问题,如果在config服务端 prefer-ip-address
没有打开,客户端则会找不到config服务端。在网上找了一下关于该配置的解释,
希望对大家有用 prefer-ip-address机制解释
config的大致内容就说完了,可能还差配置内容加密,稍微有些繁杂,有机会再补充,急需可以查一下官方文档,或者别的中文博客