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/)。
正常情況下我們應該可以從控制台看到我們的服務。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL5Z1RkVnVyk1aKNjYz40MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxITM4MDOwATM1EDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
服務注冊失敗
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
服務狀态不對
在開發過程中,如果我們修改配置或服務重新開機,可能會發現控制台上的服務狀态沒有變更。這時我們可以手動删除服務,重新注冊。
curl -v -X 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