1. 程式人生 > >SOFARPC模式下的Consul註冊中心

SOFARPC模式下的Consul註冊中心

 

Consul大家不陌生,就是和Zookeeper、Nacos一夥的,能夠作為微服務基礎架構的註冊中心,算是比較成熟的元件,和Springcloud整合順滑,

考慮到Eureka已經停止更新,所以有必要了解下Consul,看看有啥不一樣的風景。

 

準備:

Idea2019.03/Maven3.6.3/Gradle6.0.1/JDK11.0.4/SofaRPC5.6.5/SofaBoot3.3.1

難度: 新手--戰士--老兵--大師

目標:

  1. SOFARPC模式下使用Consul做註冊中心

步驟:

為了遇見各種問題,同時保持時效性,我儘量使用最新的軟體版本。原始碼地址,其中的day27:https://github.com/xiexiaobiao/dubbo-project

1 特點

Consul的廣告詞:讓服務發現配置更簡單(service discovery & configuration make easy)!

特點:

  1. 低延時的服務註冊和發現,支援HTTP API 模式訪問
  2. 內建的DNS模式替代常規靜態IP模式,方便動態擴充套件服務規模
  3. 支援多資料中心模式,自動故障轉移
  4. 完善的健康檢查以及壞點路由阻斷,具備服務斷路器功能
  5. 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。

全文完!


我的其他文章:

  • 1 八種控制執行緒順序的方法
  • 2 移動應用APP購物車(店鋪系列二)
  • 3 H5開發移動應用APP(店鋪系列一)
  • 4 阿里雲平臺OSS物件儲存
  • 5 Dubbo學習系列之十七(微服務Soul閘道器)

只寫原創,敬請關注