Spring Cloud Config 使用总结

源码 https://github.com/ChangMuChen/Spring-Boot/tree/master/studies/sourcecode/spring-cloud-config

一、介绍

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 的方式进行配置。你可以自行更换为同等效果的 .yml 方式。配置信息需要放在 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}.yml
#/{label}/{application}-{profile}.yml
#/{application}-{profile}.properties
#/{label}/{application}-{profile}.properties

例如:http://localhost:8080/testapp/devhttp://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 的方式进行配置。你可以自行更换为同等效果的 .yml 方式。配置信息需要放在 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. 依次启动 configserverservera

Step2. 访问 http://localhost:8081/api/confignamevalue 显示结果为:David

Step3. 修改gitlab 中的 servera-dev.propertiesname=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/

Spring Cloud Config 使用总结的更多相关文章

  1. spring cloud config 入门

    简介 Spring cloud config 分为两部分 server client config-server 配置服务端,服务管理配置信息 config-client 客户端,客户端调用serve ...

  2. Spring Cloud Config

    Spring Cloud Config provides server and client-side support for externalized configuration in a dist ...

  3. Spring Cloud官方文档中文版-Spring Cloud Config(上)

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...

  4. Spring Cloud官方文档中文版-Spring Cloud Config(下)-客户端等

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#_serving_alternative_formats 文中例子我做了 ...

  5. SpringCloud的配置管理:Spring Cloud Config

    演示如何使用ConfigServer提供统一的参数配置服务 ###################################################################一.概 ...

  6. 搭建spring cloud config

    很久没更新了,因为不是专职研究spring cloud,因此更新速度得看工作强度大不大,每天能抽出的时间不多,如果更新太慢了,并且有小伙伴看的话,请见谅了. Spring Cloud简介 Spring ...

  7. Spring Cloud Config - RSA简介以及使用RSA加密配置文件

    简介 RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的.因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以 ...

  8. Spring Cloud Config 分布式配置中心使用教程

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...

  9. 【spring实战第五版遇到的坑】第14章spring.cloud.config.uri和token配置项无效

    本文使用的Spring Boot版本为:2.1.4.RELEASE Spring Cloud版本为:Greenwich.SR1 按照书上的做法,在application.yml中配置配置服务器的地址和 ...

  10. .NET Core微服务之基于Steeltoe使用Spring Cloud Config统一管理配置

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 =>  Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...

随机推荐

  1. Asp.Net MVC 自定义登录过滤器

    1.新建类BaseController用于统一所有控制器继承扩展,方便扩展登录等过滤器.示例如下: using CloudWave.JustBeHere.JBH_H5.Controllers.Attr ...

  2. 解决VSCode终端中文乱码问题

    VSCode终端其实调用的是cmd.exe,所以当这里出现中文乱码的时候要解决的是cmd的编码设置问题. 可以通过chcp命令查看cmd的编码设置,GBK2312的代码页编号是936,然后改成utf- ...

  3. NOIP模拟赛14

    期望得分:0+100+100=200 实际得分:0+100+100=200 T1 [Ahoi2009]fly 飞行棋 http://www.lydsy.com/JudgeOnline/problem. ...

  4. 【POJ】3177 Redundant Paths

    [算法]边双连通分量 [题意&题解]http://blog.csdn.net/geniusluzh/article/details/6619575 (注意第一份代码是错误的) 一些细节: 1. ...

  5. 20155117王震宇 2006-2007-2 《Java程序设计》第二周学习总结

    学号 2006-2007-2 <Java程序设计>第X周学习总结 教材学习内容总结 学习一门语言首先要熟悉基础的语法,注意不要和之前学过的语言知识混淆. java严格区分大小写. 教材学习 ...

  6. 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)

    题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...

  7. ES6基础知识汇总

    1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...

  8. document.write 简介

    document.write 的执行分两种情况: 第一种:dom加载已完成 1. 执行 document.open() (即会清空document) 2. 执行 document.write() 3. ...

  9. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

  10. UVA题解一

    UVA 100 题目描述:经典3n+1问题在\(n \leq 10^6\)已经证明是可行的,现在记\(f[n]\)为从\(n\)开始需要多少步才能到\(1\),给出\(L, R\),问\(f[L], ...