SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)
本文是SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config),若要关注前文,请点击传送门:
前文我们介绍了Zuul路由网关。随着工作中业务的日益增多,需求日益复杂,我们需要拆分许多微服务模块进行业务划分,此时每一个模块都有各自的配置文件,此时如果有1万个模块,我们就有1万个配置文件,所以我们需要一个配置中心进行统一的配置文件管理,SpringCloud为我们提供了Spring Cloud Config进行配置文件管理,下面我也不废话了,懒得再开一篇写单节点Spring Cloud Config的文章了(单节点基本没啥用),直接写Spring Cloud Config集群搭建,架构图如下:
一、Spring Cloud Config简介
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以为所有环境中的应用程序管理其外部属性。它非常适合spring应用,也可以使用在其他语言的应用上。随着应用程序通过从开发到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。
二、准备工作
基于前文中的工程进行搭建,首先启动Eureka集群,端口分别是8759、8760、8761,因为我们要实现Client端配置文件的实时刷新,所以我们需要安装消息中间件,这里我选择rabbitMQ。
rabbitMQ需要配置远程访问端口后才能在程序中连接到(远程访问端口我配置的是5672)。
三、创建config-server工程
新建一个spring-boot工程,取名为:config-server。
3.1 maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.oal.microservice</groupId>
<artifactId>openAiLab</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.oal.microservice</groupId>
<artifactId>config-server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-server</name>
<description>config</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我们需要引入spring-cloud-config-server、spring-cloud-starter-bus-amqp,这里我们引入了Bus消息总线,目的是为了能够通知客户端去MQ中拉取配置文件内容,从而达到更新客户端配置文件的目的,此时的架构图如下:
3.2 配置文件(application.yml)
eureka:
client:
serviceUrl:
defaultZone: http://eureka-serve-01:8761/eureka/
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/AndyWebJava/SpringcloudConfig
searchPaths: respo
label: master
username:
password:
bus:
enabled: true
trace:
enabled: true
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: bus-refresh
注意这里我们需要暴露Bus中的bus-refresh接口,我们需要通过bus进行配置文件的更新。
spring.cloud.config.server.git.uri 是git仓库地址
spring.cloud.config.server.git.searchPaths是配置文件所在路径
spring.cloud.config.server.git.label是配置文件所在分支
spring.cloud.config.server.git.username、spring.cloud.config.server.git.password 如果是共有仓库,填空就可以。
management.endpoints.web.exposure.include= bus-refresh 是让config-server暴露Bus的bus-refresh配置文件刷新端口,这样我们就可以通过Postman去进行客户端配置文件的刷新了,注意,这里我只让config-server来做配置文件的刷新工作。
3.3 启动类(ConfigServerApplication)
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
启动config-server,端口是8888,这样我们的服务端就搭建完成了,高可用的话就启动多个config-server实例(不同端口)注册到Eureka集群上,如图所示:
四、创建config-client工程
新建一个spring-boot工程,取名为:config-client。
4.1 maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.oal.microservice</groupId>
<artifactId>openAiLab</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.oal.microservice</groupId>
<artifactId>config-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-client</name>
<description>config</description>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2 配置文件(bootstrap.yml)
spring:
profiles:
active: ${CONFIG_ACTIVE:dev}
---
spring:
profiles: dev
application:
name: config-client
cloud:
config:
label: master
profile: dev
discovery:
enabled: true
service-id: config-server
bus:
enabled: true
trace:
enabled: true
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
server:
port: 8881
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
注意这里配置文件必须是以bootstrap.*开头,不然无法从服务端获取到配置信息。
spirng.config.config.label 是资源文件所在分支,它默认会去git上找文件名为config-client-dev.*的文件进行读取,这里我们可以通过判断不同的运行环境来读取到不同环境的配置文件。
spring.cloud.config.profile 是运行环境,用来区分开发、测试、生产环境。
spring.cloud.config.discovery.service-id 是配置中心服务端实例名。
spring.profiles.active= ${CONFIG_ACTIVE:dev} ,这种写法会从环境变量中读取key为CONFIG_ACTIVE的值,如果环境变量中找不到就直接去默认值,这里默认值是dev。
4.3 启动类(ConfigClientApplication)
@SpringBootApplication
@EnableDiscoveryClient
@RefreshScope
@RestController
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${foo}")
String foo;
@RequestMapping(value = "/hi")
public String hi() {
return foo;
}
}
我们需要在客户端的启动类上添加@RefreshScope注解,表示当配置改变的时候进行刷新。
启动config-client工程,访问 http://localhost:8881/hi,浏览器返回结果:
foo version 1
然后我们改变git仓库中config-client-dev.properties文件中的foo值为50,访问 http://localhost:8888/actuator查看config-server端暴露出来的对外端口,如图所示:
我们可以看到全局配置文件的刷新地址是
http://localhost:8888/actuator/bus-refresh
我们可以通过指定{destination}来进行局部配置文件刷新,例如 http://localhost:8888/actuator/bus-refresh/config-client*
http://localhost:8888/actuator/bus-refresh/{destination}
然后我们打开Postman通过Post的方式访问 http://localhost:8888/actuator/bus-refresh/config-client*,如图所示:
成功后再浏览器中访问 http://localhost:8881/hi,返回结果
foo version 50
说明已经成功刷新了Client端的配置文件。
高可用的分布式配置中心(Spring Cloud Config)搭建完成。
推荐阅读
-
跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh
-
spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
-
SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)
-
SpringCloud教程 | 第11篇:分布式配置中心(Spring Cloud Config) 客户端实战
-
Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
-
《Spring Cloud 入门》Spring Cloud Config 基于JDBC 的分布式配置中心
-
Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config
-
Spring Cloud 学习系列:(十三)高可用的分布式配置中心——Spring Cloud Config
-
史上最简单的SpringCloud教程 | 分布式配置中心(Spring Cloud Config)(Finchley版本)
-
SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心