分布式系统面临的问题:
微服务意味着将单体的应用拆分成一个个子服务,系统中会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的.
SpringCloud提供了ConfigServer来解决这个问题.不然,一套服务室系统中可能会有上百套配置文件…
SpringCloud Config
Config服务端配置与测试
1.在GitHub上新建一个名为springcloud-config的新Repository
2.获取git地址:https://github.com/binhaizhijun/springcloud-config.git
3.新建Module作为Cloud的配置中心模块
4.在pom中添加依赖,因为需要注册到Eureka服务中心,记得需要添加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>
5.在yml中填写配置
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的服务名
cloud:
config:
server:
git:
uri: https://github.com/binhaizhijun/springcloud-config.git
###搜索目录
search-paths:
- springcloud-config
####读取分支
label: master
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
6.写主启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class,args);
}
}
7.在windows下修改hosts文件.增加映射
8.测试通过Config微服务是否可以从GitHub上获取配置内容
配置读取规则
Config客户端配置与测试
1…新建cloud-config-client-3355
2.在pom中添加config客户端依赖,注意与服务端的依赖有区别
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
3.写配置文件:bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
# fetch-registry: false
#register-with-eureka: false
④controller
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
⑤主启动类
@SpringBootApplication
@EnableEurekaClient
//@EnableDiscoveryClient
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class,args);
}
}
⑤访问localhost:3355/configInfo
分布式配置动态刷新问题
在远程(GitHub)上修改了配置文件后,Config配置中心也能及时更新,但是ConfigClient却还是之前的数据,没有及时更新新数据.如果要更新的话不得不需要重新启动,这样势必会很麻烦…
①在pom中引入actuator监控依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
一般这个依赖除了网关不添加,其他的微服务基本都要引入.
②修改yml文件,暴露监控端点
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
③在业务类上添加刷新功能的注解@RefreshScope
④发送Post请求刷新3355(Client)
以上是手动刷新,如果有一百台也可以用批量脚本的方式执行刷新;
下面研究广播方式–一次刷新,处处生效
SpringCloud Bus 消息总线