Config分布式配置中心介绍

分布式系统面临的配置问题

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理.……

Config分布式配置中心是什么

image.png
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

Config分布式配置中心简介

SpringCloud Config分为服务端客户端两部分。

  • 服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
  • 客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

    Config分布式配置中心能做什么

  1. 集中管理配置文件
  2. 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
  3. 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  4. 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
  5. 将配置信息以REST接口的形式暴露 - post/crul访问刷新即可…

    与GitHub整合配置

    由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式。

    官网

    https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/

    Config配置总控中心搭建

    GitHub新建项目

    创建项目
    image.png
    image.png
    复制git地址
    image.png
    克隆到本地

    1. https://github.com/z13611306193/springcloud-config.git

    新建空文件夹
    image.png
    打开GitBash
    image.png

    克隆远程代码

    1. git clone https://github.com/z13611306193/springcloud-config.git

    克隆成功
    image.png

    新建配置文件

    config-dev.yml

    1. config:
    2. info: "master branch,springcloud-config/config-dev.yml version=7"

    config-prod.yml

    1. config:
    2. info: "master branch,springcloud-config/config-prod.yml version=1"

    config-test.yml

    1. config:
    2. info: "master branch,springcloud-config/config-test.yml version=1"

    image.png
    切换到工程里面

    1. cd springcloud-config/

    —————————————————————————————————————————————————————————————
    因为GitHub的网速问题我不得不放弃,找到了代替GitHub的另一个国内仓库 码云
    我不知道他能不能代替GitHub,尝试一下啦
    —————————————————————————————————————————————————————————————

    1. # 添加文件到git
    2. git add .
    3. git commit -m "init config"
    4. git push

    提交后 码云查看
    image.png

    新建配置中心Server工程

    新建Module模块cloud-config-center-3344,它即为Cloud的配置中心模块CloudConfig Center

    修改POM.xml

    ```javascript <?xml version=”1.0” encoding=”UTF-8”?> <project xmlns=”http://maven.apache.org/POM/4.0.0

    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

     <artifactId>cloud2020</artifactId>
     <groupId>com.atguigu</groupId>
     <version>1.0-SNAPSHOT</version>
    

    4.0.0 cloud-config-center-3344 org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test

<a name="tSTDG"></a>
## 新建yml配置
```javascript
server:
  port: 3344

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
#          uri: git@github.com:zzyybs/springcloud-config.git #GitHub上面的git仓库名字
          uri: https://gitee.com/flower-dance-mrz/springcloud-config.git # 使用码云替换Git
          ####搜索目录
          search-paths:
            - springcloud-config
      ####读取分支
      label: master

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

新建主启动类

package com.lun.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigCenterMain3344.class, args);
    }
}

配置Hosts

127.0.0.1 config-3344.com

测试

通过Config微服务是否可以从GitHub上获取配置内容

image.png

配置读取规则

成功实现了用SpringCloud Config通过GitHub/GitEE获取配置信息

Config客户端配置与测试

新建配置中心Client工程

新建cloud-config-client-3355工程

修改POM.xml

<?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>cloud2020</artifactId>
        <groupId>com.atguigu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-client-3355</artifactId>

    <dependencies>
        <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

bootstrap.yml

applicaiton.yml是用户级的资源配置项

bootstrap.yml是系统级的,优先级更加高

Spring Cloud会创建一个Bootstrap Context,作为Spring应用的Application Context的父上下文。

初始化的时候,BootstrapContext负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment。

Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。Bootstrap context和Application Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap Context和Application Context配置的分离。

要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml。

新建yml配置

这次创建的是bootstrap.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://config-3344.com:3344 #配置中心地址k


#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

修改config-dev.yml配置并提交到GitHub中,比如加个变量age或者版本号version

新建主启动类

package com.lun.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3355.class, args);
    }
}

新建Controller

package com.lun.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


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

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

测试

成功实现了客户端3355访问SpringCloud Config3344通过GitHub获取配置信息可题随时而来
分布式配置的动态刷新问题

  • Linux运维修改GitHub上的配置文件内容做调整
  • 刷新3344,发现ConfigServer配置中心立刻响应
  • 刷新3355,发现ConfigClient客户端没有任何响应
  • 3355没有变化除非自己重启或者重新加载
  • 难到每次运维修改配置文件,客户端都需要重启??噩梦

    Config动态刷新之手动版

    避免每次更新配置都要重启客户端微服务3355
    动态刷新步骤

    修改3355模块

    POM引入actuator监控
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    修改YML,添加暴露监控端口配置

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

    @RefreshScope业务类Controller修改

    ```javascript import org.springframework.cloud.context.config.annotation.RefreshScope; …

@RestController @RefreshScope//<——- public class ConfigClientController { … }

<a name="qfTQ5"></a>
## 测试
此时修改github配置文件内容 -> 访问3344 -> 访问3355<br />http://localhost:3355/configInfo<br />3355改变没有??? **没有**,还需一步<br />How<br />需要运维人员发送Post请求刷新3355
```javascript
curl -X POST "http://localhost:3355/actuator/refresh"

image.png
再次测试
http://localhost:3355/configInfo
3355改变没有??? 改了。
成功实现了客户端3355刷新到最新配置内容,避免了服务重启
想想还有什么问题?
假如有多个微服务客户端3355/3366/3377
每个微服务都要执行—次post请求,手动刷新?
可否广播,一次通知,处处生效?
我们想大范围的自动刷新,求方法(请看下集[手动滑稽~])