概述
分布式系统面临的配置问题
是什么?
怎么玩?
能干嘛?
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新,分环境部署。比如dev/test/prod/beta/release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
- 将配置信息以REST接口的形式暴露。post、curl访问刷新均可…
与Github整合配置
由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持svn和本地文件,但最推荐的还是Git,而且使用的是http/https访问的形式)
官网
https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.3.RELEASE/reference/html/
Config服务端配置与测试
1.用你自己的账号在Github
上新建一个名为springcloud-config
的新Repository
2.由上一步获得刚新建的git地址
3.本地硬盘上新建git仓库并clone
比如:本地地址:D:\44\SpringCloud2020;git clone xxx
4.新建Module
模块cloud-config-center-3344
它既为Cloud
的配置中心模块cloudConfig Center
5.pom
<!--配置中心-->
<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>
<dependency>
<groupId>com.lzh.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
6.配置文件
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/lzhharvey/springcloud-config.git
search-paths:
- springcloud-config #去这个springcloud-config目录下找配置
label: master #读取的分支
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
7.启动类
@SpringBootApplication
@EnableConfigServer
public class ConfgCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfgCenterMain3344.class,args);
}
}
8.hosts
文件修改
增加映射
127.0.0.1 config-3344.com
9.测试通过Config
微服务是否可以从Github
上获取配置内容
先往github
上传文件:config-dev.yml,config-test.yml,config-prod.yml
内容如下
config-dev.yml:
server:
port: 80
spring:
application:
name: dev
config-test.yml:
server:
port: 80
spring:
application:
name: test
config-prod.yml:
server:
port: 80
spring:
application:
name: prod
启动Eureka
,配置中心。
第一种访问方式:/{label}/{application}-{profile}.yml(最推荐使用这种方式)
http://config-3344.com:3344/master/config-dev.yml
出现:
第二种访问方式:/{application}-{profile}.yml
http://config-3344.com:3344/config-test.yml
把分支去掉,使用配置文件里配置的分支来读取
第三种方式:/{application}-{profile}[/{label}]
http://config-3344.com:3344/config/prod/master
,读取出来的是一个json格式,自己解析去吧
成功实现了用SpringCloud Config
服务端获取GitHub
上的配置信息。
接下来,看看获取到的配置怎么应用到客户端上。
Config客户端配置与测试
新建客户端子模块cloud-config-client-3355
依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.lzh.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
配置文件:
bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称
uri: http://localhost:3344 #配置中心读取
#以上配置相当于,master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
启动类:
@SpringBootApplication
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run( ConfigClientMain3355.class,args);
}
}
业务类:
//将配置信息以rest风格暴露
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
测试:启动Eureka,配置中心服务端,配置中心客户端
远程配置文件
预期的结果,访问接口,打印dev
成功!说明配置已经获取到了并且已经配置在了配置文件里,所以才能通过 @Value("${spring.application.name}")
获取到。
再次验证一下,把远程的配置文件的端口打开。
预测结果,如果配置成功,项目启动后,端口应该由3355变成80端口。
重启配置中心客户端:
确实是生效了哈。
访问接口看看:确实使用的是80的哈
问题:
修改GitHub上的配置文件内容做调整,刷新3344,发现ConfigServer配置中心立刻响应,刷新3355,发现ConfigServer客户端没有任何响应,3355没有变化除非自己重启或者重新加载,难道每次运维修改配置文件,客户端都需要重启??噩梦
Config客户端之动态刷新
避免每次更新配置都要重启客户端微服务3355。
动态刷新
修改3355模块,即配置中心客户端。
1.POM
引入actuator
监控
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.修改配置文件
暴露监控端口,完整配置如下
server:
port: 3355
spring:
application:
name: config-client
cloud:
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称
uri: http://localhost:3344 #配置中心读取
#以上配置相当于,master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
#暴露监控端口
management:
endpoints:
web:
exposure:
include: "*"
3.业务类Controller修改
加上注解@RefreshScope
//将配置信息以rest风格暴露
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${spring.application.name}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
4.测试
启动Eureka
,配置中心服务端,启动完之后,启动配置中心客户端。
客户端读取配置:http://localhost/configInfo
然后修改github
上对应的配置。
因为服务端与github
直连,肯定能直接读取到变化后的数据的:http://config-3344.com:3344/master/config-dev.properties
但是客户端是连服务端来服务配置的,客户端再次刷新访问,发现还是之前的配置并没有随之动态更新:
这时候就需要手动刷新一下了:需要发送Post请求刷新3355配置中心客户端。这里3355的客户端变成了80,是因为我的github上面配置了端口80,把本地的配置的3355端口给覆盖了。
C:\Users\Administrator>curl -X POST "http://localhost:80/actuator/refresh"
["config.client.version","spring.application.name"]
成功啦!
问题:
假如有多个微服务客户端3355/3366/3377。。。。
每个微服务都要执行一次post请求,手动刷新?
可否广播,一次通知,处处生效?