Consul 介紹
Consul 是 HashiCorp 公司推出的開源工具,用於實現分佈式系統的服務發現與配置。與其它分佈式服務註冊與發現的方案,Consul 的方案更“一站式”,內置了服務註冊與發現框 架、分佈一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其它工具(比如 ZooKeeper 等)。使用起來也較 爲簡單。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X);安裝包僅包含一個可執行文件,方便部署,與 Docker 等輕量級容器可無縫配合。
開始使用Consul
在開始使用Consul前,需要有一個consul server服務註冊中心。本文假設consul server服務已經在localhost:8500啓動。
- 在pom.xml中引入Consul依賴,添加如下內容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul</artifactId>
</dependency>
<!-- spring cloud consul client默認使用actuator作爲健康檢查斷點,如果自定義端點可以不用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 在配置文件中添加如下內容:
spring:
application:
name: resource-server-1
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true
instanceId: ${spring.application.name}-${MY_POD_IP}-${server.port}
- spring cloud consul默認使用${spring.application.name}作爲應用名稱,Feign通過這個名稱調用遠程服務,所以這個變量通常需要配置。當然也可以通過spring.cloud.consul.discovery.serviceName定義個性化的名稱。
- ${spring.cloud.consul.host/port}是consul server的地址和端口。一般是個公共服務,不在本地。
- spring cloud consul默認使用hostname註冊健康檢查的地址,比如"localhost:8080/actuator/health",這樣consul server健康檢查顯然會失敗。通過${spring.cloud.consul. prefer-ip-address}使用ip註冊到consul server。
- 默認的instanceId是${spring.application.name}: ${server.port},在生產分佈式服務時id會衝突,我們可以手動配置。
開發聯調
服務註冊與發現的機制比較複雜,我們在開發過程中會遇到各種各樣的問題,需要我們有問題處理能力。我們可以訪問consul server的控制檯觀察服務註冊信息(http://localhost:8500/)。
正常情況下我們應該可以從控制檯看到我們的服務。
服務註冊失敗
consul server通過主動調用client服務實現健康檢查。當我們的springcloud什麼都沒有配置時,我們會看到服務成功註冊了,但監控檢查失敗。consul server後臺可能會報這樣的錯誤:
2019/08/14 01:59:00 [WARN] agent: Check "service:resource-server-1-8081" HTTP request failed: Get http://windows10.microdone.cn:8081/actuator/health: dial tcp: lookup windows10.microdone.cn on 202.96.209.15:53: no such host
這是由於spring cloud consul默認使用hostName(“windows10.microdone.cn”) 作爲健康檢查註冊地址。hostName無法通過DNS解析。我們需要配置通過ip地址註冊:
spring.cloud.consul.discovery.prefer-ip-address=true
這個時候consul server管理界面可能會報這樣的錯誤:
HTTP GET http://172.17.0.1:8081/actuator/health: 404
原因是“/actuator/health”地址不存在,spring cloud consul默認使用Actuator作爲監控端點,我們只需要將其引入到pom.xml中即可。
配置心跳檢測和健康檢查
心跳檢測和健康檢查是兩種不同的存活監控方案。
當我們配置spring.cloud.consul.discovery.heartbeat.enabled=true時,spring cloud使用心跳檢查push機制定期向consul server彙報自身存活情況,逾期沒有彙報則server認爲異常。
當heartbeat.enabled=false時,啓用健康檢查機制。我們可以通過以下參數配置健康檢查的間隔。
spring.cloud.consul.discovery.health-check-interval=1s
服務狀態不對
在開發過程中,如果我們修改配置或服務重啓,可能會發現控制檯上的服務狀態沒有變更。這時我們可以手動刪除服務,重新註冊。
http PUT localhost:8500/v1/agent/service/deregister/{instanceId}
請求地址中instanceId可以在控制檯看到。
springcloud(十三):註冊中心 Consul 使用詳解: http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html
服務註冊發現consul之五:Consul移除失效服務的正確姿勢: https://www.cnblogs.com/duanxz/p/6678694.html