SpringCloud使用Consul作为配置中心

发布时间 2023-04-08 19:46:37作者: shigp1

Consul提供了一个key/value存储,用于存储配置和其他元数据。Spring Cloud Consul Config是Config Server和Client的替代方案。在特殊的“bootstrap”阶段,配置被加载到Spring环境中。默认情况下,配置存储在/config文件夹中。根据应用程序的名称和模拟Spring Cloud配置顺序解析财产的活动配置文件创建多个PropertySource实例。例如,一个名为“testApp”、配置文件为“dev”的应用程序将创建以下属性源:

config/testApp,dev/
config/testApp/
config/application,dev/
config/application/

最具体的属性源在顶部,最不具体的在底部。config/application文件夹中的配置适用于所有使用consul进行配置的应用程序。config/testApp文件夹中的配置仅对名为“testApp”的服务实例可用。

Consul增加配置

打开Consul界面,选中key/value,图示如下

 
点击右边Create按钮

文件夹要以/结尾。在config下新建consumer-dev文件夹,consumer是服务名,dev是所使用的环境,在consumer-dev新建配置文件:

key填consumerConfig,value填写配置数据。

SpringCloud整合Consul作配置中心

Consumer引入依赖:

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

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

因为SpringCloud2020移除了spring-cloud-starter-bootstrap,要使用bootstrap.properties必须手动添加spring-cloud-starter-bootstrap依赖。将原来的application.properties内容移动到bootstrap.properties中:

server.port=8001
management.endpoints.web.exposure.include=*
spring.application.name=consumer
spring.cloud.consul.config.enabled=true
# 设置配置的基本文件夹,默认值config 可以理解为配置文件所在的最外层文件夹
spring.cloud.consul.config.prefixes=config
#设置应用的文件夹名称,默认值application 一般建议设置为微服务应用名称
spring.cloud.consul.config.default-context=${spring.application.name}
#配置环境分隔符,默认值","和default-context配置项搭配
spring.cloud.consul.config.profile-separator=-
#指定配置格式为yamL
spring.cloud.consul.config.format=yaml
#Consul Key/Values 中的Key, Value 对应整个配置文件
spring.cloud.consul.config.data-key=consumerConfig



spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

spring.cloud.consul.discovery.metadata.myfield=myvalue
spring.cloud.consul.discovery.metadata.anotherfield=anothervalue

spring.cloud.consul.discovery.instance-id=${spring.application.name}-${server.port}-${random.value}


spring.profiles.active=dev

在controller中使用:

@Value("${field}")
private String field;

@RequestMapping("/getField")
public String getField() {
    return field;
}

访问http://localhost:8001/getField,得到123

 
 

Consul配置监视利用了Consul监视密钥前缀的功能。Config Watch进行阻塞Consul HTTP API调用,以确定当前应用程序的任何相关配置数据是否已更改。如果有新的配置数据,则会发布“刷新事件”。这相当于调用/refresh执行器端点。Consul配置自动刷新的参数有三个:

spring.cloud.consul.config.watch.enabled=true  #开启配置自动刷新
spring.cloud.consul.config.watch.delay=1000    #配置自动刷新的间隔时间
spring.cloud.consul.config.watch.wait-time=55

上面三个参数都是默认值。

 

更改Consul配置中的field为1234567,访问http://localhost:8001/getField发现配置不是最新的。因为Controller类上没加@RefreshScope。加上重启后,再更改Consul配置中的field为1234567890,发现配置已是最新的。

快速失败

在某些情况下(如本地开发或某些测试场景),如果consul不可用于配置,则不失败可能很方便。设置spring.cloud.consu.config.fail-fast=false将导致配置模块记录警告,而不是引发异常。这将允许应用程序继续正常启动。

使用@ConfigurationProperties

增加配置如下:

新建配置类:

@ConfigurationProperties(prefix = "user")
@Component
public class UserConfig {

    private String name;


    private Integer age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserConfig{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

启动类添加@EnableConfigurationProperties,Controller使用:

@Autowired
private UserConfig userConfig;


@RequestMapping("/getUserConfig")
public String getUserConfig() {
    return userConfig.toString();
}

访问http://localhost:8001/getUserConfig,得到UserConfig{name='张三', age=18}。更改Consul配置中的age为20,访问访问http://localhost:8001/getUserConfig,得到UserConfig{name='张三', age=20},配置自动更新生效。controller要加@RefreshScope。