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。
标签:SpringCloud,Consul,配置,spring,config,consul,cloud From: https://www.cnblogs.com/shigongp/p/17298873.html