1. Consul介紹
Consul是由HashiCorp公司使用Go語言開發的一款開源工具,主要用于實現分布式系統的服務發現和服務配置,其內置了服務注冊與發現框架、分布式一致性協議實現、健康檢查、Key-Value存儲、多數據中心方案。Consul具有高可移植性,支持Linux、Windows和Max OS X等多個操作系統,其安裝包只是一個可執行文件,方便部署,也可與Docker等輕量級容器無縫配合。Consul使用Raft算法來保證一致性,相比使用Paxos算法更簡單。更多詳情,可以參閱Consul官網
2. 多種注冊中心比較
項目 | Eureka | Consul | ETCD | Zookeeper | Nacos |
---|---|---|---|---|---|
編寫語言 | Java | Go | Go | Java | Java |
客戶端支持 | HTTP | HTTP、DNS | HTTP、Etcd3、gRPC | 跨語言弱,Curator組件 | HTTP、動態DNS、UDP |
服務健康檢查 | 需要顯示配置健康檢查 | 提供詳細的服務狀態、內存、硬盤檢查 | 連接心跳 | 長連接、Keepalive | TCP/HTTP/MySQL |
多數據中心 | 無 | 通過WAN的Gossip協議支持 | 無 | 無 | 支持單機模式、多集群模式 |
Key-Value存儲 | 無 | 支持 | 支持 | 支持 | 支持 |
一致性 | 只能保證最終一致性,不能保證強一致性 | Raft | Raft | Paxos | Raft |
CAP | AP | AP | CP | CP | CP/AP |
Watch支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
自身監控 | Metrics | Metrics | Metrics | 使用第三方組件 | Metrics |
安全 | ACL | ACL/HTTPS | HTTPS | ACL | ACL/HTTPS |
Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 | 支持 |
3. Consul下載與安裝
3.1. Consul下載
進入Consul官網,如下圖:
點擊Download進入下載頁面
選擇適合的系統和版本,這里使用Windows系統,386對應的是32位操作系統,AMD64對應的是64位操作系統。
3.2. Consul安裝
下載后解壓到指定文件夾,可以看到consul.exe的文件,在安裝文件路徑下使用cmd命令符,使用consul --version
查看版本號
如果可看到版本號信息,表明下載的Consul安裝軟件適用于本安裝系統,使用consul agent -dev
啟動Consul
-dev 表示以開發模式運行,-server 表示以服務器模式運行
在瀏覽器地址欄輸入http://localhost:8500/,進入Consul管理頁面
4. Spring Cloud集成Consul
4.1. 版本說明
本文使用最新的SpringBoot和SpringCloud版本
JDK:17
Maven:3.9.6
SpringBoot:3.2.3
SpringCloud:2023.0.0
4.2. 引入核心依賴
在pom.xml文件中引入consul依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
4.3. 配置consul訪問地址
在application.yml文件中配置consul訪問地址
spring:cloud:consul:host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}
4.4. 主啟動類
在主啟動類上添加注解@EnableDiscoveryClient
即可
4.5. 驗證
啟動服務,查看consul控制臺頁面
5. 問題處理
問題1:控制臺啟動成功了,Consul管理端依然提示錯誤
解決:在pom.xml中引入actuator依賴,這是因為consul需要actuator提供服務的健康檢查
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
問題2:提示移除commons-logging.jar
解決:在consul依賴中移除這個依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions>
</dependency>
問題3:啟動服務后,控制臺出現大量WARN警告
解決:這是spring-cloud-commons存在的問題,將spring cloud的組件排除掉,直接引用新的commons依賴,該問題會在spring cloud下個版本中解決,到時就不需要額外引入spring-cloud-commons依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId><version>4.1.1</version><scope>compile</scope>
</dependency>