简介
在服务中经常会遇到一些易变的参数,例如数据库地址、超时时间等等。这些参数与代码关系耦合度低,但是每改一次就去修改代码中的参数,再去编译部署 显得很蠢,于是就有了配置中心得个实现。目前用的比较多的配置中心有SpringCloudConfig和携程的Apollo。 SpringCloudConfig的好处是和SpringCloud绑定,全家桶(有好处有坏处,你懂的),部署简单;而Apollo部署比较麻烦,它首先要把部署地址写死在apollo-client中编译出来, 然后在配置项目中引用apollo-client……(既然是配置中心,为什么配置中心本身不能做到代码和参数的解耦?!)当然,这都是我一些私货, 事实上apollo功能十分强大,权限功能完整,并且支持多语言,大家都知道携程的技术栈主要是.net。两种各有长短,有兴趣的同学可以去github上看看, 文档说明十分详细。书归正传,接下来主要讲Spring Cloud Config。
启动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);
}
}
Config Server配置
首先说注册中心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
Config客户端配置
客户端配置同样也是两类,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})没有被正确替换,整个程序是会报错了,不管你用了没用默认值,这个是不科学的。
利用WebHook自动刷新
在引用了配置的类上添加@RefreshScope
注解,即可实现自动刷新,还有一点,需要在git中的webhook(例如GitHub,GitLab,Gitee)添加上http://config-ip:port/bus/refresh即可。
流程大致为: git仓库更新 -> 触发webhook-> 触发config的刷新端点-> config通知应用 -> 应用刷新配置内容。
遇到的一个prefer-ip-address问题
在调试过程中发现一个问题,如果在config服务端prefer-ip-address
没有打开,客户端则会找不到config服务端。在网上找了一下关于该配置的解释,
希望对大家有用prefer-ip-address机制解释
config的大致内容就说完了,可能还差配置内容加密,稍微有些繁杂,有机会再补充,急需可以查一下 官方文档,或者别的中文博客