https://github.com/ChangMuChen/Spring-Boot
一, 介绍
Spring Cloud Config
Spring Cloud Config 为分布式系统中的外部化配置提供服务器和客户端支持. 使用 Config Server, 您可以在所有环境中管理应用程序的外部属性. 客户端和服务器上的概念映射与 Spring Environment 和 PropertySource 抽象, 因此它们非常适合 Spring 应用程序, 但可以与任何语言运行的任何应用程序一起使用. 当应用程序通过部署管道从开发到测试并进入生产时, 您可以管理这些环境之间的配置, 并确保应用程序具有迁移时需要运行的所有内容. 服务器存储后端的默认实现使用 Git, 因此它可以轻松支持配置环境的标签版本, 以及可用于管理内容的各种工具. 添加替代实现并使用 Spring 配置插入它们很容易.
Spring Cloud Config Server 功能
用于外部配置的 HTTP, 基于资源的 API(名称 值对或等效的 YAML 内容)
加密和解密属性值 (对称或非对称)
使用可轻松嵌入 Spring Boot 应用程序
可以轻松的结合 Eureka 实现高可用
可以轻松的结合 Spring Cloud Bus 实现自动化持续集成
Config Client 功能 (适用于 Spring 应用程序)
绑定到 Config Server 并 Environment 使用远程属性源初始化 Spring
加密和解密属性值 (对称或非对称)
结合 Eureka 实现服务发现
二, 基础使用
1. 搭建服务端
Step1. 新建 Spring Boot 项目 configserver
Step2. 引入主要依赖 spring-cloud-config-server
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-server</artifactId>
- </dependency>
Step3. 引入 spring-boot-starter-web
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
Step4. 主程序添加注释 @EnableConfigServer
- @SpringBootApplication
- @EnableConfigServer
- public class ConfigserverApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConfigserverApplication.class, args);
- }
- }
Step5. 设置属性
这里使用 .properties 的方式进行配置. 你可以自行更换为同等效果的 .YAML 方式. 配置信息需要放在 Bootstrap.properties 中.
1)Git 方式存储配置文件示例
- # 配置文件存放在 Git 的情况
- spring.cloud.config.server.Git.uri=http://172.16.50.98:9999/changdaohang/demo_configs.git
- spring.cloud.config.label=master
- spring.cloud.config.server.Git.search-paths=/**
- spring.cloud.config.server.Git.username=username
- spring.cloud.config.server.Git.password=password
2) 本地存储配置文件
- # 配置文件存放在本地的情况
- # 注意: 文件夹要有访问权限
- spring.profiles.active=native
- spring.cloud.config.server.native.search-locations=C:/IdeaProjets/demo_configs/
Step6. 启动
备注
我们可以直接通过 restful API 的方式进行访问配置. 路由如下:
- # 映射说明如下
- #/{
- application
- }/{
- profile
- }[/{
- label
- }]
- #/{
- application
- }-{
- profile
- }.YAML
- #/{
- label
- }/{
- application
- }-{
- profile
- }.YAML
- #/{
- application
- }-{
- profile
- }.properties
- #/{
- label
- }/{
- application
- }-{
- profile
- }.properties
例如: http://localhost:8080/testapp/dev 或 http://localhost:8080/testapp-dev.properties
对应的配置为 /testapp-dev.properties
当你启动服务端, 你可以在 Mappings 中看到接口开放情况, 部分如下:
2. 业务服务配置
Step1. 新建 Spring Boot 项目 servera
Step2. 引入主要依赖 spring-cloud-starter-config
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-config</artifactId>
- </dependency>
Step3. 引入 spring-boot-starter-Web
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
Step4. 主程序添加注释 @EnableDiscoveryClient
- @SpringBootApplication
- @EnableDiscoveryClient
- public class ServeraApplication {
- public static void main(String[] args) {
- SpringApplication.run(ServeraApplication.class, args);
- }
- }
Step5. 创建配置文件
以 Git 为例:
在 Git 项目中创建 servera-dev.properties 文件, 写入以下示例内容:
name=David
Step6. 配置参数
这里使用 .properties 的方式进行配置. 你可以自行更换为同等效果的 .YAML 方式. 配置信息需要放在 Bootstrap.properties 中.
- spring.application.name=servera
- spring.cloud.config.label=master
- spring.cloud.config.profile=dev
- spring.cloud.config.uri=http://localhost:8071/
注意: 配置中 servera 值与 dev 结合对应到 servera-dev.properties 文件, 并且使用 master 对应到 Git 中的 master 分支. http://localhost:8080/ 为 配置中心服务地址.
Step7. 新建测试 API
新建 TestController 控制器, 代码如下:
- @RestController
- @RequestMapping("api")
- @RefreshScope
- public class TestController {
- @Value("${name}")
- private String confignameValue;
- @GetMapping("/confignamevalue")
- @ResponseBody
- public String returnConfignameValue(){
- return confignameValue;
- }
- }
说明: 其中 @RefreshScope 注解是以后为了自动更新配置用的. 这里可以不加.
通过 @Value("${name}") 注解, 可以对应到 servera-dev.properties 中的 name=David 键值对, 并将值 David 赋给 confignameValue
Step8. 启动程序
访问 http://localhost:8081/API/confignamevalue 显示结果为: David
到这里最基本的使用就完成了
三, 自动更新
这里介绍使用 Monitor + Actuator + Bus + RabbitMQ + GitLab Webhooks 来实现当提交配置后, 通知服务更新配置.
请自行搭建 RabbitMQ 服务环境.
1. 配置中心服务端
Step1. 在 pom.xml 中添加依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-monitor</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bus-amqp</artifactId>
- </dependency>
其中 spring-boot-starter-actuator 整合了一些 /bus-fresh 的接口, 可以用于自主触发刷新服务配置.
spring-cloud-config-monitor 用于对接 GitLab 的 webhooks, 用于触发刷新服务配置.
spring-cloud-starter-bus-amqp 用于对接 rabbitMQ 来广播服务更新事件, 通知相关的服务进行配置更新.
Step2. 配置参数
在 Bootstrap.properties 中加入以下配置:
- # 配置消息中心 - rabbitmq
- spring.rabbitmq.host=192.168.1.119
- spring.rabbitmq.port=5672
- spring.rabbitmq.username=username
- spring.rabbitmq.password=password
- # 开放 actuator 下的所有功能 API(你也可以选择性开放)
- management.endpoints.Web.exposure.include=*
2. 配置客户端
Step1. 在 pom.xml 中添加依赖:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bus-amqp</artifactId>
- </dependency>
其中 spring-boot-starter-actuator 配合服务端, 处理服务端关播发来的配置更新事件. 也可以用于自主触发刷新服务配置.
spring-cloud-starter-bus-amqp 用于接收 rabbitMQ 消息, 通知相关的服务进行配置更新.
Step2. 配置参数
在 Bootstrap.properties 中加入以下配置:
- # 配置消息中心 - rabbitmq
- spring.rabbitmq.host=192.168.1.119
- spring.rabbitmq.port=5672
- spring.rabbitmq.username=username
- spring.rabbitmq.password=password
- # 修复 BUG-GitHub webhook 只能刷新 config server 无法刷新 config client 的问题
- spring.cloud.bus.id=${
- vcap.application.name:${
- spring.application.name:application
- }
- }:${
- vcap.application.instance_index:${
- spring.cloud.config.profile:${
- local.server.port:${
- server.port:0
- }
- }
- }
- }:${
- vcap.application.instance_id:${
- random.value
- }
- }
- # 开放 actuator 下的所有功能 API(你也可以选择性开放)
- management.endpoints.Web.exposure.include=*
Step3. 在控制器中添加 @RefreshScope 注解, 用于实时刷新
- @RestController
- @RequestMapping("api")
- @RefreshScope
- public class TestController {
- ...
- }
3. GitLab Webhooks 配置
Step1. 打开 GitLab 项目主页, 依次进入 [设置] -[集成]
Step2. 添加 WebHook. 设置调用时机和回调地址: http://192.168.1.28:8080/monitor?path=*
Step3. 保存
path 用于定位哪些服务应该更新配置. 这里使用 * 来通知所有服务.
4. 测试
Step1. 依次启动 configserver 和 servera
Step2. 访问 http://localhost:8081/API/confignamevalue 显示结果为: David
Step3. 修改 GitLab 中的 servera-dev.properties 为 name=David Mu 并 Commit
Step4. 访问 http://localhost:8081/API/confignamevalue 显示结果为: David Mu
这种方式服务有可能不会立马刷新配置, 属于正常情况.
四, 高可用
这里介绍使用 Config + Eureka 来实现高可用.
请自行搭建 Eureka 服务环境.
1. 服务端配置
Step1. 引入 spring-cloud-starter-netflix-eureka-client
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
Step2. 配置 Eureka 相关参数
- # 设置程序基础配置
- server.port=8080
- spring.application.name=configserver
- #eureka 配置
- eureka.instance.hostname=127.0.0.1
- eureka.instance.prefer-ip-address=true
- eureka.instance.instance-id=${
- eureka.instance.hostname
- }:${
- server.port
- }
- eureka.client.service-url.defaultZone=http://127.0.0.1:8061/eureka/,http://127.0.0.1:8062/eureka/,http://127.0.0.1:8063/eureka/
Step3. 添加注解 @EnableEurekaClient
- @SpringBootApplication
- @EnableConfigServer
- @EnableEurekaClient
- public class ConfigserverApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConfigserverApplication.class, args);
- }
- }
启动程序, 在 eureka 注册中就可以看到服务已注册.
2. 客户端配置
Step1. 引入 spring-cloud-starter-netflix-eureka-client
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
Step2. 配置 Eureka 相关参数
- # 设置程序基础配置
- server.port=8080
- spring.application.name=configserver
- #eureka 配置
- eureka.instance.hostname=127.0.0.1
- eureka.instance.prefer-ip-address=true
- eureka.instance.instance-id=${
- eureka.instance.hostname
- }:${
- server.port
- }
- eureka.client.service-url.defaultZone=http://127.0.0.1:8061/eureka/,http://127.0.0.1:8062/eureka/,http://127.0.0.1:8063/eureka/
Step3. 修改原来的参数, 如下:
- spring.cloud.config.label=master
- spring.cloud.config.profile=dev
- # 启用服务发现
- spring.cloud.config.discovery.enabled=true
- # 指定配置服务 id
- spring.cloud.config.discovery.service-id=CONFIGSERVER
- # 撤销原来的指向方式
- #spring.cloud.config.uri=http://localhost:8071/
来源: https://www.cnblogs.com/DavidCQ/p/10614904.html