Consul大家不陌生,就是和Zookeeper、Nacos一伙的,能夠作為微服務基礎架構的注冊中心,算是比較成熟的組件,和Springcloud集成順滑,
考慮到Eureka已經停止更新,所以有必要了解下Consul,看看有啥不一樣的風景。
准備:
Idea2019.03/Maven3.6.3/Gradle6.0.1/JDK11.0.4/SofaRPC5.6.5/SofaBoot3.3.1
難度: 新手--戰士--老兵--大師
目標:
- SOFARPC模式下使用Consul做注冊中心
步驟:
為了遇見各種問題,同時保持時效性,我盡量使用最新的軟件版本。源碼地址,其中的day27:https://github.com/xiexiaobiao/dubbo-project
1 特點
Consul的廣告詞:讓服務發現配置更簡單(service discovery & configuration make easy)!
特點:
- 低延時的服務注冊和發現,支持HTTP API 模式訪問
- 內建的DNS模式替代常規靜態IP模式,方便動態擴展服務規模
- 支持多數據中心模式,自動故障轉移
- 完善的健康檢查以及壞點路由阻斷,具備服務斷路器功能
- K/V存儲,可用於設置屬性
2 linux安裝
2.1 基礎架構
每個運行consul的節點為一個agent,可以是client或server模式,每個數據中心必須擁有至少一台server來保存consul集群狀態信息,建議在生產環境
下一個集群中有3或5個server,這在容錯和性能上能較好平衡。
client模式是一個非常輕量級的進程,用於注冊服務,運行健康檢查和轉發對server的查詢。集群中每台主機上都必須運行client用以獲取服務的健康信息。
2.2 單機模式
下載,略!
我使用consul_1.7.2_linux_amd64.zip
,並使用 unzip 解壓到提前建立的目錄: /usr/consul
,解壓后只有一個 consul 文件:
將此consul文件放到PATH下的任意某個目錄,我這里放到usr/local/bin下:
運行 consul 命令出現以下即為安裝成功!
運行為單機dev模式:所有信息保存在內存中,無任何持久化。
[root@server224 consul]# consul agent –dev
查看數據中心的節點信息:
[root@server224 consul]# consul members
HTTP API方式查詢,請求會自動轉發到server上:
[root@server224 consul]# curl localhost:8500/v1/catalog/nodes
DNS 方式查詢:
[root@server224 consul]# dig @127.0.0.1 -p 8600 server224.node.consul
命令行方式關閉agent:
[root@server224 consul]# consul leave
注意:執行 leave 命令后,Consul能感知到該節點的離開,上面運行的服務和相關的檢查將從目錄(catalog)中移除,Consul也不會再聯系該節點。
若使用kill命令強制關閉agent進程,其他節點將認為此節點失效而不是離開,並將該節點健康狀態標記為危險(critical),但不會從目錄中刪除,
Consul會自動嘗試重連該節點,認為有可能是網絡故障的原因。作為server的agent節點,優雅的關閉還是很重要的,可以避免可用性故障影響到一致性協議。
2.3 集群模式
在linux虛擬機 10.10.10.220(hostname: server224) 上啟動server模式:
注意:
1 啟動agent時參數配置方式有兩種,“命令行” 和 “配置文件”,兩者等效;
2 命令行參數 config-dir
,即按字母順序加載目錄下所有的".json" 或 ".hcl"文件,config-file
指定具體某個配置文件;
為了使用配置文件方式,我先建立一個配置文件(這是個基礎配置文件,故我加了一個a前綴,能被優先加載):/etc/consul.d/a_consul_config.json
運行linux命令即可(運行時請去掉注釋):
echo '{
"datacenter": "dc1",
"node_name": "hdp3", // 需唯一
//"server": true, 若不指定為服務端,則默認為客戶端
// "bootstrap_expect": 3, 只在server模式有效,指該DC下的server數,要么不指定,要么必須是准確的數值
"data_dir": "/tmp/consul",
"log_level": "DEBUG",
"enable_syslog": true, // 記錄為系統日志,僅linux下使用
"enable_script_checks": true, // 腳本檢查
"bind_addr": "10.10.10.226", // 監聽地址,
"client_addr": "10.10.10.226" // UI訪問地址
}' > /etc/consul.d/a_consul_config.json
運行:
命令行啟動:以下則和上面的配置文件中有部分重復的項 (僅為演示使用):
[root@server224 consul]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=hdp2 -bind=10.10.10.220 -config-dir /etc/consul.d -ui -client=10.10.10.220
運行命令行:-server指定為server端,-ui啟動webUI,-config-dir指定配置文件目錄
[root@server224 consul]# consul agent -server -ui -bootstrap-expect 1 -data-dir /tmp/consul -config-dir /etc/consul.d
在10.10.10.226(hostname: server226) 上啟動client:
建立一樣的配置文件,並修改node_name,ip等信息,注意去掉client_addr,否則本機上無法使用consul members命令,然后命令行啟動:
[root@server226 consul]# consul agent -data-dir /tmp/consul -config-dir /etc/consul.d
因沒有連接server會輸出:
2020-03-22T02:40:28.343+0800 [ERROR] agent.anti_entropy: failed to sync remote state: error="No known Consul servers"
手動加入集群:
[root@server226 ~]# consul join 10.10.10.220
查詢集群成員信息:
Web端訪問server端:
http://10.10.10.220:8500/
可以看到兩個成員,其中一個是星標的leader,
健康檢查腳本,略!自動加入集群配置,略!
3 實戰使用
Dubbo + consul做注冊中心,dubbo官方沒建議此組合,我自己嘗試了半天,但各種報錯,因此棄用!至於springcloud + consul組合,資料已經泛濫,
在此不表,我這里使用螞蟻金服的SOFARPC+consul來做代碼演示: 整體部署圖:
新建一個maven項目,三個模塊,provider(提供服務)/consumer(使用服務)/common(公共接口),核心代碼部分:
com.biao.study.provider.AnnotationServiceImpl
@SofaService(interfaceType = CommonHelloService.class, bindings = { @SofaServiceBinding(bindingType = "bolt") }) @Component public class CommonHelloServiceImpl implements CommonHelloService { @Override public String sayAnnotation(String string) { return "hello -- " + string; } }
以上代碼中,使用的SOFARPC的注解模式,@SofaService 標注該component為RPC服務,使用的是bolt協議,然后在 src/main/resources/application.properties 中通過指定consul為注冊中心:
com.alipay.sofa.rpc.registry.address=consul://10.10.10.220:8500
核心代碼部分: com.biao.study.consumer.AnnotationClientImpl
@Component(value = "helloSyncServiceReference") public class AnnotationClientImpl implements AnnotationClient { @SofaReference(interfaceType = CommonHelloService.class, binding = @SofaReferenceBinding(bindingType = "bolt")) private CommonHelloService commonHelloService; public String sayClientAnnotation(String str) { String result = commonHelloService.sayAnnotation(str); return result; } }
以上代碼中,@SofaReference 標注引用公共服務,和dubbo模式十分相似,@SofaReferenceBinding標注協議類型。
先運行provider,再運行consumer,輸出以下即大功告成!
再訪問consul web,即可看到服務信息:
可以看出區別於Nacos的是這里只有服務提供方信息。
服務的元數據信息:
問題:
1 window端無法訪問consul的web界面,先請檢查linux防火牆,是否阻止了8500端口,可以先ping一下測試,然后看consul agent啟動時命令行有沒有漏掉參數 –ui,
這樣才會啟動web界面,最后是看consul agent啟動后,client的Client Addr 是否為127.0.0.1,如這樣只能在虛機內部打開web,因此命令行需通過-client=10.10.10.220,
或者配置文件client_addr 屬性指定為虛機真實IP。
全文完!
我的其他文章:
只寫原創,敬請關注