Spring Cloud :7 . SpringCloud Config 配置中心
配置中心以及应用场景
SpringCloud Config是个用于大型的分布式微服务系统当中,这样的系统,微服务往往会成百上千个,也就有意味着有成百上千份配置文件。如果业务要求更改配置文件,再没有配置中心的情况下,需要对每台服务器进行单独更改,耗时耗力并且非常繁琐,因此我们需要配置中心对配置文件进行 统一分类管理、动态更改配置参数,可以有效的提高工作效率。
微服务加载配置文件流程
SpringCloud Config +GitHub单机搭建
通过Config Server 访问git上面的配置文件
- 首先在Github上面建立一个仓库,用于存放配置文件:
- 然后把以前项目的配置文件随便上传到这个仓库中一份(配置文件要改一个有标志性的名字):
- 创建SpringCloud Config 服务,引入依赖 并且在启动类上添加
@EnableConfigServer
注解:
<!--健康监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- config Server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigCenter7777Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigCenter7777Application.class, args);
}
}
- 配置文件:
spring.application.name=spring-cloud-config-center
server.port=7777
#仓库地址
spring.cloud.config.server.git.uri=https://github.com/z8524210/spring-cloud-configtest.git
#读取的分支
spring.cloud.config.label=master
#Eureka交互地址
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
- 访问 (localhost:端口/分支/文件名) http://localhost:7777/master/openFeignProvider-dev.properties 获得配置信息 :
微服务从 Config Server 拉取 Github 上的配置文件
需要注意的是:在github仓库的配置文件名称必须和注册到 Eureka 的服务名称相同,不然会找不到配置文件。
添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
修改配置文件名称 application.properties
(优先级低) —> bootstrap.properties
(优先级高) ,并添加配置:
spring.application.name=open-feign-provider
#直接URL方式查找配置中心,和通过注册中心查找二选一
spring.cloud.config.uri=http://localhost:7777/
#通过注册中心查找,当然,如果通过Eureka,需要把Eureka的注册地址卸载本地
#eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/
#spring.cloud.config.discovery.enabled=true
#spring.cloud.config.discovery.service-id=spring-cloud-config-center
#git上配置文件的环境
spring.cloud.config.profile=dev
#支线名称
spring.cloud.config.label=master
虽然并没有配置启动接口,但是启动后发现启动接口为7002 :
SpringCloud Config 微服务热刷新配置
单机热更新
- 引入依赖:
<!--服务监控,手动热刷新其实是actuator暴露出来的http接口实现刷新的 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置文件:
#actuator暴露所有接口
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
- 在Controller上添加
@RefreshScope
注解:
@RestController
@RefreshScope
public class UesrController implements UserAPI {
...
- 重启这个服务,查看暴露出来的接口:
5. 修改git 配置文件的端口号,然后访问 http://localhost:7902/actuator/refresh ,查看效果:
用post访问接口:
查看端口:
突然发现这里有个坑,配置文件确实改了,访问获取端口号能获取到7903. 但是访问的时候,还是需要7902的端口访问。
集群热更新
自动热更新需要使用 SpringCloud Bus 组件(消息总线),它的底层是MQ,可以把它想象成一个容器,所有的微服务都可以和它建立连接点,当SpringCloud ConfigServer发送消息到 Bus 中时,所有的微服务都会收到通知并重新加载Git上的配置文件。
而 Bus 中的可以集成的 MQ 必须支持 amqp 协议(大致的意思就是统一接口),现在 Bus 中所支持的MQ 只有两种 :rabbiteMQ(应用开发) 和 kafka(中转开发) 。
先使用Docker容器安装 rabbiteMQ
- 首先安装Docker :
yum install docker #安装Docker
- 启动Docker容器,并且设置开机启动
systemctl start docker.service
chkconfig docker on
- 因为下载镜像较慢,所以配置 aliyun 的服务镜像(CentOS7):
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://j2n2rp9s.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docke
- 拉取 rabbiteMQ 的镜像:
docker pull rabbitmq:3-management
- 启动rabbiteMQ 镜像:
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
- 然后访问安装 Docker 容器的
http://IP:15672
:
然后配置微服务
- 给需要集群热部署的添加依赖:
<!--bus默认集成stream ,stream默认集成rabbiteMQ-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 添加对rabbiteMQ的配置:
spring.application.name=open-feign-provider
########### 配置中心 ##############################
#直接URL方式查找配置中心
spring.cloud.config.uri=http://localhost:7777/
#通过注册中心查找
#spring.cloud.config.discovery.enabled=true
#spring.cloud.config.discovery.service-id=a-config
#git上配置文件的环境
spring.cloud.config.profile=dev
#支线名称
spring.cloud.config.label=master
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
##########rabbite配置###########################
spring.rabbitmq.host=192.168.116.141
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
- 访问 http://localhost:7903/actuator 会发现多出一个 bus-refresh 的接口:
4. 修改git上面的配置文件之后,可以使用 refresh 接口单独刷新配置文件,确保没有出现问题再使用 bus-refresh 接口 刷新整个集群的配置文件。
还可以把 Bus 配置到Config Server 上,然后直接访问 Config Server 的 bus-refresh 接口就可以了。同时还可以通过 http://localhost:7903/actuator/bus-refresh/{destination} 来指定服务名称来指定集群更新 。
就到这里吧,说实话 bus 我并没有使用过,只是一直没有间断学习,听网课+查资料 整理出的自己理解,并不保证 正确性,只是希望可以和大家一起学习进步,如果有错误的地方,欢迎大家留言指正。谢谢!