分佈式服務註冊中心XXL-REGISTRY

《分佈式服務註冊中心XXL-REGISTRY》

Build Status
Docker Status
Maven Central
GitHub release
License
donate

1、簡介

1.1 概述

XXL-REGISTRY 是一個輕量級分佈式服務註冊中心,擁有"輕量級、秒級註冊上線、多環境、跨語言、跨機房"等特性。現已開放源代碼,開箱即用。html

1.2 特性

  • 一、輕量級:基於DB與磁盤文件,只須要提供一個DB實例便可,無第三方依賴;
  • 二、實時性:藉助內部廣播機制,新服務上線、下線,能夠在1s內推送給客戶端;
  • 三、數據同步:註冊中心會按期全量同步數據至磁盤文件,清理無效服務,確保服務數據實時可用;
  • 四、性能:服務發現時僅讀磁盤文件,性能很是高;服務註冊、摘除時經過磁盤文件校驗,防止重複註冊操做;
  • 五、擴展性:可方便、快速的橫向擴展,只需保證服務註冊中心配置一致便可,可藉助負載均衡組件如Nginx快速集羣部署;
  • 六、多狀態:服務內置三種狀態:
    • 正常狀態=支持動態註冊、發現,服務註冊信息實時更新;
    • 鎖定狀態=人工維護註冊信息,服務註冊信息固定不變;
    • 禁用狀態=禁止使用,服務註冊信息固定爲空;
  • 七、跨語言:註冊中心提供HTTP接口(RESTFUL 格式)供客戶端實用,語言無關,通用性更強;
  • 八、兼容性:項目立項之初是爲XXL-RPC量身設計,可是不限於XXL-RPC使用。兼容支持任何服務框架服務註冊實用,如dubbo、springboot等;
  • 九、跨機房:得益於服務註冊中心集羣關係對等特性,集羣各節點提供冪等的配置服務;所以,異地跨機房部署時,只須要請求本機房服務註冊中心便可,實現異地多活;
  • 十、容器化:提供官方docker鏡像,並實時更新推送dockerhub,進一步實現 "服務註冊中心" 產品開箱即用;
  • 十一、訪問令牌(accessToken):爲提高系統安全性,註冊中心和客戶端進行安全性校驗,雙方AccessToken匹配才容許通信;

1.3 下載

文檔地址

源碼倉庫地址

源碼倉庫地址 Release Download
https://github.com/xuxueli/xxl-registry Download
https://gitee.com/xuxueli0323/xxl-registry Download

技術交流

1.4 環境

  • Maven3+
  • Jdk1.7+
  • Mysql5.6+

2、快速入門

2.1 初始化 "服務註冊中心" 數據庫

請下載項目源碼並解壓,獲取 "服務註冊中心" 數據庫初始化SQL腳本並執行便可java

數據庫初始化SQL腳本位置爲:mysql

/xxl-registry/doc/db/xxl-registry-mysql.sql

"服務註冊中心" 支持集羣部署,集羣狀況下各節點務必鏈接同一個mysql實例;nginx

2.2 編譯項目

解壓源碼,按照maven格式將源碼導入IDE, 使用maven進行編譯便可,源碼結構以下:git

- /doc
- /xxl-registry-admin       :分佈式服務中心
- /xxl-registry-client      :客戶端核心依賴;

2.3 配置部署「服務註冊中心」

步驟一:配置項目:

配置文件地址:github

/xxl-registry/xxl-registry-admin/src/main/resources/application.properties

消息中心配置內容說明:spring

### 數據庫配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-registry?Unicode=true&characterEncoding=UTF-8

### 服務註冊數據磁盤同步目錄
xxl.registry.data.filepath=/data/applogs/xxl-registry/registrydata

### 登錄信息配置
xxl.registry.login.username=admin
xxl.registry.login.password=123456

步驟二:部署項目:

若是已經正確進行上述配置,可將項目編譯打包部署。
訪問地址:http://localhost:8080/xxl-registry-admin (該地址接入方項目將會使用到,做爲註冊地址),登陸後運行界面以下圖所示sql

輸入圖片說明

至此「服務註冊中心」項目已經部署成功。docker

步驟三:服務註冊中心集羣(可選):

服務註冊中心支持集羣部署,提高消息系統容災和可用性。數據庫

集羣部署時,幾點要求和建議:

  • DB配置保持一致;
  • 登錄帳號配置保持一致;
  • 建議:推薦經過nginx爲集羣作負載均衡,分配域名。訪問、客戶端使用等操做均經過該域名進行。

其餘:Docker 鏡像方式搭建消息中心:

  • 下載鏡像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-registry-admin/
docker pull xuxueli/xxl-registry-admin
  • 建立容器並運行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-registry-admin  -d xuxueli/xxl-registry-admin

/**
* 如需自定義 mysql 等配置,可經過 "PARAMS" 指定,參數格式 RAMS="--key=value  --key2=value2" ;
* 配置項參考文件:/xxl-registry/xxl-registry-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-registry?Unicode=true&characterEncoding=UTF-8" -p 8080:8080 -v /tmp:/data/applogs --name xxl-registry-admin  -d xuxueli/xxl-registry-admin

2.4 接入 "服務註冊中心" 示例

a、XXL-RPC 接入示例;

XXL-RPC默認將 "XXL-REGISTRY" 做爲原生註冊中心。可前往 XXL-RPC (https://github.com/xuxueli/xxl-rpc ) 示例項目參考如何接入 "XXL-REGISTRY" 。

b、其餘Java語言項目接入示例;

客戶端maven依賴地址:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-registry-client</artifactId>
    <version>${最新穩定版}</version>
</dependency>

其餘Java服務框架,能夠藉助原生提供的客戶端JAR包快速接入使用,建議參考 XXL-RPC 提供的實例項目;

客戶端JAR包內封裝了與註冊中心API服務交互的客戶端代碼,原生提供兩個客戶端類供實用:

  • 基礎客戶端類(com.xxl.registry.client.XxlRegistryBaseClient):藉助該客戶端類,可方便的與註冊中心進行註冊數據交互,如:服務註冊、續約、摘除、發現服務、監控等等;
  • 加強客戶端類(com.xxl.registry.client.XxlRegistryClient):該類爲加強版本客戶端類,內置客戶端服務續約線程和服務註冊信息監控線程。
    經過該客戶端類註冊的服務,底層線程將會主動維護續約操做,經過該客戶端類發現的服務信息,底層線程將會主動按期刷新並實時監控變動。
    同時對服務數據進行緩存處理,業務方可放心實用不用擔憂性能問題。

客戶端API實用示例代碼以下:

// 註冊中心客戶端(基礎類)
XxlRegistryBaseClient registryClient = new XxlRegistryBaseClient("http://localhost:8080/xxl-registry-admin/", null, "xxl-rpc", "test");

// 註冊中心客戶端(加強類)
XxlRegistryClient registryClient = new XxlRegistryClient("http://localhost:8080/xxl-registry-admin/", null, "xxl-rpc", "test");
 

// 服務註冊 & 續約:
List<XxlRegistryDataParamVO> registryDataList = new ArrayList<>();
registryDataList.add(new XxlRegistryDataParamVO("service01", "address01"));
registryDataList.add(new XxlRegistryDataParamVO("service02", "address02"));

registryClient.registry(registryDataList);


// 服務摘除:
List<XxlRegistryDataParamVO> registryDataList = new ArrayList<>();
registryDataList.add(new XxlRegistryDataParamVO("service01", "address01"));
registryDataList.add(new XxlRegistryDataParamVO("service02", "address02"));

registryClient.remove(registryDataList);


// 服務發現:
Set<String> keys = new TreeSet<>();
keys.add("service01");
keys.add("service02");

Map<String, TreeSet<String>> serviceData = registryClient.discovery(keys);


// 服務監控:
Set<String> keys = new TreeSet<>();
keys.add("service01");
keys.add("service02");

registryClient.monitor(keys);

其餘Java服務框架,如dubbo、springboot等,接入 "XXL-REGISTRY" 的示例項目,後續將會整理推出。

c、非Java語言項目接入;

非Java語言項目,能夠藉助提供的 RESTFUL 格式API接口實現服務註冊與發現功能。

參考章節 "3、註冊中心API服務"

3、註冊中心API服務(RESTFUL 格式)

服務註冊中心爲支持服務註冊與發現功能,提供的 RESTFUL 格式API接口以下:

3.一、服務註冊 & 續約 API

說明:新服務註冊上線1s內廣播通知接入方;須要接入方循環續約,不然服務將會過時(三倍於註冊中心心跳時間)下線;

地址格式:{服務註冊中心跟地址}/registry

請求參數說明:
 一、accessToken:請求令牌;
 二、biz:業務標識
 二、env:環境標識
 三、registryDataList:服務註冊信息

請求數據格式以下,放置在 RequestBody 中,JSON格式:
 
    {
        "accessToken" : "xx",
        "biz" : "xx",
        "env" : "xx",
        "registryDataList" : [{
            "key" : "service01",
            "value" : "address01"
        }]
    }

3.二、服務摘除 API

說明:新服務摘除下線1s內廣播通知接入方;

地址格式:{服務註冊中心跟地址}/remove

請求參數說明:
 一、accessToken:請求令牌;
 二、biz:業務標識
 二、env:環境標識
 三、registryDataList:服務註冊信息

請求數據格式以下,放置在 RequestBody 中,JSON格式:
 
    {
        "accessToken" : "xx",
        "biz" : "xx",
        "env" : "xx",
        "registryDataList" : [{
            "key" : "service01",
            "value" : "address01"
        }]
    }

3.三、服務發現 API

說明:查詢在線服務地址列表;

地址格式:{服務註冊中心跟地址}/discovery

請求參數說明:
 一、accessToken:請求令牌;
 二、biz:業務標識
 二、env:環境標識
 三、keys:服務註冊Key列表
 
請求數據格式以下,放置在 RequestBody 中,JSON格式:
 
    {
        "accessToken" : "xx",
        "biz" : "xx",
        "env" : "xx",
        "keys" : [
            "service01",
            "service02"
        ]
    }

3.四、服務監控 API

說明:long-polling 接口,主動阻塞一段時間(三倍於註冊中心心跳時間);直至阻塞超時或服務註冊信息變更時響應;

地址格式:{服務註冊中心跟地址}/monitor

請求參數說明:
 一、accessToken:請求令牌;
 二、biz:業務標識
 二、env:環境標識
 三、keys:服務註冊Key列表
 
請求數據格式以下,放置在 RequestBody 中,JSON格式:
 
    {
        "accessToken" : "xx",
        "biz" : "xx",
        "env" : "xx",
        "keys" : [
            "service01",
            "service02"
        ]
    }

4、系統設計

4.1 系統架構圖

輸入圖片說明

4.2 原理解析

XXL-REGISTRY內部經過廣播機制,集羣節點實時同步服務註冊信息,確保一致。客戶端藉助 long pollong 實時感知服務註冊信息,簡潔、高效;

4.3 跨機房(異地多活)

得益於服務註冊中心集羣關係對等特性,集羣各節點提供冪等的服務註冊服務;所以,異地跨機房部署時,只須要請求本機房服務註冊中心便可,實現異地多活;

舉個例子:好比機房A、B 內分別部署服務註冊中心集羣節點。即機房A部署 a一、a2 兩個服務註冊中心服務節點,機房B部署 b一、b2 兩個服務註冊中心服務節點;

那麼各機房內應用只須要請求本機房內部署的服務註冊中心節點便可,不須要跨機房調用。即機房A內業務應用請求 a一、a2 獲取配置、機房B內業務應用 b一、b2 獲取配置。

這種跨機房部署方式實現了配置服務的 "異地多活",擁有如下幾點好處:

  • 一、註冊服務響應更快:註冊請求本機房內搞定;
  • 二、註冊服務更穩定:註冊請求不須要跨機房,不須要考慮複雜的網絡狀況,更加穩定;
  • 二、容災性:即便一個機房內服務註冊中心所有宕機,僅會影響到本機房內應用加載服務,其餘機房不會受到影響。

4.4 一致性

相似 Raft 方案,更輕量級、穩定;

  • Raft:Leader統一處理變動操做請求,一致性協議的做用具化爲保證節點間操做日誌副本(log replication)一致,以term做爲邏輯時鐘(logical clock)保證時序,節點運行相同狀態機(state machine)獲得一致結果。
  • xxl-registry:
    • Leader(統一處理分發變動請求):DB消息表(僅變動時產生消息,消息量較小,並且消息輪訓存在間隔,所以消息表壓力不會太大;);
    • state machine(順序操做日誌副本並保證結果一直):順序消費消息,保證本地數據一致,並經過週期全量同步進一步保證一致性;

5、版本更新日誌

5.1 版本 v1.0.0 Release Notes[2018-12-01]

  • 一、輕量級:基於DB與磁盤文件,只須要提供一個DB實例便可,無第三方依賴;
  • 二、實時性:藉助內部廣播機制,新服務上線、下線,能夠在1s內推送給客戶端;
  • 三、數據同步:註冊中心內部10s會全量同步一次磁盤數據,清理無效服務,確保服務數據實時可用;
  • 四、性能:服務發現時僅讀磁盤文件,性能很是高;服務註冊、摘除時經過磁盤文件校驗,防止重複註冊操做;
  • 五、擴展性:可方便、快速的橫向擴展,只需保證服務註冊中心配置一致便可,可藉助負載均衡組件如Nginx快速集羣部署;
  • 六、多狀態:服務內置三種狀態:
    • 正常狀態=支持動態註冊、發現,服務註冊信息實時更新;
    • 鎖定狀態=人工維護註冊信息,服務註冊信息固定不變;
    • 禁用狀態=禁止使用,服務註冊信息固定爲空;
  • 七、跨語言:註冊中心提供HTTP接口(RESTFUL 格式)供客戶端實用,語言無關,通用性更強;
  • 八、兼容性:項目立項之初是爲XXL-RPC量身設計,可是不限於XXL-RPC使用。兼容支持任何服務框架服務註冊實用,如dubbo、springboot等;
  • 九、跨機房:得益於服務註冊中心集羣關係對等特性,集羣各節點提供冪等的配置服務;所以,異地跨機房部署時,只須要請求本機房服務註冊中心便可,實現異地多活;
  • 十、容器化:提供官方docker鏡像,並實時更新推送dockerhub,進一步實現 "服務註冊中心" 產品開箱即用;
  • 十一、long polling 超時時間優化;服務端默認 30s 超時限制;客戶端默認 60s 阻塞登臺;兩者以較小者爲準,建議客戶端大於服務端。

5.2 版本 v1.0.1 Release Notes[2018-12-20]

  • 一、訪問令牌(accessToken):爲提高系統安全性,註冊中心和客戶端進行安全性校驗,雙方AccessToken匹配才容許通信;
  • 二、底層通信參數統一:請求參數統一由 postbody 發送接收,數據格式見公共消息體 "XxlRegistryParamVO",內部包含 accessToken、biz、env 等屬性;
  • 三、環境屬性 "env" 長度限制調整爲 "2~255" ,兼容 "qa"、"dev" 等短環境標識;
  • 四、升級 pom 依賴至較新版本;

5.3 版本 v1.0.2 Release Notes[2018-02-21]

  • 一、服務端空值也支持響應,客戶端註冊信息發現null值緩存,避免緩存穿透;
  • 二、客戶端配置監控邏輯優化,避免異常狀況下重試請求太頻繁;
  • 三、客戶端日誌優化:僅變動日誌保留爲info級別,非核心日誌調整爲debug級別;
  • 四、內部JSON組件優化,支持多級父類屬性序列化;
  • 五、移除冗餘屬性,如version等;
  • 六、服務註冊中心全量同步線程優化,對齊起始時間,避免集羣節點數據不一致;

5.4 版本 v1.0.3 Release Notes[ING]

TODO

  • 服務端:註冊IP黑名單、白名單;
  • 客戶端:瞬間下線拒絕,好比超過 90% 服務批量下線,本次下線標記失敗,連續三次才生效;防止註冊中心故障,致使總體服務不可用;
  • 註冊方式附屬信息;
    • 服務註冊,支持節點權重配置;
    • 註冊服務支持Tag屬性;如機房TAG,客戶端優先使用本機房,即機房TAG一致的服務;
  • springboot、dubbo 示例;
  • 單機版本:H2數據庫;

6、其餘

6.1 項目貢獻

歡迎參與項目貢獻!好比提交PR修復一個bug,或者新建 Issue 討論新特性或者變動。

6.2 用戶接入登記

更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。

6.3 開源協議和版權

產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.

捐贈

不管金額多少都足夠表達您這份心意,很是感謝 :) 前往捐贈

相關文章
相關標籤/搜索