spider RPC開髮指南

来源:http://www.cnblogs.com/zhjh256/archive/2016/11/19/6081627.html
-Advertisement-
Play Games

協議與相容性 spider使用java語言開發,使用Spring作為IoC容器,採用TCP/IP協議,在此基礎上,結合SaaS系統模式的特性進行針對性和重點設計,以更加靈活和高效的滿足多租戶系統、高可用、分散式部署的要求。 採用JSON作為序列化機制,後續版本可能會考慮支持protobuf(java ...


協議與相容性

spider使用java語言開發,使用Spring作為IoC容器,採用TCP/IP協議,在此基礎上,結合SaaS系統模式的特性進行針對性和重點設計,以更加靈活和高效的滿足多租戶系統、高可用、分散式部署的要求。

採用JSON作為序列化機制,後續版本可能會考慮支持protobuf(java/c++/c#均有類庫支持)。

       為了最大化性能以及穩定性,spider基於Sun JDK1.8進行編譯並應避免使用deprecated特性。

       為了儘可能的適應各環境以及互聯網應用,spider應能至少運行於tomcat/jboss應用伺服器下。

部署模式

       任何時候,Spider可運行於中心化管理模式或獨立管理模式之一。

中心化管理模式:中心化模式要求必須啟用服務中心。對於有幾十個運行節點的大規模部署而言,通常增加或者減少一個節點/拆分服務需要進行的配置文件數量會很多,通常位於新增節點上游的各節點都需要修改相應的路由和對應的伺服器參數。採用中心化管理模式,只需要登錄服務中心修改相關配置即可,節點的變化會自動推送給相應的上游節點。運行於中心化管理模式時,可在服務中心查看整個平臺中所有節點的健康狀態、各服務的TPS、響應時間等。

獨立管理模式:獨立管理模式無需啟用服務中心。當節點數量較少,比如整個平臺不超過十個節點時,採用獨立模式通常會比中心化管理模式更簡單。運行於獨立管理模式時,可通過spider提供的restful api查看當前節點的運行狀態。

服務標識

Spider支持兩種服務發佈註解。

spider定義了兩個自定義註解用於標識spider服務。

服務模塊

@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceModule {
    String subSystemId() default "0";
}

 

@ServiceModule只是一個類註解,具有該註解的介面將被認為是spider服務介面類,定義在該介面中是被標識為spider服務的必要條件。

服務介面

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Service {
    String serviceId(); // 服務編號,8位ASCII字元,其中00000000-00000099為spider內部保留,00000100-00000199為服務中心保留
    String desc(); //服務描述
    int timeout() default 0; //超時時間,單位毫秒
    boolean needLog() default false; //設置是否記錄日誌
    int broadcast() default 0;  //設置該請求是否廣播,0:不廣播;1:廣播但無需相應;2:廣播並響應
}

 

@Service是一個方法註解,其包含三個屬性,分別用於設置spider服務號,spider服務描述,spider服務超時時間。其中超時時間可選,預設為spider.xml中設置的超時時間,如果spider.xml中未定義,則預設為300秒。

       只有定義在由@ServiceModule註解的介面中由@Service註解的方法才會被標識為spider服務,正確發佈後,該介面可用於提供服務或者代理調用遠程服務。

         對於broadcast=2的服務,其返回值必須包裝在com.ld.net.spider.pojo.BroadcastResult的data屬性中,具體見該類的javadoc說明。

 

環境變數

spider有一些環境變數用於控制相關選項,目前有下列可設置的環境變數,如下所示:

l  SPIDER_LOG,預設/tmp/spider/stat/${nodeName}

l  SPIDER_HOME,預設/usr/local/spider/${nodeName}

l  SPIDER_CONFIG,指定spider.xml啟動文件,預設classpath:spider.xml,見配置文件一節。

 

配置文件

參考配置文件一節。

服務發佈與代理

服務發佈:spider.localService插件下的serviceExportPackage元素定義了spider節點作為伺服器時自動對外發佈的spider服務的包路徑,以;或,分隔。只要服務端在該參數上設置了相關路徑,java客戶端只要在serviceProxyPackage參數上設置對應路徑就可以直接通過@Autowired依賴註入方式調用遠程服務端包下提供的相應服務。

服務代理:對於java客戶端而言,spider提供了自動代理功能,開發者可像調用本地Spring服務一樣調用遠程伺服器上的spider服務,開發者只需要在spider.localService插件下的serviceExportPackage元素上定義需要自動代理的spider服務的包路徑,以;或,分隔。對於非java客戶端比如C#或C++客戶端而言,開發者需要調用對應的SDK Client。

發佈的服務和代理的服務不能有交叉。如果一個服務既需要在本地處理,又需要spider代理轉發給下游伺服器,則配置在發佈列表。此時這些服務無法通過用戶編程來遠程調用。通常這些服務是用於特殊目的,且被標記為broadcast。

PS:從技術上來說,只要客戶端和服務端同一個服務的方法簽名和服務號相同就能夠調用(也就是方法名無關),不過不建議這麼做,在將來的版本中也可能會要求完全匹配。

還需要註意的是,如果某個spider節點希望作為NB的角色,在serviceExportPackage配置了發佈路徑,同時又包含了某個服務的實現,如果該服務的路由條目被解析到本地處理,則該服務會在該NB節點被處理,而不會繼續往後轉發,這一點需要註意。所以,對於作為NB的角色,建議除了廣播的服務,不要配置在serviceExportPackage下。

各種數據類型支持情況

spider當前版本支持除byte[]外基本上所有類型的數據類型,包括泛型對象。

 

服務介面定義要求

綜合考慮靈活性,性能,開發效率,建議服務參數和返回值均採用對象(現有的RPC框架基本都採用這種模式,比如gRPC,ICE),同時參數繼承SpiderBizHead類(其中包含了設置動態路由等相關信息)。如下所示:

入參DTO:

public class ServiceReq extends SpiderBizHead /*如果無需動態路由功能,則不必繼承SpiderBizHead*/ {

}

服務簽名:

@ServiceModule()

public interface DemoService {

       @Service()

       public ServiceResp addServer(ServerReq req);

}

 

       還要考慮C++以及其他在用編程語言實現動態代理的簡易性。

       對於C#,可參考System.Runtime.Remoting.Proxies.RealProxy類實現。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在大家常用的桌面操作系統有:Windows、Mac OS、ubuntu,其中Mac OS 和 ubuntu上都會自帶python。這裡我們只介紹下Windows(我用的Win10)環境下的python2.x 和 python3.x 的安裝,以及python2.x 與 python3.x 共存時的配 ...
  • seL4之hello 2旅途 2016/11/19 13:15:38 回顧上周 seL4運行環境搭建. 完成 的運行. 補充上周 1.微內核與巨集內核有什麼不同? 微內核——用戶態提供OS服務,一般採用server client架構。代表:L4系列微內核 巨集內核——內核態提供OS服務,通過syscal ...
  • Hi,大家好!我是CrazyCatJack,你們可以叫我CCJ或者瘋貓。今天我給大家帶來的是u-boot的源代碼彙編段分析,以後還會給大家講解後續的C代碼,請持續關註哦^_^ 先簡單說一下u-boot,在嵌入式開發中,u-boot起著至關重要的作用:讀出嵌入式系統內核並啟動內核。因此非常有必要對u- ...
  • 本人菜鳥一枚,大學里憑興趣學了一點WP的皮毛,後來又幸運(或者不幸)的進了一家專註於Windows生態的公司做了一段時間的UWP。在博客園寫點自己遇到的東西,作為分享,也作為自己的備忘,如果有錯誤的地方,或者可以提升B格的地方,希望園子里的大神們不吝賜教。 初進公司時,公司要做支付相關的業務,需要和 ...
  • #! usr/bin/env python#!-*-conding:utf-8-*-#第一步:定義變數 name = 'python' passwd = 'password'#第二步:寫while迴圈 定義count=0#第三步:判斷count=3則列印print("Account Be Locke ...
  • 分散式系統關鍵點 分散式系統(distributed system)是建立在網路之上的軟體系統。正是因為軟體的特性,所以分散式系統具有高度的內聚性和透明性。因此,網路和分散式系統之間的區別更多的在於高層軟體(特別是操作系統),而不是硬體。內聚性是指每一個資料庫分佈節點高度自治,有本地的資料庫管理系統 ...
  • 轉載:http://www.jb51.net/article/40193.htm JS里設定延時: 使用SetInterval和設定延時函數setTimeout 很類似。setTimeout 運用在延遲一段時間,再進行某項操作。 setTimeout("function",time) 設置一個超時對 ...
  • 分組後,統計記錄條數: SELECT num,count(*) AS counts from test_a GROUP BY num; 查詢結果如下: 對num去重後的數量的統計: SELECT count(t.counts) FROM ( SELECT num,count(*) AS counts ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...