一 Spring Cloud Config的理解
对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护。Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。server提供配置文件的存储、以接口的形式将配置文件的内容提供出去。client通过接口获取数据、并依据此数据初始化自己的应用。
二 Spring Cloud Config的配置部署
2.1 在GitHub上创建config的配置文件仓库,上传配置文件
文件命名规则:
- {application}-{profile}.yml
- {application}-{profile}.properties
application为应用名称 profile指的开发环境(用于区分开发环境,测试环境、生产环境等)
image-20210103152720464.png2.2 搭建服务端程序
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 修改配置文件
server:
port: 10001 #服务端口
spring:
application:
name: config-server #指定服务名
cloud:
config:
server:
git:
uri: https://github.com/yaokuku123/springcloud-config.git # 配置的地址
- 启动类开启配置中心注解
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class,args);
}
}
- 测试配置中心是否可以获得远端数据
http://localhost:10001/product-dev.yml
2.3 修改客户端配置
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 删除原来的application.yml(从配置中心获取)
- 添加boostrap.yml
使用加载级别更高的 bootstrap.yml 文件进行配置。启动应用时会检查此配置文件,在此文件中指定 配置中心的服务地址。会自动的拉取所有应用配置并启用
spring:
cloud:
config:
name: product
profile: dev
label: master
uri: http://localhost:10001
- 手动刷新
但当我们修改GitHub上面的值时,服务端(Config Server) 能实时获取最新的值,但客户端(Config Client)读的是缓存,无法实时获取最新值。SpringCloud已经为我们解决了这个问题,那就是客户端使用post去触发refresh,获取最新数据,需要添加依赖springboot-starter-actuator
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 在需要被刷新的类上添加注解
@RefreshScope
public class ProductController {}
- 在bootstrap中配置开放刷新端口
management:
endpoints:
web:
exposure:
include: refresh
- 使用postman发送post请求到该地址,刷新缓存
http://localhost:9001/actuator/refresh
三 配置中心高可用
- 在配置中心引入eureka的依赖
<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>
- 服务中心的配置文件添加eureka的相关配置
server:
port: 10001 #服务端口
spring:
application:
name: config-server #指定服务名
cloud:
config:
server:
git:
uri: https://github.com/yaokuku123/springcloud-config.git
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
prefer-ip-address: true
- 修改客户端bootstrap的配置文件,将从配置中心直接拉取改为从eureka的微服务中拉取配置
spring:
cloud:
config:
name: product
profile: dev
label: master
#uri: http://localhost:10001
discovery:
enabled: true # 开启从eureka的服务发现
service-id: config-server # 配置中心的服务名称
management:
endpoints:
web:
exposure:
include: refresh
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
prefer-ip-address: true
四 通过消息总线更新配置
4.1 引入说明
由于若每次去手动刷新各微服务较为繁琐,通过引入消息总线的方式,仅刷新配置中心即可。配置中心会将该消息推送到消息总线,各个微服务从消息总线中接收消息,刷新各自的缓存,并从配置中心获取配置,使得更新配置更为便利。
4.2 消息总线整合配置中心
- 引入消息总线的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>
- 配置中心的配置
server:
port: 10001
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/yaokuku123/springcloud-config.git
rabbitmq: # 配置消息中间件
host: 127.0.0.1
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
prefer-ip-address: true
management: # 开放刷新端口
endpoints:
web:
exposure:
include: bus-refresh
- 在客户端需要在github上加入消息中间件的配置
rabbitmq: # 配置消息中间件
host: 127.0.0.1
port: 5672
username: guest
password: guest
- 修改github上的配置,使用post请求配置中心触发消息总线
http://localhost:10001/actuator/bus-refresh
网友评论