config在微服务架构中,充当的作用的配置中心。在微服务架构中,因为将不同的模块拆分成了更小的粒度,但是每个模块都必须配置相关的配置文件,使得在管理配置文件的时候非常的不方便。而config的作用就用配置统一的外部远程配置仓库。
因为,配置中心使用的是外部(可以是Git、SVN)。这里我就使用github为例。
服务端配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
server:
port: 3344
spring:
application:
name: cloud-config
cloud:
config:
server:
git:
#uri: git@github.com:ct7cxz/springcloud-config.git #git上的ssh地址
uri: https://github.com/ct7cxz/springcloud-config.git #git上的https地址
search-paths:
- springcloud-config #搜索路径名
private-key: #本地git的私钥
label: master
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
看似是五种,其实只要弄清楚标签作用,其实很好记忆的
以/{label}/{application}-{profile}.yml为例
{label}–指的是git的分支
{application}–指的是配置前缀名
{profile}–具体配置
所以访问的话,就是
客户端配置
客户端默认去寻找服务端从远程仓库获取到的信息
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
server:
port: 3355
spring:
application:
name: cloud-config
cloud:
config:
label: master
name: config
profile: dev
uri: http://localhost:3344/
@RestController
public class ConfigController {
@Value("${config.name}")
private String name;
@RequestMapping(path = "/configName")
public String getName() {
return name;
}
}
config客户端与服务端配置完毕了,但是,如果我修改了一次远程仓库的数据呢
服务端再次访问
看起来没什么问题了,但是当我们试图访问客户端时,问题出现了
客户端并没有将数据更新到最新,只有当服务端重启后,接口数据才会同步到最新。那么有没有什么配置,能够做到让客户端自动刷最新配置呢?
答案是,有
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: "*"
curl -X POST "http://localhost:3355/actuator/refresh"
但是,如果连接服务端的客户端比较多的时候。这种每次要给每个客户端发送一次post请求,让客户端同步到服务端当前最新配置的方法,在小业务应用场景还凑合,但是当客户端数量过大时,显然这种方法是不合适的。怎么解决这个问题,需要使用到下边介绍的Bus
Bus又名服务总线.Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可当作微服务间的通讯通道。
Bus的广播通讯是通过集成RabbitMQ、Kafka消息队列完成的。
使用Bus完成,一次修改,广播通知,处处刷新
为体现一次修改,能修改所有的客户端,这里我将3355端口的配置,copy了一份到新建的3377端口中。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
spring:
rabbitmq:
username: guest
password: guest
port: 5672
host: localhost
#rabbitMq相关配置,暴漏bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
#每个客户端都要完成配置
spring:
rabbitmq:
username: guest
password: guest
port: 5672
host: localhost
curl -X POST "http://localhost:3344/actuator/bus-refresh"
另外,可以通过在uri中追加详细的通知端口号,达到定点通知的目的,例如只通知3355端口号。
curl -X POST "http://localhost:3344/actuator/bus-refresh/cloud-config:3355"