SpringCloud 整合 Config 实现服务配置中心高可用,实战讲解!
一、背景介绍
在上一篇文章中,我们简单的介绍了服务配置中心的用途以及相关的玩法。一般来说,在生产环境为了实现服务高可用,通常会以集群的方式来部署服务。
显然在上一篇文章中介绍的玩法,因为服务配置中心的地址是写死的,并不适合在生产环境部署。
实际上,服务配置中心也可以像其它微服务一样注册到服务注册中心(例如:Eureka),客户端再通过 Eureka 获取服务配置中心的文件信息,以此来实现服务的高可用效果。
整个流程,可以用如下图来描述。

下面我们通过具体的例子,结合之前介绍的知识,看看如何利用 Eureka 实现服务配置中心高可用的效果。
二、方案实践
2.1、构建服务端
通过 Spring Cloud Config 来构建高可用的服务配置中心非常的简单,跟之前类似,通过以下三步骤即可快速完成。
2.1.1、创建服务配置中心
根据config-server
复制一个服务消费者工程,命名为eureka-config-server
,并在pom.xml
中引入 Eureka 依赖包,示例如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.1.2、添加配置文件
接着,在application.properties
中服务注册中心以及远程仓库等配置信息,示例如下:
spring.application.name=eureka-config-server
server.port=9020
# 配置git仓库地址
spring.cloud.config.server.git.uri=https://gitee.com/pzblogs/config-demo
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=
# 设置与Eureka Server交互的地址,多个地址可使用【,】分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
2.1.3、创建启动类
然后,创建一个服务启动类并添加@EnableConfigServer
和@EnableDiscoveryClient
。
@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
2.1.4、服务测试
最后,将服务启动,访问服务注册中心http://localhost:8001
,如果看到类似如下的界面,说明服务已经成功注册。

2.2、构建客户端
客户端的搭建同样也类似,只需要三步即可完成。
2.2.1、创建 config 客户端
根据config-client
复制一个服务消费者工程,命名为eureka-config-client
,并在pom.xml
中引入 Eureka 依赖包,示例如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2.2、添加配置文件
接着,创建一个bootstrap.properties
配置文件并添加相关的属性信息,内容如下:
spring.application.name=eureka-config-client
server.port=9022
# 关闭安全认证
management.security.enabled=false
# 开启自动发现服务配置中心
spring.cloud.config.discovery.enabled=true
# 指定服务配置中心实例名称
spring.cloud.config.discovery.serviceId=eureka-config-server
# 对应git仓库中的{application}部分
spring.cloud.config.name=config-client
# 对应git仓库中的{profile}部分
spring.cloud.config.profile=dev
# 对应git仓库中的分支
spring.cloud.config.label=master
# 设置与Eureka Server交互的地址,多个地址可使用【,】分隔
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
此处无需指定服务配置中心的绝对地址,只需要改成服务配置中心的实例名称即可,当有多个目标地址时,会自动轮训的从地址列表中选择一个有效的地址然后发起调用。
因为spring.cloud.config
开头的属性,都需要配置在bootstrap.properties
文件,在此可以将全部的配置属性归纳到一个文件中。
2.2.3、编写配置读取接口
与之前类似,创建一个服务启动类,并编写配置读取接口,以便于测试。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
配置文件变量读取接口。
@RestController
public class HelloController {
@Value("${blog.name}")
private String name;
@RequestMapping("/hello")
public String hello() {
return name;
}
}
2.2.4、服务测试
最后,将客户端服务启动起来。在浏览器上访问http://localhost:9022/hello
,不出意外的话,会得到类似于如下的信息。
gogogo123
2.3、配置动态刷新
在之前的文章中,我们介绍过当修改服务配置中心里的仓库文件内容时,可以通过调用客户端/refresh
接口开启自动更新配置信息。
在此,我们再来试试是否同样适用?
2.3.1、修改仓库文件内容
将 git 仓库中的config-client-dev.properties
文件内容修改成如下。

2.3.2、调用配置更新接口
然后,用 postman 通过 post 调用客户端的/refresh
接口。

2.3.3、重新调用配置读取接口
最后,重新调用客户端配置读取接口,看看效果如何。

可以清晰的看到,客户端成功的动态更新了配置信息。
三、小结
最后总结一下,配置中心也可以通过服务化的方式注册到服务注册中心,以实现服务高可用的效果。
四、参考
作者:潘志的技术笔记
出处:https://pzblog.cn/
版权归作者所有,转载请注明出处
