Spring Cloud Config Server 是 Spring Cloud 生态系统中的一个重要组件,它主要用于集中管理应用程序的配置信息。它可以帮助你将配置信息从代码中分离出来,并通过一个中心化的服务来管理和更新配置。
主要功能:
- 集中化配置管理: 将所有应用程序的配置信息存储在一个中心化的服务器上,方便管理和更新。
- 版本控制: 可以对配置信息进行版本控制,方便回滚和追踪配置变更。
- 环境隔离: 可以根据不同的环境(开发、测试、生产)创建不同的配置环境,确保每个环境使用合适的配置。
- 加密和解密: 支持加密配置信息,提高安全性。
- 动态更新: 可以实时更新配置,无需重新启动应用程序。
在这里,我将为大家介绍一下如何搭建一个Spring Cloud Config Server 的服务, 通过采用 GitHub配置存储方式来存储配置信息。应用程序可以通过 Spring Cloud Config Client 来访问 Config Server,获取相应的配置信息。
创建一个Spring Cloud Config Server 应用
我们可以通过使用Spring Initializr( https://start.spring.io/ )来初始化一个应用的框架

- 在Project, Language和Spring Boot区域里面选好配置(e.g. Maven, Java, Maven 3.3.0)
- 在Project Metadata区域里面,填写好应用的信息(e.g. net.ddns.tck0521)
- 在Dependencies里面,点击ADD DEPENDENCIES按钮选择Config Server
最后点击下方的GENERATE按钮把应用的框架代码生成
用你熟悉的IDE工具打开项目

找到Application类,并在里面添加@EnableConfigServer 的标注
创建GitHub配置仓库

用GitHub管理工具/命令行/登录到GitHub 创建一个代码库,里面存放配置文件
- application.properties: 这个文件是全局配置文件, 所有的微服务都可以获取到这个文件里面的配置信息
- generativeai.yaml: 这是微服务的特定配置文件,只有是这个名字的微服务访问Config server才会读取这个配置文件的信息,且这里的配置优先级比application.properties的要高
注意: 配置文件可以是.proeprties或者.yaml文件,纯属个人选择,Spring Cloud Config Server都能识别

点击右上角的个人图标, 在选项中进入Settings页面

在Settings页面里面,点击左边栏最下面的Developer settings

创建token: Personal access tokens –> Tokens(classic) –> Generate new token –> Generate new token (classic)

- 给这个token 一个备注
- 选择过期时间
- 勾选repo, 这样通过这个token访问你仓库的账号就可以读取你仓库里面的文件内容
这里要记一下刚刚生成的token,因为不保存的话以后就看不到了
⚠️: 我用的是classic,因为只有这个可以创建没有过期时间的token,如果希望更高级和精细的访问管理,可以使用另外的Generate new token选项或者Fine-grained personal access tokens
配置GitHub信息到Spring Cloud Config Server

打开application.properties文件,并且把下面的配置放进去
spring.cloud.config.server.git.uri=https://github.com/<YOUR GITHUB ID>/server.config.git
spring.cloud.config.server.git.default-label=master
spring.cloud.config.server.git.username=<YOUR GITHUB ID>
spring.cloud.config.server.git.password=<YOUR GITHUB ACCESS TOKEN>
- 把里面的<YOUR GITHUB ID>和<YOUR GITHUB ACCESS TOKEN>替换成你自己的就可以了
- label可以放master,这样是直接读取master仓库下的配置文件,你也可以给GitHub仓库创建tag,然后让config server读取tag的文件信息
在国内,GitHub的访问比较不稳定,有机场的朋友可以配置下面的代理,让config server用魔法访问GitHub上的配置文件,这样就方便很多
spring.cloud.config.server.git.proxy.http.host=<PROXY HOST>
spring.cloud.config.server.git.proxy.http.port=<PROXY PORT>
加密配置
我们有些配置(e.g.密码)不希望明文的存放到GitHub上,可以使用加密的方式,然后让config server读取的时候进行解密给到微服务,这样就减少了暴露敏感信息的风险, 我这里用的是最简单的RSA加密方式,大家也可以用AES等其他的方法进行加密
keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass mypassword -keypass mykeypassword -validity 3650
通过上面的命令行, 生成一个加密密钥的keystore.jks文件, -validity参数是设定这个密钥的过期时间,我这里放的是3650天

然后把生成的keystore.jks文件,放到config server的资源文件夹里面(e.g. resournces/keystore/keystore.jks)
encrypt.key-store.location=keystore/keystore.jks
encrypt.key-store.password=mypassword
encrypt.key-store.alias=mykey
encrypt.key-store.secret=mypassword
然后加上以上的配置信息到application.properties文件里面, 这里的password和secret对应的是命令好的-storepass, alias对应的是命令行的-alias.
到这里,你就可以启动这个Spring Config Server, 如果能正常启动那就可以了
加密字段

curl localhost:3035/encrypt -d 'value-to-encrypt'
可以通过以上的命令,对配置进行加密, ‘value-to-encrypt’就是要加密的信息

把加密后的字段,放到配置的值里面,记住要加上{cipher}前缀,这样config server就知道这是个加密的配置,需要解密使用

这时候可以通过 http://localhost:3035/generative.ai/default 来验证一下config server是否能正常获取到配置

可以看到服务端也表示成功获取到配置信息

可以看到,刚刚被加密的配置,已经被成功解密等待使用
Config Client设置 -微服务侧
配置完服务端,我们现在来看看怎么让微服务通过config server获取配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>3.3.0</version>
</dependency>
在微服务的pom.xml文件里面,添加以上的依赖
#spring.cloud.config.import-check.enabled=false
spring.config.import=configserver:${CONFIG_SERVER}
#management.server.port=8083
management.endpoints.web.exposure.include=health, refresh
在application.properties文件里面,添加以上的配置, CONFIG_SERVER就是你刚刚创建的Spring Cloud Config Server地址 (e.g.http://localhost:3035), 如果希望配置管理使用别的端口,可以放开management.server.port的配置

来到要使用到配置的类,在最上面添加@RefreshScope的标注, 然后使用@Value标注把配置进行加载
⚠️: 建议所有的配置,都给个默认值,这样就算config server偶尔抽风,也不会影响到应用的正常启动, 我这里是把默认值放到一个static string里面,所以使用了#T这种方式获取到默认值
到这里就准备就绪了,可以启动微服务,并观察是否正常获取到配置
实时获取变更后的配置
当微服务运行中,需要获取最新的配置,我们首选需要先把配置都提交到GitHub上,然后运行下面的POST来让配置更新

我们通过POST调用http://localhost:8081/actuator/refresh 来通知微服务需要更新配置(这里的localhost:8081是你微服务的运行地址)
当你看到返回的有值且明确说明有版本(e.g. version)以及那个配置变更的信息,就说明已经成功更新配置了, 这样你就不需要重启微服务就获取到最新的配置
最后说明一下, 除了用GitHub来存储配置,也可以用本地文件或者数据库等方式,大家可以按照自己的需要进行选择

