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

SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)

程序员文章站 2022-07-15 10:09:14
...

本文是SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config),若要关注前文,请点击传送门:

SpringCloud实战(五)-路由网关(zuul)

前文我们介绍了Zuul路由网关。随着工作中业务的日益增多,需求日益复杂,我们需要拆分许多微服务模块进行业务划分,此时每一个模块都有各自的配置文件,此时如果有1万个模块,我们就有1万个配置文件,所以我们需要一个配置中心进行统一的配置文件管理,SpringCloud为我们提供了Spring Cloud Config进行配置文件管理,下面我也不废话了,懒得再开一篇写单节点Spring Cloud Config的文章了(单节点基本没啥用),直接写Spring Cloud Config集群搭建,架构图如下:

SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)

一、Spring Cloud Config简介

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

二、准备工作

基于前文中的工程进行搭建,首先启动Eureka集群,端口分别是8759、8760、8761,因为我们要实现Client端配置文件的实时刷新,所以我们需要安装消息中间件,这里我选择rabbitMQ。

rabbitMQ下载地址

rabbitMQ安装教程

rabbitMQ配置远程访问

rabbitMQ需要配置远程访问端口后才能在程序中连接到(远程访问端口我配置的是5672)。

三、创建config-server工程

新建一个spring-boot工程,取名为:config-server。

3.1 maven依赖

<?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.oal.microservice</groupId>
        <artifactId>openAiLab</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.oal.microservice</groupId>
    <artifactId>config-server</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config-server</name>
    <description>config</description>

    <dependencies>
        <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.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

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

我们需要引入spring-cloud-config-server、spring-cloud-starter-bus-amqp,这里我们引入了Bus消息总线,目的是为了能够通知客户端去MQ中拉取配置文件内容,从而达到更新客户端配置文件的目的,此时的架构图如下:

SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)

3.2 配置文件(application.yml)

eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka-serve-01:8761/eureka/

server:
  port: 8888

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/AndyWebJava/SpringcloudConfig
          searchPaths: respo
          label: master
          username:
          password:
    bus:
      enabled: true
      trace:
        enabled: true
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

注意这里我们需要暴露Bus中的bus-refresh接口,我们需要通过bus进行配置文件的更新。

spring.cloud.config.server.git.uri 是git仓库地址

spring.cloud.config.server.git.searchPaths是配置文件所在路径

spring.cloud.config.server.git.label是配置文件所在分支

spring.cloud.config.server.git.username、spring.cloud.config.server.git.password 如果是共有仓库,填空就可以。

management.endpoints.web.exposure.include= bus-refresh 是让config-server暴露Bus的bus-refresh配置文件刷新端口,这样我们就可以通过Postman去进行客户端配置文件的刷新了,注意,这里我只让config-server来做配置文件的刷新工作。

3.3 启动类(ConfigServerApplication)

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

启动config-server,端口是8888,这样我们的服务端就搭建完成了,高可用的话就启动多个config-server实例(不同端口)注册到Eureka集群上,如图所示:

SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)

四、创建config-client工程

新建一个spring-boot工程,取名为:config-client。

4.1 maven依赖

<?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.oal.microservice</groupId>
        <artifactId>openAiLab</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.oal.microservice</groupId>
    <artifactId>config-client</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config-client</name>
    <description>config</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
    </dependencies>

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

4.2 配置文件(bootstrap.yml)

spring:
  profiles:
    active: ${CONFIG_ACTIVE:dev}

---
spring:
  profiles: dev
  application:
    name: config-client
  cloud:
    config:
      label: master
      profile: dev
      discovery:
        enabled: true
        service-id: config-server
    bus:
      enabled: true
      trace:
        enabled: true
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

server:
  port: 8881

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

注意这里配置文件必须是以bootstrap.*开头,不然无法从服务端获取到配置信息。

spirng.config.config.label 是资源文件所在分支,它默认会去git上找文件名为config-client-dev.*的文件进行读取,这里我们可以通过判断不同的运行环境来读取到不同环境的配置文件。

spring.cloud.config.profile 是运行环境,用来区分开发、测试、生产环境。

spring.cloud.config.discovery.service-id 是配置中心服务端实例名。

spring.profiles.active= ${CONFIG_ACTIVE:dev} ,这种写法会从环境变量中读取key为CONFIG_ACTIVE的值,如果环境变量中找不到就直接去默认值,这里默认值是dev。

4.3 启动类(ConfigClientApplication)

@SpringBootApplication
@EnableDiscoveryClient
@RefreshScope
@RestController
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }

    @Value("${foo}")
    String foo;

    @RequestMapping(value = "/hi")
    public String hi() {
        return foo;
    }
}

我们需要在客户端的启动类上添加@RefreshScope注解,表示当配置改变的时候进行刷新。

启动config-client工程,访问 http://localhost:8881/hi,浏览器返回结果:

    foo version 1

然后我们改变git仓库中config-client-dev.properties文件中的foo值为50,访问 http://localhost:8888/actuator查看config-server端暴露出来的对外端口,如图所示:

SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)

我们可以看到全局配置文件的刷新地址是

    http://localhost:8888/actuator/bus-refresh

我们可以通过指定{destination}来进行局部配置文件刷新,例如 http://localhost:8888/actuator/bus-refresh/config-client*

    http://localhost:8888/actuator/bus-refresh/{destination}

然后我们打开Postman通过Post的方式访问 http://localhost:8888/actuator/bus-refresh/config-client*,如图所示:

SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)

成功后再浏览器中访问 http://localhost:8881/hi,返回结果

    foo version 50

说明已经成功刷新了Client端的配置文件。

高可用的分布式配置中心(Spring Cloud Config)搭建完成。