随着线上项目变的日益庞大, 每个项目都散落着各种配置文件, 如果采用分布式的开发模式, 需要的配置文件随着服务增加而不断增多. 某一个基础服务信息变更, 都会引起一系列的更新和重启, 运维苦不堪言也容易出错. 配置中心便是解决此类问题的灵丹妙药.
市面上开源的配置中心有很多, BAT 每家都出过, 360 的 QConf, 淘宝的 diamond, 百度的 disconf 都是解决这类问题. 国外也有很多开源的配置中心 Apache Commons Configuration,owner,cfg4j 等等. 这些开源的软件以及解决方案都很优秀, 但是我最钟爱的却是 Spring Cloud Config, 因为它功能全面强大, 可以无缝的和 spring 体系相结合, 够方便够简单颜值高我喜欢.
Spring Cloud Config
在我们了解 spring cloud config 之前, 我可以想想一个配置中心提供的核心功能应该有什么
提供服务端和客户端支持
集中管理各环境的配置文件
配置文件修改之后, 可以快速的生效
可以进行版本管理
支持大的并发查询
支持各种语言
Spring Cloud Config 可以完美的支持以上所有的需求.
Spring Cloud Config 项目是一个解决分布式系统的配置管理方案. 它包含了 Client 和 Server 两个部分, server 提供配置文件的存储, 以接口的形式将配置文件的内容提供出去, client 通过接口获取数据, 并依据此数据初始化自己的应用. Spring cloud 使用 Git 或 SVN 存放配置文件, 默认情况下使用 Git, 我们先以 Git 为例做一套示例.
首先在 GitHub 上面创建了一个文件夹 config-repo 用来存放配置文件, 为了模拟生产环境, 我们创建以下三个配置文件:
- // 开发环境
- neo-config-dev.properties
- // 测试环境
- neo-config-test.properties
- // 生产环境
- neo-config-pro.properties
每个配置文件中都写一个属性 neo.hello, 属性值分别是 hello im dev/test/pro . 下面我们开始配置 server 端
server 端
1, 添加依赖
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-server</artifactId>
- </dependency>
- </dependencies>
只需要加入 spring-cloud-config-server 包引用既可.
2, 配置文件
- server:
- port: 8001
- spring:
- application:
- name: spring-cloud-config-server
- cloud:
- config:
- server:
- Git:
- uri: https://github.com/ityouknow/spring-cloud-starter/ # 配置 Git 仓库的地址
- search-paths: config-repo # Git 仓库地址下的相对地址, 可以配置多个, 用, 分割.
- username: # Git 仓库的账号
- password: # Git 仓库的密码
Spring Cloud Config 也提供本地存储配置的方式. 我们只需要设置属性 spring.profiles.active=native,Config Server 会默认从应用的 src/main/resource 目录下检索配置文件. 也可以通过 spring.cloud.config.server.native.searchLocations=file:E:/properties / 属性来指定配置文件的位置. 虽然 Spring Cloud Config 提供了这样的功能, 但是为了支持更好的管理内容和版本控制的功能, 还是推荐使用 Git 的方式.
3, 启动类
启动类添加 @EnableConfigServer, 激活对配置中心的支持
- @EnableConfigServer
- @SpringBootApplication
- public class ConfigServerApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConfigServerApplication.class, args);
- }
- }
到此 server 端相关配置已经完成
4, 测试
首先我们先要测试 server 端是否可以读取到 GitHub 上面的配置信息, 直接访问: http://localhost:8001/neo-config/dev
返回信息如下:
- {
- "name": "neo-config",
- "profiles": [
- "dev"
- ],
- "label": null,
- "version": null,
- "state": null,
- "propertySources": [
- {
- "name": "https://github.com/ityouknow/spring-cloud-starter/config-repo/neo-config-dev.properties",
- "source": {
- "neo.hello": "hello im dev"
- }
- }
- ]
- }
上述的返回的信息包含了配置文件的位置, 版本, 配置文件的名称以及配置文件中的具体内容, 说明 server 端已经成功获取了 Git 仓库的配置信息.
如果直接查看配置文件中的配置信息可访问: http://localhost:8001/neo-config-dev.properties , 返回: neo.hello: hello im dev
修改配置文件 neo-config-dev.properties 中配置信息为: neo.hello=hello im dev update, 再次在浏览器访问 http://localhost:8001/neo-config-dev.properties , 返回: neo.hello: hello im dev update. 说明 server 端会自动读取最新提交的内容
仓库中的配置文件会被转换成 web 接口, 访问可以参照以下的规则:
- /{
- application
- }/{
- profile
- }[/{
- label
- }]
- /{
- application
- }-{
- profile
- }.YAML
- /{
- label
- }/{
- application
- }-{
- profile
- }.YAML
- /{
- application
- }-{
- profile
- }.properties
- /{
- label
- }/{
- application
- }-{
- profile
- }.properties
以 neo-config-dev.properties 为例子, 它的 application 是 neo-config,profile 是 dev.client 会根据填写的参数来选择读取对应的配置.
client 端
主要展示如何在业务项目中去获取 server 端的配置信息
1, 添加依赖
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-config</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
引入 spring-boot-starter-Web 包方便 Web 测试
2, 配置文件
需要配置两个配置文件, application.properties 和 Bootstrap.properties
application.properties 如下:
- spring.application.name=spring-cloud-config-client
- server.port=8002
Bootstrap.properties 如下:
- spring.cloud.config.name=neo-config
- spring.cloud.config.profile=dev
- spring.cloud.config.uri=http://localhost:8001/
- spring.cloud.config.label=master
spring.application.name: 对应 {application} 部分
spring.cloud.config.profile: 对应 {profile} 部分
spring.cloud.config.label: 对应 Git 的分支. 如果配置中心使用的是本地存储, 则该参数无用
spring.cloud.config.uri: 配置中心的具体地址
spring.cloud.config.discovery.service-id: 指定配置中心的 service-id, 便于扩展为高可用配置集群.
特别注意: 上面这些与 spring-cloud 相关的属性必须配置在 Bootstrap.properties 中, config 部分内容才能被正确加载. 因为 config 的相关配置会先于 application.properties, 而 Bootstrap.properties 的加载也是先于 application.properties.
3, 启动类
启动类添加 @EnableConfigServer, 激活对配置中心的支持
- @SpringBootApplication
- public class ConfigClientApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConfigClientApplication.class, args);
- }
- }
启动类只需要 @SpringBootApplication 注解就可以
4,Web 测试
使用 @Value 注解来获取 server 端参数的值
- @RestController
- class HelloController {
- @Value("${neo.hello}")
- private String hello;
- @RequestMapping("/hello")
- public String from() {
- return this.hello;
- }
- }//spring cloud 分布式微服务源码请加企鹅求求: 一零三八七七四六二六.
启动项目后访问: http://localhost:8002/hello , 返回: hello im dev update 说明已经正确的从 server 端获取到了参数. 到此一个完整的服务端提供配置服务, 客户端获取配置参数的例子就完成了.
经典介绍
来源: https://www.2cto.com/kf/201905/807518.html