分布式系统面临的配置问题
springcloud听过的config可以完美的解决上述的问题,springcloud config是什么
是什么
怎么玩‘
能干嘛
集中管理配置文件
不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
将配置信息以REST接口的形式暴露
与Github整合配置
由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持svn和本地文件,但最推荐的还是Git,而且使用的是http/https访问的形式)
Config服务端配置与测试
在自己的github创建一个仓库,并在本地下载
这些前提条件搞好了之后创建cloud-config-center-3344服务端
pom文件引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springcloud</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-config-center-3344</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>cloud-api-conmmon</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--springcloud-config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--SpringBoot热部署配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project>
application.yml
server: port: 3344 spring: application: name: cloud-config-center cloud: config: server: git: uri: https://github.com/changtoufadeguniang/springcloud-config search-paths: - springcloud-config label: main eureka: client: service-url: defaultZone: http://localhost:7001/eureka
启动类
@SpringBootApplication @EnableConfigServer public class ConfigCenterApplicaton3344 { public static void main(String[] args) { SpringApplication.run(ConfigCenterApplicaton3344.class,args); } }
测试http://localhost:3344/main/application-dev.yml
Config客户端配置与测试 创建cloud-config-client-3355客户端
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springcloud</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-config-client-3355</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>cloud-api-conmmon</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--springcloud-config-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--SpringBoot热部署配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project>
bootstrap.yml
server: port: 3355 spring: application: name: config-client cloud: config: label: main name: application profile: dev uri: http://localhost:3344 eureka: client: service-url: defaultZone: http://localhost:7001/eureka
启动类
@SpringBootApplication @EnableEurekaClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class,args); } }
编写controller获取github application-dev.yml的内容
@RestController @RequestMapping("/client") public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/getConfigInfo") public String getConfigInfo(){ return configInfo; } }
测试http://localhost:3355/client/getConfigInfo
发现问题,当github 上application-dev.yml的内容发生改变后,在不重启服务的情况下,服务端3344内容可以实时更新,但是3355获得的内容没有发生改变。只有重启3355客户端才会刷新改变
Config客户端之动态刷新
cloud-config-client-3355客户端
pom文件加入依赖
<!--config客户端动态刷新需要引入的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
修改bootstrap.yml配置文件暴露端口
server: port: 3355 spring: application: name: config-client cloud: config: label: main name: application profile: dev uri: http://localhost:3344 eureka: client: service-url: defaultZone: http://localhost:7001/eureka #暴露端口 management: endpoints: web: exposure: include: "*"
controller添加注解@RefreshScope
@RestController @RequestMapping("/client") @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/getConfigInfo") public String getConfigInfo(){ return configInfo; } }
一切搞好之后重启服务,然后修改github上配置文件的内容,在访问http://localhost:3355/client/getConfigInfo内容还是没有更新
这时需要先发送一次post请求,http://localhost:3355/actuator/refresh刷新一下服务
再次请求
内容已经发生了改变