spring cloud實戰(三)consul

Consul 介紹

Consul 是 HashiCorp 公司推出的開源工具,用於實現分佈式系統的服務發現與配置。與其它分佈式服務註冊與發現的方案,Consul 的方案更“一站式”,內置了服務註冊與發現框 架、分佈一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其它工具(比如 ZooKeeper 等)。使用起來也較 爲簡單。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X);安裝包僅包含一個可執行文件,方便部署,與 Docker 等輕量級容器可無縫配合。

開始使用Consul

在開始使用Consul前,需要有一個consul server服務註冊中心。本文假設consul server服務已經在localhost:8500啓動。

  1. 在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>
  1. 在配置文件中添加如下內容:
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章