目前nodejs應用愈來愈普遍,但和java的dubbo體系接入困難,因此咱們須要實現node端的dubbo provider邏輯。java的dubbo provider是和consumer在一個jar中,提供了服務配置、註冊、集羣與負載均衡、監控和多種協議。使用nodejs實現一個可用的dubbo provider SDK徹底沒有問題,最簡單的實現則是在對應ZK集羣註冊接口與機器IP的映射關係,consumer即可以訪問對應rpc接口。但是,在可用基礎上,仍然須要提供相關配套設施如配置、註冊和監控等,達到商業上的高可用。在評估了各類實現方案後,決定放棄開發node provider端sdk,使用node+agent的proxy模式。java
agent是一個可與node服務交互通訊的,並提供dubbo provider功能的java服務。agent部署在nodejs服務機器上,扮演dubbo服務的入口角色,同時node服務返回的數據類型由agent進行轉換映射,如 object(node) -> Map(Java), 具體轉換規則則由node接口提供方提供調用接口jar包,consumer使用jar包進行調用便可。node
其中 vitamin爲基於數據庫的統一配置平臺,解耦各個系統的強依賴。數據庫
Node中間件提供dubbo接口上報和服務提供功能。上報http接口要暴露的Dubbo服務配置信息(interface+version+method)即映射關係,node的提供rpc服務以HTTP形式存在(兼容以前業務),由agent進行調用,數據類型爲JSON。json
根據Vitamin的實時配置向zookeeper註冊dubbo服務(泛化)架構
泛化服務每一個method會根據Vitamin中的映射關係找到對應的http本地接口(localhost)進行調用負載均衡
-入參和返回值進行json和Java類型的轉換ide
Node提供普通的HTTP+JSON服務,可複用歷史接口性能
提供一個對應dubbo接口的jar包,需保證http接口json和jar中的model轉換關係可行線程
Dubbo方法入參轉換成NodeJs的http調用參數:強類型轉弱類型,可直接轉換
NodeJs服務返回的json轉Dubbo方法返回值:弱類型轉強類型
解決方案:Dubbo泛化服務返回Map,consumer端拿到這個Map會自動根據client.jar的方法返回值類型(支持泛型)進行相應的字段注入中間件
agent不會在調用nodejs服務進行熔斷,即nodejs服務大量超時可能會讓agent鏈接池或線程池佔滿
agent進程的生命週期由node進程維護,經過基於配置中心的心跳機制檢測agent進程是否存活
錯誤排查定位因爲多了一層調用,更爲複雜
可能存在的單機性能問題