本篇主要介紹了
Spring Boot
如何與Consul
進行整合,Consul 只是服務註冊的一種實現,還有其它的例如 Zookeeper、Etcd 等,服務註冊發現在微服務架構中扮演這一個重要的角色,伴隨著服務的大量出現,服務與服務之間的配置管理、運維管理也變的難以維護,通過 Consul 可以解決這些問題,實現服務治理、服務監控。
關於 Consul 的更多知識點不在這裡贅述,但是在學習本節之前還是希望您能先了解下,請移步我之前寫的 微服務服務註冊發現之 Consul 系列
快速導航
注意:以下程式碼示例可在Github檢視專案完整示例 chapter7-1
新增maven依賴
在 Spring Boot
專案的 pom.xml
檔案中引入 spring-cloud-starter-consul-discovery
啟動器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
複製程式碼
使用 Consul 配置資訊時需要引入 spring-cloud-starter-consul-config
依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
複製程式碼
配置檔案
系統級配置檔案 bootstrap.yml
使用 Spring Cloud Consul Config
,需要配置以下資訊在 bootstrap.yml
檔案
spring.cloud.consul.host
:配置consul地址spring.cloud.consul.port
:配置consul埠spring.cloud.consul.config.prefix
:配置基本檔案,預設值configspring.cloud.consul.config.enabled
:啟動consul配置中心spring.cloud.consul.config.format
:consul上面檔案的格式 YAML、FILES、PROPERTIES、預設 KEY-VALUEspring.cloud.consul.config.data-key
:表示 consul 上面的 KEY 值(或者說檔案的名字),預設是 data
bootstrap.yml
spring:
cloud:
consul:
host: 192.168.6.128
port: 8500
config:
prefix: config
enabled: true
format: YAML
data-key: user
複製程式碼
應用級配置檔案 application.yml
定義應用級別的配置在 bootstrap.yml
之後載入,例如搭配 spring-cloud-config
使用。
spring.cloud.consul.host
:配置consul地址spring.cloud.consul.port
:配置consul埠spring.cloud.consul.discovery.enabled
:啟用服務發現spring.cloud.consul.discovery.register
:啟用服務註冊spring.cloud.consul.discovery.deregister
:服務停止時取消註冊spring.cloud.consul.discovery.prefer-ip-address
:表示註冊時使用IP而不是hostnamespring.cloud.consul.discovery.health-check-interval
:健康檢查頻率spring.cloud.consul.discovery.health-check-path
:健康檢查路徑spring.cloud.consul.discovery.health-check-critical-timeout
:健康檢查失敗多長時間後,取消註冊spring.cloud.consul.discovery.instance-id
:服務註冊標識
server:
port: 8082
spring:
application:
name: consul-service
profiles:
active: dev
cloud:
consul:
host: 192.168.6.128
port: 8500
discovery: # 服務發現配置
enabled: true
register: true
deregister: true
prefer-ip-address: true
health-check-interval: 10s
health-check-critical-timeout: 30s
health-check-path: /health
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} # 應用名稱+伺服器IP+埠
複製程式碼
配置Consul管理控制檯
Consul
提供了 Key/Value
儲存用於儲存配置資料,在 Spring Cloud Consul
中配置預設儲存於 /config
資料夾下,根據應用程式名和模擬 Spring Cloud Config
順序解析屬性的規則來配置檔案。
在本例中操作 Consul 管控臺建立以下路徑配置:
config
:為配置基本檔案,這裡預設為config
。consul-service
:為application.yml
中配置的spring.application.name
值。dev
:為application.yml
中配置的spring.profiles.active
值,也是本程式設定環境變數意為開發環境。user.yml
:為配置的檔名,格式為yml
格式。
config/consul-service.dev/user.yml
複製程式碼
最終為 Consul 管控臺建立的配置資料如下圖所示:
專案構建
注意:以下只貼核心程式碼,原始碼參見:Github chapter7-1
建立Config獲取Consul配置資料
- 獲取student配置資料
注意以下屬性名要與在 Consul 管控臺中配置的一一對應。
@ConfigurationProperties
進行屬性注入
config/StudentConfig.java
@ConfigurationProperties(prefix = "student")
public class StudentConfig {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "大家好我是" + name + ",今年" + age + "歲,我是一名在校大學生!";
}
}
複製程式碼
- 獲取teach配置資料
同以上 student 配置,我們可以將不同型別的配置分檔案進行配置定義
@ConfigurationProperties(prefix = "teach")
public class TeachConfig {
private String name;
private String course;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
@Override
public String toString() {
return "大家好我是" + name + ",是一名大學老師!教同學們學習" + course;
}
}
複製程式碼
編寫啟動類呼叫配置
註解說明:
EnableDiscoveryClient
:讓註冊中心進行服務發現,將服務註冊到服務元件上。RestController
:是@ResponseBody
和@Controller
註解的組合,註明該註解後整個類所有的方法返回值為json格式。SpringBootApplication
:SpringBoot 的啟動註解。EnableConfigurationProperties
:屬性配置的 class 新增到 SpringBoot 的屬性配置註解裡,否則不能通過@Autowired
註解注入我們定義的屬性配置類。
介面說明:
/health
:健康檢查介面/user/description
:@Value 註解獲取使用者資訊描述介面/user/student/intro
:@ConfigurationProperties 獲取學生簡介資訊介面/user/teach/intro
:@ConfigurationProperties 獲取教師簡介資訊介面
@EnableDiscoveryClient
@RestController
@SpringBootApplication
@EnableConfigurationProperties({ StudentConfig.class, TeachConfig.class })
public class ConsulApplication {
@Value("${description}")
private String description;
@Autowired
private StudentConfig studentConfig;
@Autowired
private TeachConfig teachConfig;
@GetMapping("/health")
public String Health() {
System.out.println("health");
return "OK";
}
@GetMapping("/user/description")
public String Description() {
return description;
}
@GetMapping("/user/student/intro")
public String StudentIntro() {
return studentConfig.toString();
}
@GetMapping("/user/teach/intro")
public String TeachIntro() {
return teachConfig.toString();
}
public static void main(String[] args) {
SpringApplication.run(ConsulApplication.class, args);
}
}
複製程式碼
介面測試
- 健康檢查介面
該介面在服務啟動後且向 Consul 配置中心註冊後,根據 application.yml 檔案配置的 health-check-interval 和 health-check-path屬性進行自動呼叫。
$ curl http://127.0.0.1:8082/health
OK!
複製程式碼
註冊成功後展示我們服務的名稱及健康檢查結果如下:
- 獲取教師簡介配置介面
$ curl http://127.0.0.1:8082/user/teach/intro
大家好我是Teach Li,是一名大學老師!教同學們學習Java軟體開發!
複製程式碼
- 獲取學生簡介配置介面
$ curl http://127.0.0.1:8082/user/student/intro
大家好我是Jack,今年18歲,我是一名在校大學生!
複製程式碼
- 採用 @Value 註解獲取專案描述介面
$ curl http://127.0.0.1:8082/user/description
使用者資訊描述
複製程式碼
總結
這裡我們只介紹了 Consul 在 Spring Boot 的配置功能,關於 Consul 做為註冊中心在下一章節中介紹,本篇中需要注意通過 @Value 注入的屬性,修改 Consul 後需要重啟服務才能生效,通過 @ConfigurationProperties 注入的屬性,在 Consul 管控臺修改屬性之後可立即生效。
如遇到其他什麼可在SpringBoot-Course issues中提問
資料
- 個人部落格: Node.js技術棧
- Spring Boot 實戰系列:github.com/Q-Angelo/Sp…
- 專案原始碼: Github檢視本文完整示例 chapter7-1
作者:五月君
連結:www.imooc.com/article/286…
來源:慕課網