Config入门实战(完整版)

12 Config学习

下面学习下使用 Spring Cloud Config 统一管理微服务配置

12.1 为什么要统一管理微服务配置

对于传统的单体应用,常使用配置文件管理所有配置。

例如一个Spring Boot开发的单体应用,可将配置内容放在application.yml文件中。如果需要切换环境,可设置多个Profile ,并在启动应用时指定sprmg.profiles.active={profile} 。

咱们之前学的使用的也是这种方式。当然也可借助Maven的Profile实现环境切换。

然而,在微服务架构中,微服务的配置管理一般有以下需求:

  • 集中管理配置。一个使用微服务架构的应用系统可能会包含成百上千个微服务,因此集中管理配置是非常有必要的。
  • 不同环境不同配置。例如,数据源配置在不同的环境(开发、测试、预发布、生产等)是不同的。
  • 运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小或熔断阈值,并且在调整配置时不停止微服务。
  • 配置修改后可自动更新。如配置内容发生变化,微服务能够自动更新配置。
    综上所述,对于微服务架构而言,一个通用的配置管理机制是必不可少的,常见做法是 使用配置服务器管理配置。

12.2 Spring Cloud Config 简介

Spring Cloud Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括 Config Server 和 Config Client 两部分。由于Config Server 和 Config Client 都实现了对 Spring Environment 和 PropertySource 抽象的映射,因此,Spring Cloud Config非常适合 Spring应用程序,当然也可与任何其他语言编写的应用程序配合使用。

Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个 环境下的配置,默认使用Git存储配置内容(也可使用Subversion.本地文件系统或Vault 存储配置,此处不做讨论),因此可以很方便地实现对配置的版本控制与内容审计。

Config Client是Config Server的客户端,用于操作存储在Config Server中的配置属性。如下图所示,所有的微服务都指向Config Server。各个微服务在启动时,会请求Config Server以获取所需要的配置属性,然后缓存这些属性以提高性能。

在这里插入图片描述

12.3 配置存储

本例中使用码云作为Config Server的后端存储

新建新仓库:spring-cloud-config-repo

创建几个文件

microservice-foo.properties

microservice-foo-dev.properties

microservice-foo-test.properties

microservice-foo-production.properties

内容分别为:

profile=default-1.0

profile=dev-1.0

profile=test-1.0

profile=production-1.0

新建一个分支,分支名为:config-label-v2.0,并将各个配置文件中的1.0给为2.0

12.4 编写Config server

新建maven工程microservice-config-server 为项目添加依赖

<?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>edu.xja</groupId>
    <artifactId>microservice-config-server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>

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

 
    <dependencyManagement>
        <dependencies>
            <!--springcloud-->
            <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>

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

</project>

启动类

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

配置文件application.yml

server:
  port: 8080
spring:
  application:
    name: microservice-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/woshiyu/spring-cloud-config-repo.git      # 配置Git仓库的地址
          username: *****                                                   # Git仓库的账号
          password: *****                                                   # Git仓库的密码

Config Server 的端点

可以使用Config Server的端点获取配置文件的内容。端点与配置文件的映射规则如下:

/{application}/{profile}[/{label}]

/{application}-{profile}[/{label}]

/{label}/{application}-{profile}.yml //返回文件中的内容

/{label}/{application}-{profile}.properties //返回文件中的内容

以上端点者都可以映射到{application}-{profile}.properties这个配置文件,{application} 表示微服务的名称,{label}对应Git仓库的分支,默认是master。

上面的dev、test、production即为profile

按照以上规则,对于本例,可使用以下URL访问到Git仓库master分支的
microservice- foo-dev.properties,例如:

http://localhost:8080/microservice-foo/dev //返回综合信息

http://localhost:8080/microservice-foo-dev.properties //返回文件中的内容

http://localhost:8080/microservice-foo-dev.yml //返回文件中的内容

按照以上规则,对于本例,可使用以下URL访问到Git仓库config-label-v2.0分支的microservice- foo-prod.properties,例如:

http://localhost:8080/config-label-v2.0/microservice-foo-prod.yml //返回文件中的内容

12.5 编写客户端

新建maven工程microservice-config-client, 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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>edu.xja</groupId>
    <artifactId>microservice-config-client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>

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

    <dependencyManagement>
        <dependencies>
            <!--springcloud-->
            <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>

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

</project>

启动类

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

application.yml

server:
  port: 8081

bootstrap.yml

spring:
  application:
    name: microservice-foo    # 对应config server所获取的配置文件的{application}
  cloud:
    config:
      uri: http://localhost:8080/
      profile: dev            # profile对应config server所获取的配置文件中的{profile} 
      label: master           # 指定Git仓库的分支,对应config server所获取的配置文件的{label}

系统启动会自动读取bootstrap.yml

edu.xja下新建测试ConfigClientController

@RestController
public class ConfigClientController {

    @Value("${profile}")
    private String profileName;

    @GetMapping("/getConfig")
    public String test(){
        return profileName;
    }
}

启动浏览器测试

http://localhost:8081/getConfig

13 将我们的用户提供者项目配置到注册中心

Pom.xml 中加入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

新建bootstrap.yml

spring:
  application:
    name: user-provider    # 对应config server所获取的配置文件的{application}
  cloud:
    config:
      uri: http://localhost:8088/
      profile: dev            # profile对应config server所获取的配置文件中的{profile}
      label: master           # 指定Git仓库的分支,对应config server所获取的配置文件的{label}

把原先application.yml中数据源信息注释上

本地仓库spring-cloud-config-repo1新建一个文件user-provider-dev.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&characterEncoding=utf-8

spring.datasource.username=root

spring.datasource.password=123456

把user-provider-dev.properties push到 码云上去

测试部署:

启动配置服务器 config server

启动服务提供者 microservice-provider-user

访问 http://localhost:8888/user/3 测试一下

14 扩展学习

Spring Cloud Gateway

配置中心加入安全和密码加密

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值