Spring Cloud配置中心(Config Server)搭建

本指南将引导完成Spring Cloud配置中心(Config Server)的配置。使用一个标准的Spring Boot应用作为客户端读取配置信息,并借助Spring Boot Actuator动态刷新配置。

Spring Cloud配置服务器前提条件

JDK 1.8 或更新

Gradle 4+ 或 Maven 3.2+

Config Server应用配置

创建Spring boot应用

使用Spring initializr快速创建一个标准的Spring boot应用程序。

创建git仓库

--git--git init

Config Server可以选择利用git仓库管理配置数据,对于仓库有多个选择。可以将Config Server指向Github或GitLab仓库,也可以基于本地Git仓库。 

创建一个目录并用git init命令初始化仓库,创建一个名为a-bootiful-client.properties文件,并添加到Git存储库中,确保使用git commit命令提交它。

应用依赖

--properties-*org.springframework.cloud:spring-cloud-starter-config

应用配置

在Config Server应用的配置文件中(/src/main/resources/application.properties)指定Git仓库的路径。

spring.cloud.config.server.git.uri=${HOME}/Desktop/config

应用编码

使用Spring Cloud Annotaion:

--java-*@EnableConfigServer
package hello;

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

@EnableConfigServer
@SpringBootApplication
public class ConfigServiceApplication {

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

配置客户端应用程序

创建一个Spring Boot应用作为客户端,在应用程序的引导文件(bootstrap.properties)中为应用程序命名,并指定配置服务器的位置。

--properties-*spring.application.name=a-bootiful-client

spring.cloud.config.uri=http://localhost:8888

配置动态刷新

在/src/main/resources/application.properties中为应用开启refresh端点,动态读取配置变化:

management.endpoints.web.exposure.include=*

默认情况下,客户端启动时读取配置项,为了动态获取配置数据,在应用中加入@RefreshScope注解,通过触发刷新事件,从Config Server中获取更新的值。

--java--package hello;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class ConfigClientApplication {

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

@RefreshScope
@RestController
class MessageRestController {

    @Value("${message:Hello default}")
    private String message;

    @RequestMapping("/message")
    String getMessage() {
        return this.message;
    }
}

读取Config Server配置

在a-bootiful-client.properties文件中简单的添加一项配置信息,然后使用git提交更改。

message = Hello world
git commit

Config Server根据客户端应用名匹配对应的配置文件(如a-bootiful-client.properties),并将Git仓库中通用配置文件(application.properties或application.yml)内容发给客户端。

配置项覆盖规则

命名具体的配置文件(如a-bootiful-client.properties)会覆盖application.properties或application.yml文件中的配置项。

Client端读取Config Server配置

先启动了一个Config Server,然后启动客户端应用,客户端应用根据配置读取Config Server中的配置项。

客户端应用程序利用Config Server加载配置文件,与直接读取application.properties、application.yml,以及PropertySource加载的配置文件是一样的。

测试配置服务器

在启动了配置服务器和客户端应用后。在浏览器中访问客户端应用程序:

http://localhost:8080/message

此时在响应中应看到"Hello world"。

动态修改配置

将Git存储库中a-bootiful-client.properties文件中的配置项修改为Hello Spring!

message = Hello Spring

查看Config Server中动态修改的配置。

http://localhost:8888/a-bootiful-client/default

Spring Boot Actuator

使用Spring Boot Actuator刷新端点,以强制客户端应用获取新的配置项并更新。使用Spring Boot Actuator,需引入依赖项:

org.springframework.boot:spring-boot-starter-actuator

向客户端的端点发出刷新请求(HTTP POST):

--shell--http://localhost:8080/actuator/refresh

$ curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"

查看端点确认是否生效:

http://localhost:8080/message

在客户端应用中设置management.endpoints.web.exposure.include = *,是为了方便测试(Spring Boot 2.0默认不会公开Actuator端点)。 默认情况下,如果未设置此标志位,可以通过JMX访问它们。