1. 程式人生 > >分散式服務註冊中心XXL-REGISTRY

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

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

Build Status Docker Status Maven Central GitHub release License donate

一、簡介

1.1 概述

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

1.2 特性

  • 1、輕量級:基於DB與磁碟檔案,只需要提供一個DB例項即可,無第三方依賴;
  • 2、實時性:藉助內部廣播機制,新服務上線、下線,可以在1s內推送給客戶端;
  • 3、資料同步:註冊中心內部10s會全量同步一次磁碟資料,清理無效服務,確保服務資料實時可用;
  • 4、效能:服務發現時僅讀磁碟檔案,效能非常高;服務註冊、摘除時通過磁碟檔案校驗,防止重複註冊操作;
  • 5、擴充套件性:可方便、快速的橫向擴充套件,只需保證服務註冊中心配置一致即可,可藉助負載均衡元件如Nginx快速叢集部署;
  • 6、多狀態:服務內建三種狀態:
    • 正常狀態=支援動態註冊、發現,服務註冊資訊實時更新;
    • 鎖定狀態=人工維護註冊資訊,服務註冊資訊固定不變;
    • 禁用狀態=禁止使用,服務註冊資訊固定為空;
  • 7、跨語言:註冊中心提供HTTP介面(RESTFUL 格式)供客戶端實用,語言無關,通用性更強;
  • 8、相容性:專案立項之初是為XXL-RPC量身設計,但是不限於XXL-RPC使用。相容支援任何服務框架服務註冊實用,如dubbo、springboot等;
  • 9、跨機房:得益於服務註冊中心叢集關係對等特性,叢集各節點提供冪等的配置服務;因此,異地跨機房部署時,只需要請求本機房服務註冊中心即可,實現異地多活;
  • 10、容器化:提供官方docker映象,並實時更新推送dockerhub,進一步實現 "服務註冊中心" 產品開箱即用;

1.3 下載

文件地址

原始碼倉庫地址

原始碼倉庫地址Release Download
https://github.com/xuxueli/xxl-registryDownload
https://gitee.com/xuxueli0323/xxl-registryDownload

技術交流

1.4 環境

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

二、快速入門

2.1 初始化 "服務註冊中心" 資料庫

請下載專案原始碼並解壓,獲取 "服務註冊中心" 資料庫初始化SQL指令碼並執行即可

資料庫初始化SQL指令碼位置為:

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

"服務註冊中心" 支援叢集部署,叢集情況下各節點務必連線同一個mysql例項;

2.2 編譯專案

解壓原始碼,按照maven格式將原始碼匯入IDE, 使用maven進行編譯即可,原始碼結構如下:

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

2.3 配置部署“服務註冊中心”

步驟一:配置專案:

配置檔案地址:

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

訊息中心配置內容說明:

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

### 註冊中心,心跳間隔,單位秒
xxl.registry.beattime=10
### 服務註冊資料磁碟同步目錄
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 (該地址接入方專案將會使用到,作為註冊地址),登入後執行介面如下圖所示

輸入圖片說明

至此“服務註冊中心”專案已經部署成功。

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

服務註冊中心支援叢集部署,提升訊息系統容災和可用性。

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

  • 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語言專案接入示例;

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

其他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/", "xxl-rpc", "test");

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

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

registryClient.registry(registryParamList);


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

registryClient.remove(registryParamList)


// 服務發現:
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);

c、非Java語言專案接入;

非Java語言專案,可以藉助提供的 RESTFUL 格式API介面實現服務註冊與發現功能。

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

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

服務註冊中心為支援服務註冊與發現功能,提供的 RESTFUL 格式API介面如下:

3.1、服務註冊 & 續約 API

說明:新服務註冊上線1s內廣播通知接入方;需要接入方迴圈續約,否則服務將會過期(三倍於註冊中心心跳時間)下線;

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

請求引數:
 1、業務標識:biz,RESTFUL路徑引數
 2、環境標識:env,RESTFUL路徑引數
 3、服務註冊資訊:通過post body傳輸,JSON格式資料,如下:
     [{
         "service01" : "address01",
         "service02" : "address02"
     }]

3.2、服務摘除 API

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

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

請求引數:
 1、業務標識:biz,RESTFUL路徑引數
 2、環境標識:env,RESTFUL路徑引數
 3、服務註冊資訊:通過post body傳輸,JSON格式資料,如下:
     [{
         "service01" : "address01",
         "service02" : "address02"
     }]

3.3、服務發現 API

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

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

請求引數:
 1、業務標識:biz,RESTFUL路徑引數
 2、環境標識:env,RESTFUL路徑引數
 3、服務註冊Key列表:通過post body傳輸,JSON格式資料,如下:
     [
         "service01",ice01" : "address01",
         "service02"ice02" : "address02"
     ]

3.4、服務監控 API

說明:long-polling 介面,主動阻塞一段時間(三倍於註冊中心心跳時間);直至阻塞超時或服務註冊資訊變動時響應;

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

請求引數:
 1、業務標識:biz,RESTFUL路徑引數
 2、環境標識:env,RESTFUL路徑引數
 3、服務註冊Key列表:通過post body傳輸,JSON格式資料,如下:
     [
         "service01",ice01" : "address01",
         "service02"ice02" : "address02"
     ]

四、系統設計

4.1 系統架構圖

輸入圖片說明

4.2 原理解析

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

4.3 跨機房(異地多活)

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

舉個例子:比如機房A、B 內分別部署服務註冊中心叢集節點。即機房A部署 a1、a2 兩個服務註冊中心服務節點,機房B部署 b1、b2 兩個服務註冊中心服務節點;

那麼各機房內應用只需要請求本機房內部署的服務註冊中心節點即可,不需要跨機房呼叫。即機房A內業務應用請求 a1、a2 獲取配置、機房B內業務應用 b1、b2 獲取配置。

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

  • 1、註冊服務響應更快:註冊請求本機房內搞定;
  • 2、註冊服務更穩定:註冊請求不需要跨機房,不需要考慮複雜的網路情況,更加穩定;
  • 2、容災性:即使一個機房內服務註冊中心全部宕機,僅會影響到本機房內應用載入服務,其他機房不會受到影響。

五、版本更新日誌

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

  • 1、輕量級:基於DB與磁碟檔案,只需要提供一個DB例項即可,無第三方依賴;
  • 2、實時性:藉助內部廣播機制,新服務上線、下線,可以在1s內推送給客戶端;
  • 3、資料同步:註冊中心內部10s會全量同步一次磁碟資料,清理無效服務,確保服務資料實時可用;
  • 4、效能:服務發現時僅讀磁碟檔案,效能非常高;服務註冊、摘除時通過磁碟檔案校驗,防止重複註冊操作;
  • 5、擴充套件性:可方便、快速的橫向擴充套件,只需保證服務註冊中心配置一致即可,可藉助負載均衡元件如Nginx快速叢集部署;
  • 6、多狀態:服務內建三種狀態:
    • 正常狀態=支援動態註冊、發現,服務註冊資訊實時更新;
    • 鎖定狀態=人工維護註冊資訊,服務註冊資訊固定不變;
    • 禁用狀態=禁止使用,服務註冊資訊固定為空;
  • 7、跨語言:註冊中心提供HTTP介面(RESTFUL 格式)供客戶端實用,語言無關,通用性更強;
  • 8、相容性:專案立項之初是為XXL-RPC量身設計,但是不限於XXL-RPC使用。相容支援任何服務框架服務註冊實用,如dubbo、springboot等;
  • 9、跨機房:得益於服務註冊中心叢集關係對等特性,叢集各節點提供冪等的配置服務;因此,異地跨機房部署時,只需要請求本機房服務註冊中心即可,實現異地多活;
  • 10、容器化:提供官方docker映象,並實時更新推送dockerhub,進一步實現 "服務註冊中心" 產品開箱即用;
  • 11、long polling 超時時間優化;服務端預設 30s 超時限制;客戶端預設 60s 阻塞登臺;二者以較小者為準,建議客戶端大於服務端。

TODO

  • accesstoken 鑑權;
  • 註冊方式附屬資訊;
  • IP黑名單、白名單;
  • springboot、dubbo 示例;

六、其他

6.1 專案貢獻

歡迎參與專案貢獻!比如提交PR修復一個bug,或者新建 Issue 討論新特性或者變更。

6.2 使用者接入登記

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

6.3 開源協議和版權

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

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

捐贈

無論金額多少都足夠表達您這份心意,非常感謝 :) 前往捐贈