Config 介绍


Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与SpringEnvironmentPropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。可以轻松添加替代实现,并使用Spring配置将其插入

简单来说,就是对于已经发布后的系统,可以通过修改config 的配置进行动态的更新当前系统的配置,无需重启。

关于使用

Spring Cloud Config 的功能并没有国内一些如携程的 Apollo、蚂蚁金服的 disconf、阿里的Nacos等功能强大。笔者目前公司生产使用的正是携程的 Apollo。

这里不再介绍SVN模式,SVN模式在性能及使用方面均不如Git,如果要使用的话,这里推荐开发环境可以使用native模式,其它可以使用Git模式

config服务端


本节代码地址

GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-config-center/fw-cloud-config-native-server


1. 新建模块fw-cloud-config-native-server

1.1 maven 配置

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-config-server</artifactId>
  9. </dependency>
  10. <!--已服务发现的方式可以加,否则不用加此包-->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  14. </dependency>
  15. </dependencies>

1.2 新建启动类

需要加入@EnableConfigServer

  1. @EnableDiscoveryClient //已服务发现的方式可以加,否则不用加此注解
  2. @EnableConfigServer
  3. @SpringBootApplication
  4. public class FwConfigNativeServerApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(FwConfigNativeServerApplication.class, args);
  7. }
  8. }

1.3 配置信息-Git 模式

需要在Git) 或者 Gitee) 新建一个仓库存配置信息,在aplication.yml中配置信息见下部分内容

  1. server:
  2. port: 8778
  3. spring:
  4. application:
  5. name: fw-config-server
  6. cloud:
  7. config:
  8. server:
  9. git:
  10. uri: https://github.com/xuyisu/fw-sping-cloud.git #设置自己的git地址
  11. username: 账号
  12. password: 密码
  13. search-paths: fw-cloud-config-repo #仓库里面如果没有见文件夹,不需要加此配置
  14. eureka:#已服务发现的方式可以加,否则不用加
  15. client:
  16. service-url:
  17. defaultZone: http://localhost:8761/eureka

1.4 在仓库中添加配置信息

1.4.1 fw-test.yml 默认

  1. version: default-1.0

1.4.2 fw-test-dev.yml 开发

  1. version: dev-1.0

1.4.3 fw-test-prod.yml 生产

  1. version: prod-1.0

1.4.4 fw-test-uat.yml uat

  1. version: uat-1.0

1.4.5 fw-register-eureka-client.yml 项目演示

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://localhost:8761/eureka
  5. logging:
  6. level:
  7. com.yisu: debug
  8. version: eureka-2.0

1.5 项目启动

浏览器或Postman 输入地址localhost:8778/fw-test/default
返回结果如下

  1. {
  2. "name": "fw-test",
  3. "profiles": [
  4. "default"
  5. ],
  6. "label": null,
  7. "version": "05bdb20957cdb159ccc8b163010025f66ea0f0c6",
  8. "state": null,
  9. "propertySources": [
  10. {
  11. "name": "https://github.com/xuyisu/fw-sping-cloud.git/fw-cloud-config-repo/fw-test.yml",
  12. "source": {
  13. "version": "default-1.0"
  14. }
  15. }
  16. ]
  17. }

可以看到返回的JSON中应用名是fw-test,环境是默认的,因为请求的是default,分支名label是null,默认是master,version 就是Git CommitId,propertySources里面就是配置的属性

1.6 测试读取配置(其它几个类同)

浏览器或Postman 输入localhost:8778/fw-register-eureka-client.yml
配置中心Spring Cloud Config - 图1

1.7 访问配置信息的URL与配置文件的映射关系如下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

  • {application} 就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件。
  • {profile} 就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml 加以区分,例如application-dev.yml、application-uat.yml、application-prod.yml。
  • {label} 表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。

    1.8 服务端模式

    不管服务端使用什么模式,对客户端均不受影响

2. 配置信息-本地模式

本节代码地址

GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-config-center/fw-cloud-config-native-server


2.1searchLocations的配置描述

  • 绝对路径 如 file:D:/workspace/fw-repo
  • 相对路径:如classpath:/native
  • 默认路径:classpath:/
    在application.yml 中设置本地的配置
    1. spring:
    2. application:
    3. name: fw-config-server
    4. profiles:
    5. active: native
    6. cloud:
    7. config:
    8. server:
    9. native:
    10. searchLocations: classpath:/native
    11. eureka:
    12. client:
    13. service-url:
    14. defaultZone: http://localhost:8761/eureka

    2.2 添加配置文件

    比如我们使用的是相对路径:如classpath:/native,将配置复制过来
    配置中心Spring Cloud Config - 图2
    不管服务端使用什么模式,对客户端均不受影响

    2.3 启动项目

    浏览器或Postman 输入地址localhost:8778/fw-register-eureka-client.yml(其它几个类同)
    配置中心Spring Cloud Config - 图3

    config客户端


本节代码地址

GitHub:https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-config-center/fw-cloud-config-native-client


1.新建模块fw-cloud-config-native-client

1.1maven配置

加入spring-boot-starter-actuator是为了感应服务端变化

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-config</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-actuator</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  17. </dependency>
  18. </dependencies>

1.2设置启动代码

  1. @EnableDiscoveryClient
  2. @SpringBootApplication
  3. public class FwConfigClientApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(FwConfigClientApplication.class, args);
  6. }
  7. }

1.3 加一个controller 用于验证git中配置的值

  1. @RestController
  2. @RefreshScope //开启更新功能
  3. @RequestMapping("api")
  4. @Slf4j
  5. public class TestController {
  6. @Value("${version}")
  7. private String versionValue;
  8. /**
  9. * 返回配置文件中的值
  10. */
  11. @GetMapping("/version")
  12. @ResponseBody
  13. public String returnFormValue(){
  14. log.debug("输出信息{}",versionValue);
  15. return versionValue;
  16. }
  17. }

1.4 添加配置文件(需要用boostrap.yml)

boostrap.yml里的配置优先于application.propertiesapplication.yml加载

  1. server:
  2. port: 8779
  3. spring:
  4. application:
  5. name: fw-register-eureka-client #对应 git 的配置文件名称
  6. cloud:
  7. config:
  8. uri: http://localhost:8778/ #Config Server 地址
  9. profile: dev #环境名
  10. label: master #分支名
  11. management:
  12. endpoints:
  13. web:
  14. exposure:
  15. include: refresh,health,info #暴露监控的点

配置中心的更新配置的坑,2.0前调用/refresh更新配置的方法,不再适用。 现在的方法如下: management.endpoints.web.exposure.include=/actuator/refresh,/actuator/health,/actuator/info

这里我并没有配置eureka信息,在fw-register-eureka-client.yml配置的
日志级别配置的debug模式

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://localhost:8761/eureka
  5. logging:
  6. level:
  7. com.yisu: debug
  8. version: eureka-1.0

1.5 启动客户端(服务端先起)

可以看到,启动的时候先到Config Server 拉去配置信息

  1. c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8778/

1.6 Postman 测试接口

localhost:8779/api/version

  1. 2019-12-17 21:42:10.063 DEBUG 16204 --- [nio-8779-exec-2] c.y.c.client.controller.TestController : 输出信息eureka-2.0

返回结果
eureka-1.0

1.7 eureka 服务信息

配置中心Spring Cloud Config - 图4

1.8 查看服务状态

localhost:8779/actuator/health get请求

  1. {
  2. "status": "UP"
  3. }

1.9 修改版本号提交

修改version的内容,并提交
请求localhost:8779/api/version
返回结果
eureka-1.0
没有变化,需要我们refresh一下
localhost:8779/actuator/refresh post请求
返回结果

  1. [
  2. "config.client.version",
  3. "version"
  4. ]

再次请求localhost:8779/api/version
返回结果
eureka-2.0


注意点

  1. server:
  2. port: 8779
  3. spring:
  4. application:
  5. name: fw-register-eureka-client
  6. cloud:
  7. config:
  8. #uri: http://localhost:8778/ 自己指定的
  9. profile: dev
  10. label: master
  11. discovery: #基于服务发现的
  12. enabled: true
  13. service-id: fw-config-server
  14. management:
  15. endpoints:
  16. web:
  17. exposure:
  18. include: refresh,health,info

3.1 在application.yml中添加配置

  1. spring.cloud.config.allow-override #设置为true,表示开启覆盖的操作

3.2 配置需要覆盖的属性

spring.cloud.config.server.overrides 本身是一个Map集合,可以配置多个,一些公共属性可以通过这种方式配置

  1. spring:
  2. cloud:
  3. config:
  4. server:
  5. overrides:
  6. version: 覆盖优先1.0
  7. allow-override: true

3.3 Postman get请求

localhost:8779/api/version
返回结果
覆盖优先1.0
这说明了设置覆盖的属性的优先级比极高