微服务之Springcloud 从零基础到入门——Config+Bus篇
一. 背景简介
在微服务中,当系统信息需要变更时,就需要对配置文件进行修改,但是如果在一个大型的微服务系统中,对每一个微服务都进行修改的话那么会十分的繁琐。其次,修改完之后还要重新启动对应的微服务,这样配置才能生效。于是,Spring Cloud Config+Spring Cloud Bus就可以解决这个问题。Spring Cloud Config可以使得每微服务的配置文件都是从外部加载而来,这样只需要修改外部的配置文件就相当于修改了该微服务的配置。其次,仅使用Config也不能实现动态刷新,还是需要重启微服务实现配置的动态更新。而配合Spring Cloud Bus可以实现配置的动态刷新。
二. 基本环境准备
两个eureka注册中心集群环境的准备,可以参考
三. 搭建Config配置中心
创建springboot项目,按照以下步骤进行:
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 修改application.yml配置
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
# 仓库地址
uri: https://github.com/llllllk/springcloud-config.git
# 仓库具体文件
search-paths:
- springcloud-config
username: "github的用户名"
password: "github的密码"
# 默认读取master分支
label: master
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
management:
endpoints:
web:
exposure:
include: bus-refresh
- 修改主启动类
@SpringBootApplication
@EnableConfigServer
public class Config3344Application {
public static void main(String[] args) {
SpringApplication.run(Config3344Application.class,args);
}
}
- 测试是否搭建成功
首先在github账户中创建配置文件,以下为我在springcloud-config仓库中创建的文件目录
接下来通过Config配置中心去拉取服务,在浏览器中输入
http://localhost:3344/master/config-dev.yml去拉取config-dev配置,若出现以下页面则说明配置中心的搭建成功。
其中访问配置文件的格式有如下几种(label代表分支,profile代表环境,application代表文件名):
- /{label}/{application}-{profile}.yml
例:http://localhost:3344/master/config-dev.yml - /{application}-{profile}.yml
例:http://localhost:3344/config-dev.yml,默认从master拉取dev配置,因为本地application.yml中配置的默认分支为master - /{application}/{profile}/{label}/
例:http://localhost:3344/config/dev/master
四. 客户端使用远端的配置
- 引入依赖
依赖和配置中心基本相同,唯一的区别就是将config server端的依赖改为以下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 创建bootstrap.yml配置文件
bootstrap.yml和application.yml文件都是配置文件,但是bootstrap的加载顺序要先于application。
server:
port: 3355
spring:
application:
name: cloud-config-client
cloud:
config: #即读取http://localhost:3344/master/config-dev.yml
label: master
name: config
profile: dev
uri: http://localhost:3344
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
- 测试类
@RestController
public class ReadController {
@Value("${config.info}")
private String info;
@GetMapping(value = "config")
public String getConfig(){
return this.info;
}
}
五. 手动实现动态加载配置
github上面修改了配置文件后必须要手动重启客户端才可以实现更改配置,那么为了解决这个问题,必须要实现自动加载配置。
- Config客户端暴露监控端点
在bootstrap.yml中添加如下配置:
management.endpoints.web.exposure.include="*" - 在需要动态加载的业务类中添加@RefreshScope
@RestController
@RefreshScope
public class ReadController {
@Value("${config.info}")
private String info;
@GetMapping(value = "config")
public String getConfig(){
return this.info;
}
}
- 手动发送post请求到http://localhost:3355(客户端)/actuator/refresh
六. 自动实现动态加载配置
手动配置已经解决了服务需要重启的问题,但仍然存在着一些问题。如果服务的个数很多,那么需要运维去一个个的分发这些post请求,为了解决这个问题,配合Spring Cloud Bus可以实现自动更新配置。Bus整合了JAVA的事件处理机制和消息中间件的功能。可以实现分布式的自动刷新配置,但是只支持RabbitMQ和Kafka。本文用的是RabbitMQ。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- Config服务端暴露监控端点
在application.yml中添加如下配置:
management:
endpoints:
web:
exposure:
include: bus-refresh
- 添加RabbitMQ的配置
因为实现的思想是修改配置文件后先通知配置服务器,让配置服务器去通知配置客户端,所以Config的服务端和客户端都需要添加该配置。我的RabbitMQ是在虚拟机上安装的,所以这边的配置为虚拟机的地址。
spring:
rabbitmq:
host: 192.168.192.129
port: 5672
username: root
password: root
- 测试
启动项目后可以在RabbitMQ的管理界面看到Spring Cloud Bus的通道,表明Config服务端和客户端的消息通道已经建立。
修改了github上的配置文件后,只需要发送http://localhost:3344/actuator/bus-refresh即可实现所有Config客户端的刷新。跟手动刷新相比,配合了Bus后的配置刷新只需要刷新Config服务端即可实现所有配置客户端的刷新。
七. 下一篇介绍
本文讲述了Spring Cloud Config和Spring Cloud Bus的基本使用,用到的消息中间件是RabbitMQ,但是消息中间件还有很多,比如Kafka,RocketMQ等。掌握每一个消息中间件需要花费巨大的时间,那有没有一个组件可以将所有的消息中间件整合呢?那么Spring Cloud Stream可以解决这个问题。下一篇介绍。