Conusl可以作为注册中心,也可以作为配置中心。
作为配置中心,使用起来也很方便,大多数都是配置。
Consul的安装这里不说了,主要是说明java后端怎么使用,所以本次采用windows版本的consul。
引入和配置
2个文件:
pom配置:
<!-- consul配置中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<!-- 使用 @EnableConfigurationProperties 开启 @ConfigurationProperties 注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
bootstrap.yml
spring:
profiles:
active: dev
cloud:
consul:
host: 127.0.0.1 #注册中心的ip或host。也是集群地址,配置一个即可。注释掉整个consul这段就可以启动,即使没有注册中心也不报错。有这段就必须有一个可用的注册中心,否则启动报错
port: 8500
discovery:
enabled: true #默认true。Consul Discovery Client是否注册到注册中心。和register同时设置成false,就不需要起consul服务。
register: true #是否将服务注册到Consul集群中心.。这个参数和上面的enabled参数同时设置成false,应用才不会注册注册中心,才可以不起consul服务!
deregister: true #默认true,服务停止时注销服务,即从服务列表中删除。设置成false的话,???
#service-name: ${spring.application.name} #注册在consul上面的名字,在consul的调用中,是通过此名字调用的。默认服务名,不要改
instance-id: ${spring.application.name}-${spring.cloud.client.ip-address}:${server.port} #只供显示用,在ID列显示
health-check-interval: 5s #配置 Consul 健康检查频率,也就是心跳频率。
# health-check-critical-timeout: 2s #健康检查失败多长时间后,取消注册。在node上显示红色叉。配了这个参数,如果consul集群的server重启会注销应用!
#健康检查路径。默认是使用actuator的健康检查接口:http://localhost:8901/actuator/health返回{"status":"UP"}。其实只看http状态码是200就认为服务正常。你可以换成自己的一个rest接口替代actuator
#health-check-path: /hello
prefer-ip-address: true #表示注册时使用IP而不是hostname
retry:
initial-interval: 5000 # 服务监测时间间隔
max-attempts: 20
#consul作为配置中心,官网属性https://docs.spring.io/spring-cloud-consul/docs/2.2.4.RELEASE/reference/html/appendix.html
config:
enabled: true # 启用 consul 配置中心.默认是true
format: YAML # 配置转码方式,默认 key-value,其他可选:yaml/files/properties
data-key: data # 配置 key 值,value 对应整个配置文件。例如config/application,dev/data
prefix: config # 基础文件夹,默认值 config.
default-context: one #应用文件夹,默认值 application,consul 会加载 config/<applicationName> 和 config/<defaultContext> 两份配置,设置为相同值,则只加载一份.sets the folder name used by all applications
# profile-separator: '-' #环境分隔符,默认值 ",例如例如config/application,dev/data修改后是config/application-dev/data
watch:
enabled: true # 启用配置自动刷新
delay: 1000 # 刷新频率,单位:毫秒
servlet:
multipart:
enabled: true
max-file-size: 100MB
max-request-size: 300MB
到此为止,consul作为配置中心就可以使用了。
要注意,consul作为配置中心,一些配置项在应用启动的时候就需要加载和初始化了,所以consul的配置必须写在bootstrap.yml
我们可以将welcom.value属性写入配置文件中,但要注意,配置中心的配置优先级高于本地配置文件.
如果本地配置文件不存在,配置中心也没有,启动会报错的.
注意,需要变更配置的类上,要加@RefreshScope注解,否则不会刷新配置。
(网上有人做实验,就是没有加@RefreshScope注解,所以才说@Value不会刷新consul修改后的值,只有@ConfigurationProperties才会。原因就是没有加@RefreshScope注解)
先说结论:consul作为配置中心,既然必须配置在bootstrap.yml,那地址只能写死了。如果有多个环境怎么办?其实一个配置中心也是支持多个环境的,配置中心就是把原来使用的bootstrap.yml,application.yml,application-dev.yml,application-test.yml搬到了consul的内存中而已,并且取值的优先级比这些配置文件高,其他使用并没有区别。
那么多个环境还是跟以前一样,通过
spring:
profiles:
active: dev
指定使用哪套配置就行了,没必要每个环境搭建一套consul。
实际情况,我们确实每个环境搭建了一套consul,毕竟生产环境和开发环境是物理隔离的。
对于bootstrap.yml里我们必须要按环境分开配置的项怎么办?我们可以使用环境变