zoukankan      html  css  js  c++  java
  • (十一)分布式配置中心-Config

    1.什么是配置中心

    1.1配置中心概述

    对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护。微服务的配置管理一般有以下需求:

    • 集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。
    • 不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。
    • 运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等
    • 配置修改后可自动更新。如配置内容发生变化,微服务可以自动更新配置

    综上所述对于微服务架构而言,一套统一的,通用的管理配置机制是不可缺少的总要组成部分。常见的做法就是通过配置服务器进行管理。

    1.2常见配置中心

    Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。
    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
    Disconf 专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」包括 百度、滴滴出行、银联、网易、拉勾网、苏宁易购、顺丰科技 等知名互联网公司正在使用!「disconf」在「2015 年度新增开源软件排名 TOP 100(OSC开源中国提供)」中排名第16强。Disconf的功能特点描述图:

    2.Spring Cloud Config简介

    Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。

    Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以为所有环境中的应用程序管理其外部属性。它非常适合spring应用,也可以使用在其他语言的应用上。随着应用程序通过从开发到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。
    Spring Cloud Config服务端特性:

    • HTTP,为外部配置提供基于资源的API(键值对,或者等价的YAML内容)
    • 属性值的加密和解密(对称加密和非对称加密)
    • 通过使用@EnableConfigServer在Spring boot应用中非常简单的嵌入。Config客户端的特性(特指Spring应用)
    • 绑定Config服务端,并使用远程的属性源初始化Spring环境。
    • 属性值的加密和解密(对称加密和非对称加密)

    3.案例应用

    • 新建工程
    cloud-config-server-3344
    
    • pom
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
            </dependency>
    
    • yml
    server:
      port: 3344
    
    spring:
      application:
        name:  cloud-config-server #注册进Eureka服务器的微服务名
      cloud:
        config:
          server:
            git:
              uri: https://gitee.com/everyingo/spring-cloud-config.git #Gitee上面的git仓库名字
            ####搜索目录
              search-paths:
                - respo
          ####读取分支
          label: master
    
    
    #服务注册到eureka地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    
    • 主启动类
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication.class, args);
        }
    }
    
                /{name}-{profiles}.yml
     
    /{label}-{name}-{profiles}.yml
     
    label:分支(branch)
    name :服务名
    profiles:环境(dev/test/prod)
    
    • 新建工程
    cloud-config-client-3355
    
    • pom
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    
    • bootstarp.xml
      applicaiton.yml是用户级的资源配置项
      bootstrap.yml是系统级的,优先级更加高
      Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
      Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap contextApplication Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap ContextApplication Context配置的分离。
      要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.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 #配置中心地址k
    
    #服务注册到eureka地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    
    • 主启动类
    @SpringBootApplication
    @EnableEurekaClient
    public class ConfigClientAppliation3355 {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientAppliation3355.class, args);
        }
    }
    
    • Controller
    @RestController
    public class ConfigClientController
    {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo() 
        {
            return configInfo;
        }
    }
    
    • 测试
      启动Config配置中心3344微服务并自测
      http://config-3344.com:3344/master/config-prod.yml
      http://config-3344.com:3344/master/config-dev.yml
      启动3355作为Client准备访问 http://localhost:3355/configInfo 成功实现了客户端3355访问SpringCloudConfig3344通过Gitee获取配置信息
    • 分布式配置的动态刷新问题
      修改Gitee上配置文件内容,刷新3344,发现ConfigServer配置中心立刻响应,刷新3355,发现ConfigClient客户端没有任何响应
      难道每次修改配置文件,客户端都需要重启??噩梦
    • Config客户端动态刷新
      避免每次更新配置都要重启客户端微服务3355,修改3355模块
      pom引入
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    修改yml,暴露监控端口

    # 暴露监控端点
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    

    @RefreshScope业务类Controller修改

    @RestController
    @RefreshScope
    public class ConfigClientController
    {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    

    发送刷新请求 curl -X POST "http://localhost:3355/actuator/refresh"
    再次获取最新的配置内容http://localhost:3355/configInfo,此时获取的是最新的内容

  • 相关阅读:
    .NET Core技术研究-HttpContext访问的正确姿势
    .NET 5 Preview 1的深度解读和跟进
    玩转VSCode-完整构建VSCode开发调试环境
    China .NET Conf 2019-.NET技术架构下的混沌工程实践
    如何做好开发自测
    .NetCore技术研究-.NET Core迁移前的准备工作
    .NetCore技术研究-一套代码同时支持.NET Framework和.NET Core
    .NetCore技术研究-ConfigurationManager在单元测试下的坑
    统一流控服务开源:基于.Net Core的流控服务
    计组:计算机为什么有反码补码?不列公式!
  • 原文地址:https://www.cnblogs.com/everyingo/p/14777568.html
Copyright © 2011-2022 走看看