Spring Cloud配置中心之Consul


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的官方文檔都有詳細的解釋,查閱資料時一定要選擇合適的資料,建議首先考慮官網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM