SpringCloud(part7)分布式控制中心:SpringCloud Config

1.分布式 配置中心的设计思想

(1)为什么要使用分布式的配置中心:

    背景:在微服务如果使用传统的方式管理配置文件,配置文件管理器非常复杂

    如果生产环境配置文件,可能需要发生改变的时候,重新打war,重新读取配置文件信息在jvm内存中。

(2)什么是分布式配置中心

在微服务当中使用同一个服务器管理所有配置文件信息,能够实现后台可管理,当服务器正在运行时,如果配置文件 需要发生改变,可以实现不需要重启服务器实时更改配置文件信息。

2.常见部分式配置中心框架对比

阿波罗:携程写分布式配置中心,有图形界面可管理配置文件信息,配置文件存放在数据库中。

SpringCloud Config: 没有后台可管理分布式配置中心,配置文件信息存放在版本控制器中。

Zookeeper实现分布式配置中心:持久节点+事件通知

3.搭建git环境储存配置文件(码云)

3.1分布式配置中心原理 :

需要组件:

(1)web管理系统 :存放一些分布式后台可以使用图形界面配置文件(SpringCloud Config没有)

(2)存放分布式配置文件服务器(持久化存储服务器): 使用版本控制器来存放文件信息 使用git环境。

(3)ConfigServer缓存配置文件服务器(临时缓存存放)

(4)configClient读取ConfigServer配置文件信息

图解:

SpringCloud(part7)分布式控制中心:SpringCloud Config

通常公司的开发环境 :

dev :开发环境 sit:测试环境 pre:预发布环境 prd: 预生产环境

4.搭建ConfigServer配置文件中心

(1)从远程仓库读取

  • 首先我们创建一个maven项目,对pom文件进行修改
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qbd</groupId>
    <artifactId>springcloud_config</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>config_server</module>
        <module>eureka_server</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
    <!--管理cloud版本-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
  • 添加Eureka server 子模块,修改pom文件
<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.qbd</groupId>
        <artifactId>springcloud_config</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>eureka_server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka_server</name>
    <description>Demo project for Spring Boot</description>


    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置yml:

server:
  port: 8888
spring:
  application:
    name: eureka_server
eureka:
  client:
    fetch-registry: false
    register-with-eureka: false

启动类添加 @EnableEurekaServer

  • 添加Config Server 子模块,修改pom文件
<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.qbd</groupId>
        <artifactId>springcloud_config</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>config_server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config_server</name>
    <description>Demo project for Spring Boot</description>


    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置yml文件:

server:
  port: 8001
spring:
  application:
    name: config_server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/gondgondstudy/SpringCloudConfig.git
          search-paths:
          -  SpringCloudConfig    #目录地址
          default-label: master   #分支
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8888/eureka

启动类
@SpringBootApplication
@EnableEurekaClient//Eureka服务提供者
@EnableConfigServer//config 服务
  • 在远程仓库创建文件

在远程仓库创建文件的规范:

(1)服务名称- 环境.propertiest

         或者服务名称-环境.yml

按照此规范直接在远程仓库中创建两个配置文件

SpringCloud(part7)分布式控制中心:SpringCloud Config

重新启动config server服务,在浏览器地址栏中输入 http://localhost:8001/config_client-dev.ymlhttp://localhost:8001/config_client-sit.yml 可以发现这两个文件的信息

完成以上工作后,我们已经搭建好了 Config Server服务

5.ConfigClient读取ConfigServer配置文件信息

新建SpringBoot项目config_client项目

添加依赖,修改pom文件,使maven聚合

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--Eureka 服务客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>1.4.0.RELEASE</version>
</dependency>

建立bootstrap.yml文件

spring:
  application:
    name: config_client
  cloud:
    config:
      profile: dev #版本环境名称
      discovery:
        service-id: config_server #对应的服务名称 可以将url写死,但是不建议
        enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8888/eureka
server:
  port: 8002

然后一个控制器接口:

@RestController
public class TestController {
    //启动之后服务之后,将会从远程仓库找对应的配置文件
    //然后将对应的key的value信息注入类中属性。
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping("/getServerPort")
    public String getServerPort(){
        return serverPort;
    }
}

启动 Eureka server 服务和 config server 服务之后,再次启动config client 服务。

通过 http://localhost:8050/getServerPort 访问可以的到字符串8050

注意:

虽然我们在config client中设置了端口为8002 但是我们从远程仓库中读取到的端口号为8050,因此我们访问接口的端口号 应该是8050,而不是 8002

如果我们通过不同的端口号来启动 config server 的端口时,我们可以发现该config 满足高可用的负载均衡

以上我们已经基本搭建好了config的环境

6.SpringCloudConfig实时刷新配置文件

然后我们发现一个问题:当我们切换环境时,或者修改配置文件时,我们都需要重新启动服务。默认是不能实时获取修改后的信息。

修改配置文件之后 :

当我们通过config server 端口http://localhost:8001/config_client-dev.ym直接访问,可以看到实时信息。但是当我们通过config Client控制器接口访问,获取的内容不是实时的。

(1)手动刷新:(需要人工调用接口,读取最新配置文件)

在config client 添加依赖

<!--actuator监控中心 用于手动通过控制器刷新配置文件信息-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在bootstrap.yml文件中添加

#用于控制器手动刷新 开启所有端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

然后重启config Client 服务 ,通过控制器http://localhost:8050/actuator 刷新之后 ,再次访问config Client服务中的接口时,可以发现配置文件中的信息已经被手动刷新

(2)自动刷新:消息总线进行实时通知------SpringBus

更改上一模块 config Client :

在pom文件中加入RabbitMQ实现的SpringCloud Bus的起步依赖 -- spring-cloud-startr-bus-amqp,还需要安装 RabbitMQ服务器。

 

手动刷新和自动刷新都不需要重新启动服务器。

 

7.SpringCloudConfig设计原理分析