首頁  >  文章  >  php教程  >  spider RPC開發指南

spider RPC開發指南

高洛峰
高洛峰原創
2016-11-21 13:55:511147瀏覽

協議與相容性

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";認為是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}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

deName}

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*/ {

}

服務服務。 DemoService {

       @Service()

       public ServiceResp addServer(ServerReq req);

}

 

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

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

 

============================================== ==========================

擅長於大規模高並發j2ee soa體系系統架構設計與實現,精通j2ee系統效能分析與最佳化

精通oltp&dss oracle&mysql資料庫設計、效能分析與最佳化、HA、分庫分錶應用架構設計與實作

我的開源專案mysqlawr,dlcache,logpool,drpcp。 https://git.oschina.net/zhjh256

提供符合各省GSP監管要求的智軟科技醫療器材管理系統



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn