分布式-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
[email protected]
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

猜你喜欢

转载自blog.csdn.net/qq_42011565/article/details/110230861