返回 导航

SpringBoot / Cloud

hangge.com

分布式配置中心Spring Cloud Config使用详解1(基本用法)

作者:hangge | 2020-08-07 08:10

一、基本用法

1,Spring Cloud Config 介绍

(1)Spring Cloud Config 用来为分布式系统中的外部化配置提供服务器和客户端支持。它分为服务端与客户端两个部分:
  • 服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口。
  • 客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。

(2)Spring Cloud Config 默认采用 Git 来存储配置信息,所以使用 Spring Cloud Config 构建的配置服务器,天然就支持对微服务用于配置信息的版本管理,并且可以通过 Git 客户端工具来方便地管理和访问配置内容。
注意:除了使用 Git 外,Spring Cloud Config 也同样支持其他存储方式比如:SVN、本地化文件系统等。

2,Git 仓库添加配置文件

(1)本文样例我们使用 Git 存储来做分布式的配置文件管理,这里我使用国内的码云来作为存放配置文件的仓库,假设我的仓库地址如下:

(2)首先在 https://gitee.com/hangge/hangge.com 下创建一个 config-repo 目录作为配置仓库,然后在该目录下创建下面 3 个配置文件:
    默认的 master 分支下 hangge-client.propertieshangge-client-dev.propertieshangge-client-prod.properties 文件里的内容分别是:
  • from=git-default-1.0
  • from=git-dev-1.0
  • from=git-prod-1.0

(3)为了测试版本控制,我们同时创建一个 config-test 分支,该分支下 config-repo 目录下三个配置文件内容值用 2.0 做后缀:
    config-test 分支下 hangge-client.propertieshangge-client-dev.propertieshangge-client-prod.properties 文件里的内容分别是:
  • from=git-default-2.0
  • from=git-dev-2.0
  • from=git-prod-2.0

3,构建配置中心

(1)创建一个基础的 Spring Boot 工程,命名为 config-server,并在 pom.xml 中引入相关依赖:
<dependencies>
    <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>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2)接着在 application.properties 中添加配置服务的基本信息以及 Git 仓库的相关信息:
注意spring.cloud.config.server.git.search-paths 用于配置仓库路径下的相对搜索位置,可以配置多个。
spring.application.name=config-server
server.port=7001

spring.cloud.config.server.git.uri=https://gitee.com/hangge/hangge.com
spring.cloud.config.server.git.search-paths=config-repo
spring.cloud.config.server.git.username=hangge
spring.cloud.config.server.git.password=123

(3)最后在程序主类上添加 @EnableConfigServer 注解,开启 Spring Cloud Config 的服务端功能。
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

(4)启动服务后,我们可以通过浏览器、POSTMANCURL 等工具直接来访问我们的配置内容了,访问配置信息的 URL 与配置文件的映射关系如下:
(1)不带 {label} 分支信息,默认访问 master 峰值,可以使用:
  • /{application}-{profile}.yml
  • /{application}-{profile}.properties
(2)带 {label} 分支信息,可使用:
  • /{label}/{application}-{profile}.yml
  • /{label}/{application}-{profile}.properties
  • /{application}/{profile}[/{label}]

(5)假设我们访问 config-test 分支,hangge-client 应用的 prod 环境,可以用如下这个 url

(6)可以看到返回的 JSON 数据中包含了应用名、环境名、分支名、以及 prod 环境和 default 环境的配置内容。其中 version 对应的是在 Git 上的 commit 号。
注意:配置服务器在从 Git 中获取配置信息后,会存储一份在 config-server 的文件系统中。
  • 实质上 config-server 是通过 git clone 命令将配置内容复制一份在本地存储,然后读取这些内容并返回给微服务应用进行加载。
  • config-server 通过 Git 在本地仓库暂存,可以有效防止当 Git 仓库出现故障而引起无法加载配置信息的情况。我们可断开网络再次访问前面的 url,可以发现依然会返回配置内容,这些内容源于之前访问时存于 config-server 本地文件系统中的配置内容。

4,客户端映射配置

(1)接着我们尝试如何在微服务应用中通过上面的配置服务中心获取配置信息。首先创建一个基础的 Spring Boot 工程,命名为 hangge-client,并在 pom.xml 中引入相关依赖:
<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>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2)接着创建 bootstrap.properties 配置,来指定获取配置文件的 config-server 位置:
注意:下面这些属性必须配置在 bootstrap.properties 中,这样 config-server 中的配置信息才能被正确加载。
  • 通过 bootstrap.propertiesconfig-server 的配置,使得该应用会从 config-server 中获取一些外部配置信息,这些信息的优先级比本地的内容要高,从而实现了外部化配置。
# 对应配置规则中的 {application} 部分
spring.application.name=hangge-client
server.port=7002

# 对应配置规则中的 {label} 部分
spring.cloud.config.label=master
# 对应配置规则中的 {profile} 部分
spring.cloud.config.profile=dev
# 配置中心 config-server 的地址
spring.cloud.config.uri=http://localhost:7001/

(3)最后我们创建一个 Controller 来测试一下,通过 @Value("${from}") 绑定配置服务中配置的 from 属性,并通过接口返回这个 from 属性:
@RefreshScope
@RestController
public class HelloController {
    @Value("${from}")
    private String from;

    @GetMapping("/test")
    public String test(){
        return this.from;
    }
}

(4)启动应用并访问该接口,可以看到页面成功根据配置内容输出对应环境的 from 内容了。

(5)除了通过 @Value 注解绑定注入之外,我们也可以通过 Environment 对象类获取配置属性,下面代码的运行结果同上面是一样:
@RefreshScope
@RestController
public class HelloController {
    @Autowired
    private Environment env;

    @GetMapping("/test")
    public String test(){
        return env.getProperty("from", "undefined");
    }
}
评论

全部评论(0)

回到顶部