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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...