#yyds干货盘点#Spring Cloud Config

归志宁无五亩园,读书本意在元元。这篇文章主要讲述#yyds干货盘点#Spring Cloud Config相关的知识,希望能为你提供帮助。
1、简介传统配置的痛点:

  • 在以前的项目中,我们通过配置文件、操作系统变量、java系统属性等方式配置Java项目;在spring boot爆火之后我们的配置信息都写在application.yml或application.properties文件中,这些配置文件随着项目的打包与应用一起发布;但是当我们需要修改配置文件中的配置信息的时候,需要更新配置文件重新构建、重新发布;如果配置信息配置在操作系统环境变量或者Java系统属性中则需要重启应用。
  • 配置文件中往往有一些敏感信息,比如数据库密码、Redis密码、加密秘钥等信息。这些信息如果直接配置在配置文件中,容易泄露。


针对这些问题,Spring Cloud早期发布了Spring Cloud Config进行集中式配置管理,成功解决了这些问题。
【#yyds干货盘点#Spring Cloud Config】Spring Cloud Config分为Server端和Client端。其中Spring Cloud Config Server是Spring Cloud为指定应用中所有服务提供集中式配置的一个服务,借助Spring Cloud Config Server可以实现集中管理所有应用的配置,避免重复配置。
Spring Cloud Config带来了诸多好处:
  • 配置文件与应用解耦,可以在不重启应用的前提下随时更新发布、回滚配置文件
  • 不同的服务可以共享配置,这在微服务架构系统中非常有用,避免重复配置,大大降低了微服务配置的维护成本
  • 配置与应用隔离之后,敏感信息得到保护


Spring Cloud Config Server通过Git仓库给微服务提供配置属性架构图:





2、正文正文通过Spring Boot项目展开对Spring Cloud Config的探讨。分别会有以下几个方面来展开:
  • Spring Cloud Config + Git手动刷新
  • Spring Cloud Config + Git + WebHook实现自动刷新
  • Spring Cloud Config + Eureka
  • Spring Cloud Bus多端刷新
注意整个项目的搭建是一步一步来的,重复的步骤不会重复出现。


2.1 Spring Cloud Config + 手动刷新
Spring Cloud Config Server
首先需要搭建Spring Cloud Config Server服务,Spring Cloud Config Server服务应该作为一个单独的应用运行和维护,所以我们单独为Spring Cloud Config Server启动一个服务。
依赖:
< dependency>
< groupId> org.springframework.cloud< /groupId>
< artifactId> spring-cloud-config-server< /artifactId>
< /dependency>

我这里选择的Spring Boot版本和Spring Cloud版本如下(版本如果不对应会出现异常,大家可以选择自己需要的对应版本):
< !--spring boot 版本 2.3.4.RELEASE-->
< parent>
< groupId> org.springframework.boot< /groupId>
< artifactId> spring-boot-starter-parent< /artifactId>
< version> 2.3.4.RELEASE< /version>
< /parent>


< !--spring cloud 版本 Hoxton.RELEASE-->
< dependencyManagement>
< dependencies>
< dependency>
< groupId> org.springframework.cloud< /groupId>
< artifactId> spring-cloud-dependencies< /artifactId>
< version> > Hoxton.RELEASE< /version>
< type> pom< /type>
< scope> import< /scope>
< /dependency>
< /dependencies>
< /dependencyManagement>

application.yml配置文件:
下面的配置文件中有几个点比较重要,配置错误将无法获取配置信息
a、default-label,配置文件所在分支,默认值为master

b、search-paths,配置文件所在根目录

c、uri ,仓库地址

## 服务名
spring:
application:
name: config-service
## config git相关配置
cloud:
config:
server:
git:
uri: https://gitee.com/leonplious/config-server-demo.git# 仓库地址
username: xxxx# git 登录账户
password: xxxx# git 登录密码
default-label: master# 分支
search-paths: userservice# 分支下根文件夹名

## 服务端口
server:
port: 28888

编写启动类,启动类上需要添加@EnableConfigServer注解
@SpringBootApplication
@EnableConfigServer
public class Application

public static void main(String[] args)
SpringApplication.run(Application.class, args);



此时我们可以开始测试Spring Cloud Config Server。推送一个配置文件到git仓库中,配置文件的名称为userservice-dev.yml,配置文件的内容如下:
user:
username: "liziba"
password: "hello"

启动Spring Cloud Config Server应用,访问??http://localhost:28888/userservice/dev/master??,可以得到如下信息,证明Spring Cloud Config Server服务启动成功。

"name":"userservice",
"profiles":[
"dev"
],
"label":"master",
"version":"285fd1b9f068cec6def6ba14ab787807a9ffecbc",
"state":null,
"propertySources":[

"name":"https://gitee.com/leonplious/config-server-demo.git/userservice/userservice-dev.yml",
"source":
"user.username":"liziba",
"user.password":"hello"


]

注意Spring Cloud Config 有它的一套访问规则,通过这套规则可以获取相应数据,数据的响应格式略有不同。
/application/profile[/label]
/application-profile.yml
/label/application-profile.yml
/application-profile.properties
/label/application-profile.properties

  • application指应用名称,我们的配置文件名称应该严格按照application-profile.yml命名。
  • profile指环境信息,比如生产环境【prod】、开发环境【dev】、测试环境【test】
  • label指git分支,比如master
我这里使用的是第一种方式,这种方式能够返回详细的配置信息,以及分支信息、profile信息、应用名等,默认的分支名master可以省略。??http://localhost:28888/userservice/dev??等同于??http://localhost:28888/userservice/dev/master??


接下来就可以开始配置Spring Cloud Config Client
新建Spring Cloud Config Client服务,该服务会从Spring Cloud Config Server中获取配置信息。
依赖:
< !--config客户端依赖-->
< dependency>
< groupId> org.springframework.cloud< /groupId>
< artifactId> spring-cloud-starter-config< /artifactId>
< /dependency>
< !--web提供rest访问端点-->
< dependency>
< groupId> org.springframework.boot< /groupId>
< artifactId> spring-boot-starter-web< /artifactId>
< /dependency>
< !--actuator提供端点触发更新-->
< dependency>
< groupId> org.springframework.boot< /groupId>
< artifactId> spring-boot-starter-actuator< /artifactId>
< /dependency>

配置文件bootstrap.yml:
需要注意使用config获取配置信息时,我们需要将config相关配置提取到优先级最高的bootstrap.yml配置文件中,否则不会生效。spring-cloud-starter-config默认会访问8888端口,如果你的Spring Cloud Config Server并未使用该端口启动,可以在bootstrap.yml文件中指定Spring Cloud Config Server端口信息,这样才能覆盖,否则获取不到Spring Cloud Config Server上的配置信息。
我这里的配置文件演示了多环境dev和prod,注意我的config.uri地址时??http://localhost:28888??,并不是??http://localhost:8888??
server:
port: 18888

spring:
application:
name: userservice
profiles:
active: dev

## 加载并暴露所有端点,用于或许刷新端点
management:
endpoints:
refresh:
enabled: true
web:
exposure:
include: *


## 配置中心无法访问,返回此数据
user:
username

    推荐阅读