SpringCloud微服务入门(九),统一配置中心Config

目录



正文


SpringCloud统一配置中心使用Config组件。分为Server端与Client端,这点跟Eureka类似。在创建项目的时候选择对应的模块就可以了。

统一配置中心有种种好处,诸如:方便维护、安全可控、远程加载、动态更新。

Config可以从远程Git从库加载配置文件,动态更新配置,无需重启应用。

1、创建config-server项目

请看右边的模块列表,这个项目是EurekaClient也是ConfigServer。

项目创建完成后,还是按照老规矩来,在启动类加注解,启用Config。启用注解是@EnableConfigServer

然后修改application.properties文件,添加配置向EurekaServer注册,设置端口为7070,并指定远程配置的git地址和用户、密码。

spring.application.name=config-server
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
server.port=7070
spring.cloud.config.server.git.uri=giturl
spring.cloud.config.server.git.username=gituser
spring.cloud.config.server.git.password=gitpass

笔者用的远程配置git地址:https://gitee.com/dev-tang/sc-config里面有一个park的配置,用来模拟数据库配置。为方便测试,git仓库为public的,无需配置用户密码。

2、验证config-server是否有效

启动config-server,在浏览器中访问http://localhost:7070/park-dev.properties,如果与git仓库中的内容一致,就表示成功了。.properties后缀是可以变化的,比如要json格式,把后缀改成.json就可以了。需要yml格式就改成.xml。主要记住park-dev.properties这个格式是有意思的。park表示Eureka的服务名,dev表示模式,后缀表示格式。

properties格式

json格式

yml格式

config-server启动成功后,接下来就在现有的服务中应用config了。笔者将在park服务中使用config。

3、应用config

一个特别需要注意的地方,需要将application.properties文件名改成bootstrap.properties。 SpringCloud启用有一个优先级关系,bootstrap优先级高于application。如果不该名字在里面的config发现配置将会无效。

首先在park服务的pom.xml中引入config-clent依赖,将park变成ConfigClient。

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

然后修改park的bootstrap.properties文件,在里面配置config的发现服务。

spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
spring.cloud.config.profile=dev

创建一个config包,在里面引用远程git中的jdbc配置。代码如下:

package com.javafm.park.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "jdbc")
public class DBConfig {
    private String url;
    private String user;
    private String password;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

这里并不会真的去创建数据库连接和数据源。只是简单的取出配置,作为config演示。

接下来在controller里面加一个接口来向访问者输出配置,代码如下:

package com.javafm.park.controller;

import com.javafm.park.config.DBConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ParkController {
    
    @Autowired
    private DBConfig dbConfig;

    @GetMapping("/db-config")
    public String dbConfig() {
        return dbConfig.getUrl()  + " " + dbConfig.getUser() + " " +  dbConfig.getPassword();
    }
}

浏览器打开http://localhost:8080/db-config,最终效果如图所示:

如图已成功拿到远程配置文件。但是当你在git中修改远程配置后,本地配置并不会动态刷新。这就需要引入另外一个组件了Spring Cloud Bus。动态刷新才是注册中心的灵魂所在。

4、Spring Cloud Bus实现配置动态刷新

4.1、笔者使用AMQP,因此需要在config-server和park的pom.xml文件中引入依赖

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

4.2、在config-server的配置文件中加入以下配置:

management.endpoints.web.exposure.include=*
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

4.3、在park中也加入mq配置,但不需要配置management

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

动态配置的原理就是在ConfigServer中开放一个POST接口,当请求这个接口的时候,会向AMQP中发送一条消息,当ConfigClient收到消息,就会去更新配置。config-server的management配置就是为了暴露POST接口给外部调用。

4.4、修改park的DBConfig代码,在类加上加上一个注解@RefreshScope,只有加上了这个注解才可以收到配置中心发来的动态更新。

5、测试动态配置

通过第4点的 Spring Cloud Bus配置,config-server对外暴露了一个POST接口地址http://localhost:7070/actuator/bus-refresh,当git配置发生变化,只要向这个接口发起一次POST请求就可以了。

测试访问就是在git上面手动修改一个配置的值,然后发起POST请求,再访问http://localhost:8080/db-config看配置是否发生变化。

POST请求命令:

curl -v -X POST "http://localhost:7070/actuator/bus-refresh"

如果没有配置错误的话,当执行这个命令后,配置就已经动态更新了。笔者为了方便,使用了命令行工具curl发起请求,你也可以用postman等工具,效果是一样的。

可爱的你有时会忍不住想,git中每次更改配置后都要执行命令发起请求不是很麻烦?早就有解决办法了,一般git仓库都提供WebHooks功能,只要在WebHooks中配置POST地址就可以了。当然还有另外的方法,比如跟Jenkins或者其它工具集成。

本节代码地址:https://gitee.com/dev-tang/learn-springcloud/tree/sc-07

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:SpringCloud微服务入门(九),统一配置中心Config

本文地址:https://jizhong.plus/post/2020/03/study-springcloud-09.html