一、快速入门
1.1 项目版本
spring boot:2.2.5.RELEASE
spring cloud:Hoxton.SR3
1.2 项目地址
https://github.com/zhenghaoxiao/spring-cloud-in-action/tree/dev
在搭建配置中心的时候,我们需要注意的一个地方就是,在配置客户端的时候,我们需要使用bootstrap.properties,这样config-server中的配置信息才能被正确的加载。具体搭建过程可以参考下面文章:
https://blog.csdn.net/hao134838/article/details/105339907
二、配置详解
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
上面的url会映射{application}-{profile}.properties对应的配置文件,{label}对应git上不同的分支,默认为master。
所以在上面项目中,我们启动config-server工程后,我们可以访问:
http://localhost:7071/config-client/dev 地址得到下面内容
{ "name":"config-client", "profiles":[ "dev" ], "label":null, "version":"40af4c2ef1ad8ac9a394b8a244396fa303c3e665", "state":null, "propertySources":[ { "name":"https://github.com/zhenghaoxiao/springcloudconfig/rpo/config-client-dev.properties", "source":{ "from":"jack-cloud" } } ] }
客户端配置详和git中存储文件中各个部分的对应关系
spring.application.name:对应配置文件规则中的{application}部分 spring.cloud.config.label:对应配置文件规则中{profile}部分 spring.cloud.config.profile:对应配置文件规则中{label}部分 spring.cloud.config.uri=http:对应配置文件规则中config-server的地址
三、服务端详解
3.1 基础架构
3.2 执行流程
1、应用启动时,根据bootstrap.properties中配置的应用名{application}、环境名{profile}、分支名{label},向Config Server请求获取配置信息。
2、Config Server根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查找配置信息
3、通过 git clone命令将找到的配置信息下载到Config Server的文件系统中。
4、Config Server创建Spring 的ApplicationContext实例,并从Git本地仓库中加载配置文件,最后将这些配置内容读取出来返回给客户端应用。
5、客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例,该配置内容的优先级高于客户端jar包内部的配置内容,所以在jar中重复内容将不再被加载。
Config Server巧妙的通过 git clone将配置信息存于本地,起到了缓存的作用,即使当git服务端无法访问的时候,依然可以读取C onfig Server中缓存内容进行使用。
3.3 仓库 配置
对于仓库配置config默认采用了git。git非常使用存储配置内容,他可以非常方法的利用各种第三方工具对配置内容进行修改,并且它的Hook功能还可以帮助我们实时监控配置内容的修改。同时,它也支持SVN、本地文件系统等方式进行存储配置内容。
下面我们主要介绍一下使用git作为配置仓库的内容
spring.cloud.config.server.git.uri=https://github.com/zhenghaoxiao/springcloudconfig spring.cloud.config.server.git.searchPaths=rpo spring.cloud.config.server.git.username=jack spring.cloud.config.server.git.password=******
如果我们将uri的值通过file://前缀来设置为一个文件地址,那么它将以本地 仓库的方式运行,这样我们就可以脱离git服务端来快速进行调试与开发,比如:
spring.cloud.config.server.git.uri=file://${user.home}/config-repo
其中{user.home}代表当前用户所属目录。
3.3.1 占位符配置URI
{application}、{profile}、{label}这些 占位符除了用于标识配置文件的规则之外,还可以用于Config Server中对git 仓库地址的URI配置,比如,我们可以通过{application}占位符来实现一个 应用对一个一个git仓库目录的配置效果,具体配置如下:
spring.cloud.config.server.git.uri=https://github.com/zhenghaoxiao/springcloudconfig/{application} spring.cloud.config.server.git.searchPaths=rpo spring.cloud.config.server.git.username=jack spring.cloud.config.server.git.password=******
其中,{application}代表了应用名,所以当客户端应用向Config Server发起获取配置的要求时,Config Server会根据客户端的spring.application.name信息来填充{application}占位符以定位配置 资源的存储位置,从而实现根据微服务应用的属性动态获取不同位置的配置。另外,在这些占位符中,{label}参数较为特别,如果git的分支和标签名包含了“/”,那么{label}参数在http的URL中应该使用“(_)”来代替,以避免改变了uri含义,指向到其他的URI资源。
3.3.2 子目录存储
除了支持占位符配置外,config server还可以将配置文件定位到git仓库的子目录中,我们在快速入门项目中的的配置中有一个配置是
spring.cloud.config.server.git.searchPaths=rpo
对于这个参数的配置也支持使用{application}、{profile}、{label}占位符
3.4 属性覆盖
config server还有一个“属性覆盖”的 特性,他可以让开发人员为所有的应用提供配置属性,只需要通过spring.cloud.config.server.overrides.name属性来设置键值对的参数,这些参数会以map的方式 加载到客户端。
spring.cloud.config.server.overrides.name=didi
通过 该属性配置的参数,不会被spring cloud的客户端修改,并且spring cloud中获取配置的信息时,都会取得这些配置信息。
3.5 服务化配置
服务化配置就是将config server作为一个服务单元纳入到服务中心管理之中,然后通过服务发现来访问config server。这样我们服务端和客户端都需要依赖eureka,加入到eurka服务治理体系,在上面项目中应配置了,大家可以参考一下项目中的配置。
spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.service-id=config-server
四、动态刷新配置
4.1 手动刷新配置
手动刷新是指,我们修改了git仓库中的配置内容以后, 客户端获取到的内容并不是最新的, 需要我们手动调用一个接口来触发 刷新。我们需要修改客户端项目:
pom 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
配置文件增加:
management.endpoints.web.exposure.include= health,info,refresh
在需要获得配置文件的类上增加注解:@RefreshScope
@RestController @RefreshScope public class TestController { @Value("${from}") private String from; @GetMapping("/test") public String getFrom() { return from; } }
这样我们修改完远程仓库中的内容手动调用接口:http://localhost:7072/actuator/refresh 即可
4.2 利用git 的webhooks实现自动刷新
1、进入 github 仓库配置页面,选择 Webhooks ,并点击 add webhook;
2、之后填上回调的地址,也就是上面提到的 actuator/refresh 这个地址,但是必须保证这个地址是可以被 github 访问到的。如果是内网就没办法了。这也仅仅是个演示,一般公司内的项目都会有自己的代码管理工具,例如自建的 gitlab,gitlab 也有 webhook 的功能,这样就可以调用到内网的地址了。
五、小结
对于一些简单的项目来说,我们一般都是直接把相关配置放在单独的配置文件中,以 properties 或者 yml 的格式出现,更省事儿的方式是直接放到 application.properties 或 application.yml 中。但是这样的方式有个明显的问题,那就是,当修改了配置之后,必须重启服务,否则配置无法生效。
目前有一些用的比较多的开源的配置中心,比如携程的 Apollo、蚂蚁金服的 disconf 等,对比 Spring Cloud Config,这些配置中心功能更加强大。有兴趣的可以拿来试一试。
在spring cloud 家族中 config也是 足够好用了。。
后续。。。。。
续我们会利用消息总线 Spring Cloud Bus 来实现动态刷新。