用Spring Cloud Config Server实现微服务配置实时获取

用Spring Cloud Config Server实现微服务配置实时获取

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/ )来初始化一个应用的框架

  1. 在Project, Language和Spring Boot区域里面选好配置(e.g. Maven, Java, Maven 3.3.0)
  2. 在Project Metadata区域里面,填写好应用的信息(e.g. net.ddns.tck0521)
  3. 在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)

  1. 给这个token 一个备注
  2. 选择过期时间
  3. 勾选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来存储配置,也可以用本地文件或者数据库等方式,大家可以按照自己的需要进行选择

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注