分布式-Config 配置中心
分布式-Config 配置中心
作用与说明:
1.spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持。有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性。
2.本案例中将 文件上传到 git,配置服务端读取git上的数据,客户端读取配置服务端的数据,本文接上一篇(分布式-Feign 服务调用)
开始配置:
一:本文将service-a作为客户端读取配置中心配置,自定义文件 service-a-dev.properties 上传至码云
二.搭建配置中心:
1.依赖:
<dependencies>
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
2.文件配置
server.port=1112
spring.application.name=config-server
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
eureka.client.healthcheck.enabled=true
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=10
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=http://${spring.cloud.client.ip-address}:${server.port}
eureka.instance.hostname= ${spring.cloud.client.ip-address}
#gitee
spring.cloud.config.server.git.uri=https://gitee.com/zhang_dongsheng/config-server.git
spring.cloud.config.server.git.search-paths=config-server
spring.cloud.config.label=master
spring.cloud.config.server.git.username=test@qq.com
spring.cloud.config.server.git.password=******
在META-INF文件夹下新建文件 spring.factories
org.springframework.boot.env.PropertySourceLoader=cn.huanzi.qch.config.configserver.MyPropertiesHandler
3.新建类MyPropertiesHandler
/**
* 解决中文乱码问题
* 参考:https://blog.csdn.net/sinat_38843093/article/details/79960777
*/
public class MyPropertiesHandler extends PropertiesPropertySourceLoader {
@Override
public String[] getFileExtensions() {
return new String[]{"properties", "xml"};
}
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
ArrayList<PropertySource<?>> list = new ArrayList<>();
Properties properties = getProperties(resource);
if (!properties.isEmpty()) {
list.add(new PropertiesPropertySource(name, properties));
}
return list;
}
private Properties getProperties(Resource resource) throws IOException {
Properties properties = new Properties();
InputStream inputStream = resource.getInputStream();
properties.load(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
inputStream.close();
return properties;
}
}
启动项目,访问 http://localhost:1112/service-a-dev.properties
三,配置客户端
1.依赖:
<dependencies>
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
server.port=10081
spring.application.name=service-a
#mvc
spring.mvc.date-format=yyyy-MM-dd HH:mm:ss
#jackson
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#eureka
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
eureka.client.healthcheck.enabled=true
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=10
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=http://${spring.cloud.client.ip-address}:${server.port}
eureka.instance.hostname= ${spring.cloud.client.ip-address}
#config
spring.cloud.config.discovery.enabled=true
spring.cloud.config.enabled=true
spring.cloud.config.name=**service-a**
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.service-id=**config-server**
management.endpoints.web.exposure.include=**refresh**
3.新建接口测试
@RestController
public class TestController {
@Value("${create_author_config}")
private String author;
@RequestMapping("config")
public String config(){
return "作者:"+author;
}
4.访问接口:http://localhost:10081/config
5.问题解决
出现的问题1:当我将git上的数据修改后,配置中心服务可刷新出最新值,但是客户端无法刷新出最新值。因为客户端读取的是配置中心的缓存,缓存未刷新。
解决办法:
- 客户端配置加入:management.endpoints.web.exposure.include=refresh 暴露端口
- 加入依赖:
<!-- actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
-
客户端的controller 加上
@RefreshScope
注解 -
当git修改值后,调用客户端的接口 post http://localhost:10081/actuator/refresh 刷新
出现的问题2 :Could not resolve placeholder ‘create_author_config’ in value "${create_author_config} 主要原因是当前服务名和配置中心中的文件名的命名不对应。
解决:
比如项目名是service-a,若读dev环境的配置,那么配置中心的文件名就应该是service-a-dev.peoperties。
http请求地址和资源文件映射如下:({application}为当前项目名,即spring.application.name:)
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
本文地址:https://blog.csdn.net/qq_42011565/article/details/110230861
上一篇: 可变长度参数的了解
下一篇: 多张图片合并转为PDF