一、SpringCloud Config 基本配置中的问题
在上一章节《SpringCloud config 配置中心介绍与基本配置使用》中我们现实了配置中心的配置集中管理、调用微服务应用接口动态刷新微服务应用配置信息。但是如果我们微服务应用比较多的情况下,当我们修改了多个应用的配置时,则需要我们对每个应用进行请求刷新配置,还是很不方便的,所以这时我们如果可以实现刷新一次,全部应用都配置可以更新生效的话,则会方便很多。另外在上一个章节项目中我们在生产者微服务配置信息中配置 configserver 应用信息时 使用的为固定ip端口信息。如果改节点服务器挂掉,则会直接影响配置该应用的微服务获取配置信息。那么我们改如何解决上面两个问题呢,本章下面则为大家介绍如何对之前的基本配置项目进行升级改造。
二、高可用集群的搭建
配置中心服务端的集群高可用配置思路为,我们将注册中心服务端也注册到Eureka注册中心中。在微服务应用中通过修改其ip端口为服务名称的方式来实现配置中心服务端的高可用。挂掉一台集群,还有其他服务端可以提供服务。改造前后系统结构如下:
1,服务端改造步骤
- 添加Eureka依赖
- 修改服务端配置文件,注册Eureka
- 复制一个子mode工程,进行集群启动,修改config server端口
步骤一、添加Eureka依赖
<?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">
<parent>
<artifactId>SpringCloud</artifactId>
<groupId>com.xiaohui.springCloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config_server</artifactId>
<dependencies>
<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>
</dependencies>
</project>
步骤二、修改服务端配置文件,注册Eureka
server:
port: 9999
spring:
application:
name: config-server #服务名称
cloud:
config:
server:
git:
uri: http://admin@127.0.0.1:10001/r/SpringCloud/config_server.git
username: admin
password: admin
#接入到eureka 注册中心上
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1.com:9000/eureka/
instance:
prefer-ip-address: true #使用ip进行注册
instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册服务ID
步骤三、复制一个工程进行重命名,修改其maven中<artifactId>config_server2</artifactId>,在父工程中添加其子模块。或者重新创建一个一模一样的也可以。并修改其配置文件中端口。
2,生产者微服务config客户端改造:
主需要修改配置文件bootstrap.yml即可。
spring:
cloud:
config:
name: application #对应git上文件名的前部分
profile: prd #git 上配置文件名的后部分
label: master #git分支
#uri: http://127.0.0.1:9999
#通过注册中心获取配置中心 配置
discovery:
enabled: true # 开启服务发现
service-id: config-server #配置中心的服务名称
# 由于不使用直接从固定ip的配置中心节点拿配置,通过eureka获取,则此处需要吧eureka的配置从配置中心中进行提前
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://eureka1.com:9000/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
#开启动态刷新的请求路径端点
management:
endpoints:
web:
exposure:
include: refresh
上面中主要 注释了spring.cloud.config.uri 部分,并使用了spring.cloud.config.discovery 来进行配置其获取配置的服务为从注册中心获取,服务名称为 config-server。
测试:启动Eureka,在分别启动两个配置中心,在启动生产者工程。访问测试地址:http://127.0.0.1:8002/payment/get/name 。可以正常访问。当我们停掉一台config服务端,修改配置,重新刷新生产者工程refresh地址,仍可以更新配置信息。
三、整合消息总线BUS实现配置中心刷新,驱动所有微服务配置获取刷新
解决配置修改需要调用每个微服务接口,我们改造的思路为对配置中心服务端进行发送post请求,然后通过消息总线方式通知每个微服务。微服务在调用配置中心服务端接口获取并更新应用配置和本地缓存。
1,服务端改造
主要步骤:
- 添加消息总线依赖、以及rabbitmq相关依赖
- 修改配置文件 配置刷新配置请求地址、rabbitmq 信息
服务端添加依赖:
<!-- 消息总线 实现刷新配置中心通知所有微服务应用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
配置文件添加配置信息:
spring:
rabbitmq:
addresses: 192.168.17.132
username: guest
password: guest
#通过加入消息总线bus 实现配置中心一处刷新来驱动所有微服务进行获取更新配置
management:
endpoints:
web:
exposure:
include: bus-refresh
2,客户端改造
主要步骤:
- 添加依赖
- 修改配置文件
添加消息总线BUS以及rabbitmq 相关依赖
<!-- 消息总线 实现刷新配置中心通知所有微服务应用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
修改配置文件,删除开启动态刷新的请求路径端点部分。
#开启动态刷新的请求路径端点
management:
endpoints:
web:
exposure:
include: refresh
重启Eureka、config_server、product_service 工程,我们修改配置文件中name值,访问之前链接http://127.0.0.1:8002/payment/get/name。然后使用postman 给config_server服务端发送请求更新配置地址127.0.0.1:9999/actuator/bus-refresh。稍等几秒后我们访问之前链接http://127.0.0.1:8002/payment/get/name。可以看到提交的配置记录已经生效。