通常情况下,我们将配置文件放在各自的服务中,这样有个缺点,就是每次修改,要重启服务。如今微服务这么流行的趋势下,一个大项目下会有几十甚至上百上千个微服务组成。这时候就需要一个统一配置管理了。Spring Cloud config 就很好的解决了这一问题。
下图是Config实现分布式配置中心简单原理图:
主要实现需要以下几个步骤:
一、创建git仓库。
新增目录config-repository,在目录下新建配置文件 application-test.yml
my-config: auto refresh
二、安装kafka,zookeeper。
非本文重点内容,略过这一步。不做具体讲解。
三、新建项目config-server,以gradle项目为例。
1. build.gradle 添加依赖
compile "org.springframework.cloud:spring-cloud-config-server"
compile "org.springframework.cloud:spring-cloud-starter-bus-kafka"
2. 主类ServerApplication引入注解
@EnableDiscoveryClient
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
3. 配置文件
配置将刚刚新建的git仓库地址,和kafka和zk信息
spring:
application:
name: config-server
http:
encoding: { charset: UTF-8, enable: true, force: true }
cloud:
config:
server:
git:
#git地址
uri: https://gitee.com/starchi/config-demo.git
#git地址查看目录,可配多个
search-paths: config-repository
stream:
#指定用kafka stream来作为默认消息中间件
default-binder: kafka
kafka:
binder:
brokers: localhost:9092
zkNodes: localhost:2181,localhost:2182,localhost:2183
4. 启动config-server,访问 http://localhost:8888/my-config/test/dev
{"name":"my-config","profiles":["test"],"label":"dev","version":"bd9049126a818271dc04bb1da45bd37309f4d06f","state":null,"propertySources":[{"name":"https://gitee.com/starchi/config-demo.git/config-repository/application-test.yml","source":{"my-config":"auto refresh"}}]}
可以看到config-server已经可以从git上读取到配置文件了。可以通过如下表中的方式访问git上的资源:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
四、新建项目config-client
1. build.gradle 添加依赖
compile 'org.springframework.cloud:spring-cloud-config-client'
compile 'org.springframework.cloud:spring-cloud-starter-bus-kafka'
2. 主类ClientApplication引入注解
@EnableDiscoveryClient
@SpringBootApplication
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
3. 配置 bootstrap.yml 文件(bootstrap先于application加载)
spring:
application:
name: config-client-demo
http:
encoding: { charset: UTF-8, enable: true, force: true }
cloud:
config:
name: application
profile: test,${spring.application.name}
label: dev
#config-server地址
uri: http://localhost:8888
stream:
#指定用kafka stream来作为默认消息中间件
default-binder: kafka
kafka:
binder:
brokers: localhost:9092
zkNodes: localhost:2181,localhost:2182,localhost:2183
这里我们可以将spring.cloud.config.uri 替换成
spring:
cloud:
config:
discovery:
enabled: true
serviceId: config-server
表示从eureka注册中心,通过serviceId 拿到配置中心url地址,这就需要我们开启一台eureka服务。将config-server和config-client的application.yml中,都配上如下代码
eureka:
instance:
preferIpAddress: true
leaseRenewalIntervalInSeconds: 10
#在注册中心展示名称+ip+随机数
instanceId: ${spring.application.name:${random.value}}:${server.port}
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
4.新建controller验证
@RestController
@RefreshScope
public class TestController {
@Value("${my-config}")
private String name;
@RequestMapping("/getName")
public String getAppName() {
return name;
}
}
5.浏览器访问 http://localhost:8081/getName
auto refresh
说明client服务以及可以从config-server拿到值了。
这时我们可以复制启用多台config-client服务。然后修改git仓库,application-test.yml 中my-config 值
auto refresh success
对config-server发送post请求:http://localhost:8888/bus/refresh
注:可以配置gitlab的webhook,每次对config-repository进行push操作,发送post请求。
再次访问多台config-client服务的 http://localhost:****/getName
auto refresh success
读到的配置均已刷新。这时因为引入的bus包,通过kafka+zk通知到config-client,令其重新获取配置。
一个简单的分布式配置中心已经搭建完成。
本文源码下载地址:https://gitee.com/starchi/config-demo.git
\(^o^)/~