天天看點

spring cloud實戰(三)consulConsul 介紹開始使用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/)。

正常情況下我們應該可以從控制台看到我們的服務。

spring cloud實戰(三)consulConsul 介紹開始使用Consul開發聯調

服務注冊失敗

spring cloud實戰(三)consulConsul 介紹開始使用Consul開發聯調

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可以在控制台看到。

spring cloud實戰(三)consulConsul 介紹開始使用Consul開發聯調

springcloud(十三):注冊中心 Consul 使用詳解: http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html

服務注冊發現consul之五:Consul移除失效服務的正确姿勢: https://www.cnblogs.com/duanxz/p/6678694.html

繼續閱讀