SpringCloud Config
配置中心:
对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护。微服务的配置管理一般有以下需求:
- 集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。
- 不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。
- 运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等
- 配置修改后可自动更新。如配置内容发生变化,微服务可以自动更新配置
综上所述对于微服务架构而言,一套统一的,通用的管理配置机制是不可缺少的总要组成部分。常见的做法就是通过配置服务器进行管理
Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。
Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,
- server提供配置文件的存储、以接口的形式将配置文件的内容提供出去。
- client通过接口获取数据、并依据此数据初始化自己的应用。
一、 config服务端
- 创建公开码云仓库config-repository
仓库公开,不能私有
上传文件:product-dev.yml 和product-pro.yml
# product-pro.yml
server:
port: 9002 #端口
spring:
application:
name: service-product #服务名称
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
username: root
password: root
jpa:
database: MySQL
show-sql: true
open-in-view: true
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port}
name: itcast-product-2
# product-dev.yml
server:
port: 9001 #端口
spring:
application:
name: service-product #服务名称
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
username: root
password: root
jpa:
database: MySQL
show-sql: true
open-in-view: true
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port}
name: itcast-dev
https://gitee.com/it-lemon/config-repostory/tree/master
- 创建config_server服务模块,导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 启动类
SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class,args);
}
}
- application.yml
server:
port: 10000 #服务端口
spring:
application:
name: config-server #指定服务名
cloud:
config:
server:
git:
uri: https://gitee.com/hxmkd/config-repository.git #git地址
现在访问http://localhost:10000/product-dev.yml 获取到git的文件就成功了。
二、 config客户端
-
修改模块product_service,导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
-
创建resource/bootstrap.yml文件,删除application.yml
spring: cloud: config: name: product #应用名称,需要对应git中配置文件名称的前半部分 profile: dev #开发环境 label: master #git中的分支 uri: http://localhost:10000 #config-server的请求地址
意思是:bootstrap.yml从config-server服务去读取,config-server服务读取git
访问http://localhost:9002/product/1,可以看出bootstrap.yml没有配置数据库等,但项目可以运行。
手动刷新
现在基本配置完成,但当改动git里的文件,项目微服务里配置并不会随之改变,还需进行配置。
-
给product_service服务导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
添加
@RefreshScope
注解@RefreshScope 开启动态刷新
product_service服务什么地方使用git读取的文件内容,就给其类上添加注解
@RestController @RequestMapping("/product") @RefreshScope //开启动态刷新 public class ProductController { @Autowired private ProductService productService; //这里是name属性需要,所以添加@RefreshScope @Value("${name}") private String name; @RequestMapping(value = "/{id}",method = RequestMethod.GET) public Product findById(@PathVariable Long id) { return productService.findById(id); } @RequestMapping(value = "/test") public String test() { return name; } }
git的yml文件里配置了name和值(最后一行),ProductController里有name属性需要随之变动,所以添加@RefreshScope
-
开启动态刷新的请求路径端点
在product_service的bootstrap.yml追加
management: endpoints: web: exposure: include: refresh
-
启动所有微服务项目后,修改git中product-dev.yml z中配置。刷新配置文件需要发送post请求 http://localhost:9002/actuator/refresh (
9002
是product服务端口号,refresh
是config-server服务的bootstrap.yml中配置的路径(management.endpoints.web.exposure.include)),因为是post请求,所以需要使用postman进行发送。
-
发送之后,服务会重新读取配置文件。
-
发送之后,服务会重新读取配置文件。
product的application.yml 配置从eureka读取config-server服务
spring:
cloud:
config:
name: product #应用名称,需要对应git中配置文件名称的前半部分
profile: pro #开发环境
label: master #git中的分支
uri: http://localhost:10000 #config-server的请求地址
#通过注册中心获取config-server配置
discovery:
enabled: true #开启服务发现
service-id: config-server
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port}
management:
endpoints:
web:
exposure:
include: refresh
消息总线
在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。
SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。
Spring Cloud Bus做配置更新的步骤:
- 提交代码触发post请求给bus/refresh
- server端接收到请求并发送给Spring Cloud Bus
- Spring Cloud bus接到消息并通知给其它客户端
- 其它客户端接收到通知,请求Server端获取最新配置
- 全部客户端均获取到最新的配置
- config-server服务和product_service服务 都导入依赖
<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.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
-
config-server服务 application.yml
server: port: 10000 #服务端口 spring: application: name: config-server #指定服务名 cloud: config: server: git: uri: https://gitee.com/hxmkd/config-repository.git #git地址 rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest management: endpoints: web: exposure: include: bus-refresh eureka: client: serviceUrl: defaultZone: http://127.0.0.1:9000/eureka/ instance: preferIpAddress: true instance-id: ${spring.cloud.client.ip-address}:${server.port} #spring.cloud.client.ip-address:获取ip地址
-
git中product-dev.yml添加rabbitmq的配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
-
product服务的bootstrap.yml
spring: cloud: config: name: product #应用名称,需要对应git中配置文件名称的前半部分 profile: pro #开发环境 label: master #git中的分支 uri: http://localhost:10000 #config-server的请求地址 #通过注册中心获取config-server配置 discovery: enabled: true #开启服务发现 service-id: config-server eureka: client: service-url: defaultZone: http://localhost:9000/eureka/ instance: prefer-ip-address: true #使用ip地址注册 instance-id: ${spring.cloud.client.ip-address}:${server.port}
之前是使用postman往product服务发送刷新的请求,
现在是用postman发送post请求给config-server来刷新所有配置文件的请求
http://localhost:10000/actuator/bus-refresh
10000
是config-server服务端口号,bus-refresh
是onfig-server服务的application.yml中配置的路径(management.endpoints.web.exposure.include)
项目源码:https://gitee.com/hxmkd/spring-cloud/tree/master/study_springcloudB_config