Consul不僅可以作為Spring Cloud中服務的注冊中心,也可以作為其配置中心,這樣一個系統就可以實現服務發現和統一配置,減少系統維護的麻煩,其中在使用Consul作為配置中心使用的過程中可以說是血淚史,參考其他博客大部分含糊其辭,Spring Cloud中文網站,方便大家參考。
Consul配置中心
引入pom依賴
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- consul discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- consul config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<!--configuration-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
依賴說明,創建的maven聚合項目,父pom中引入的Spring Cloud版本為Hoxton.SR3,Spring Boot版本為2.2.5.RELEASE
- actuator:Consul健康檢查模塊,可視化界面需要引入的模塊
- discovery:Consul服務發現模塊
- config:Consul作為配置中心需要的模塊
- configuration:非必須引入,在使用
@ConfigurationProperties注解時,IDEA會提示錯誤Spring Boot Configuration Annotation Processor not Configured,引入當前依賴就好。
創建主啟動類
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigurationProperties(ConfigBean.class)
public class ConsulApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulApplication.class,args);
}
}
- @EnableDiscoveryClient:作為Spring Cloud服務發現客戶端時使用此注解
- @EnableConfigurationProperties(ConfigBean.class):掃描配置類,要指定需要掃描的類否則無法注入,使用@Component注解可以不指定配置類
創建配置類
@Data
@ConfigurationProperties(prefix = "db-config")
@Component
@RefreshScope
public class ConfigBean {
private String driverClassName;
private String url;
private String userName;
private String password;
}
- @ConfigurationProperties(prefix = "db-config"):prefix與Consul服務端k/v存儲的yml前綴保持一致
- @Component:此處使用后,主啟動的@EnableConfigurationProperties(ConfigBean.class)可不指定.class,目的是為了交給Spring管理,可以注入
創建application.yml
application.yml是項目啟動的配置文件,這里只配置Consul作為服務的配置中心,服務注冊中心可以參考spring cloud consul
spring:
application:
name: consul-client
profiles:
active: dev
cloud:
consul:
discovery:
hostname: localhost
port: 8500
health-check-path: /actuator
health-check-interval: 10s
health-check-timeout: 30s
enabled: true
server:
port: 8080
創建bootstrap.yml
注意名稱一定是bootstrap.yml,和application.yml同樣在resources目錄下
這也是博主踩坑的地方,網上很多資料將Consul的spring cloud consul config配置放在服務發現spring cloud consul discovery的配置一塊,項目啟動請求遠程配置信息不會報錯,但是注入為null,最終找了很久才找到原因。
spring:
cloud:
consul:
config:
enabled: true
prefix: config
default-context: consul-client
profile-separator: ','
data-key: data
format: yaml
host: localhost
port: 8500
- enabled:是否啟用consul config的配置項
- prefix:配置文件的存儲的根路徑,默認為config
- default-context:存儲服務時使用的文件目錄名稱,默認為application,一般設置為與spring.application.name相同
- profile-separator:比較難理解的一點,consul創建key值與環境的分隔符默認
, - data-key:配置文件存儲key的值,或者理解為文件的名稱,默認為data
- format:配置文件的文件格式,這里選擇yaml
創建key/value
啟動consul服務端后,訪問http://localhost:8500,在這里創建鍵值對

key:
config/consul-client,dev/data
value:
desc: Consul Confisuration Test
dbconfig:
driverClassName: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:orcl
userName: system
password: orcl
注意:

- 1:與bootstrap.yml中prefix保持一致
- 2:與bootstrap.yml中default-context保持一致
- 3:與bootstrap.yml中profile-separator保持一致
- 4:與application.yml中spring.profiles.active保持一致
- 5:與bootstrap.yml中data-key保持一致
創建測試類
@RestController
public class TestController {
@Resource
private ConfigBean configBean;
@Value("${desc}")
private String desc;
@RequestMapping("/desc")
public String desc(){
return desc;
}
@RequestMapping("/config")
public ConfigBean getUserInfo(){
return configBean;
}
}
訪問http://localhost:8080/desc,查看屬性desc的注入情況
Consul Configuration Test
訪問http://localhost:8080/config,查看ConfigBean的注入情況
{"driverClassName":"oracle.jdbc.driver.OracleDriver","url":"jdbc:oracle:thin:@localhost:1521:orcl","userName":"system","password":"orcl"}
總結
- Consul既可以作為注冊中心,還可以作為配置中心;
- 通過@Value注入的屬性,修改Consul的配置后,屬性不能立即生效,需要服務重啟;
- 通過@ConfigurationProperties注入的屬性,修改consul的配置后,屬性會立即生效;
最后,Consul的官方文檔都有詳細的解釋,查閱資料時一定要選擇合適的資料,建議首先考慮官網。
