欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

分布式-Config 配置中心

程序员文章站 2022-07-10 09:18:05
分布式-Config 配置中心作用与说明:1.spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持。有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性。2.本案例中将 文件上传到 git,配置服务端读取git上的数据,客户端读取配置服务端的数据,本文接上一篇(分布式-Feign 服务调用)开始配置:一:本文将service-a作为客户端读取配置中心配置,自定义文件 service-a-dev.properties 上传至码云二.搭建配...

分布式-Config 配置中心

作用与说明:
1.spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持。有了配置服务器,您就有了一个中心位置来管理跨所有环境的应用程序的外部属性。

2.本案例中将 文件上传到 git,配置服务端读取git上的数据,客户端读取配置服务端的数据,本文接上一篇(分布式-Feign 服务调用

开始配置:

一:本文将service-a作为客户端读取配置中心配置,自定义文件 service-a-dev.properties 上传至码云
分布式-Config 配置中心
二.搭建配置中心:
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

分布式-Config 配置中心

三,配置客户端
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

分布式-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

相关标签: 分布式