同時京東成立子公司,在全國各地新建機房,部署結(jié)構(gòu)也變得比較復(fù)雜。
加上SAF遺留的一些問題,大概面臨如下幾點:
- RPC框架較重,性能有提高的空間
- 注冊中心無業(yè)務(wù)邏輯,直接對外暴露
- 京東復(fù)雜的部署架構(gòu)需要更強大靈活的服務(wù)治理功能
- 監(jiān)控數(shù)據(jù)不完整,維度不夠
- 無應(yīng)用依賴關(guān)系
- 跨語言調(diào)用需求
第二代JSF選擇
所以在2014年初,我們進(jìn)行了第二代JSF的一個全部自研過程。
我們主要做了如下技術(shù)選型:(全部自研)
- RPC框架:輕量級,更佳的性能,兼容舊版本協(xié)議
- 注冊中心:基于DB作為數(shù)據(jù)源,前置Index服務(wù);支持十倍接入量;部分邏輯放在注冊中心減少客戶端負(fù)擔(dān)
- 監(jiān)控中心:監(jiān)控Proxy服務(wù)+InfluxDB(2015后改為ElasticSearch)
- 管理端:基于DB,功能更強大,提供完善的服務(wù)治理管理功能;打通京東應(yīng)用管理平臺,提供應(yīng)用依賴關(guān)系梳理;
- HTTP網(wǎng)關(guān):基于Netty,支持跨語言調(diào)用
開發(fā)周期:7人/年(2014.1-2015.1)。包括開發(fā)、測試、預(yù)發(fā)、上線、推廣。
JSF架構(gòu)簡圖
JSF注冊中心
京東的注冊中心是自研的,基于DB做的數(shù)據(jù)最終一致,也就是上面說的AP系統(tǒng)。
注冊中心主要實現(xiàn)的就是服務(wù)列表的注冊訂閱推送,服務(wù)配置的獲取下發(fā),服務(wù)狀態(tài)的實時查看等功能。
注冊中心節(jié)點是無狀態(tài)的,可水平擴展的。整個注冊中心集群下的所有注冊中心幾點都是等價的。
每個機房部署多個注冊中心節(jié)點。同機房的RPC框架會優(yōu)先連本機房的注冊中心節(jié)點。
主要亮點如下:
引入Index服務(wù)概念
- 該服務(wù)就是一個最簡單HTTP的服務(wù),用于找注冊中心節(jié)點(同機房或者壓力最小或者其它特定場景),可以認(rèn)為是不會掛的服務(wù),
- RPC框架會優(yōu)先連該服務(wù)拿注冊中心地址,這樣子的好處是注冊中心地址變化后,RPC框架不用修改任何設(shè)置。
注冊中心內(nèi)存有服務(wù)列表全量緩存,連不上數(shù)據(jù)庫也保證可讀
數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu)更適合各種維度展示、過濾、分析等
- 例如根據(jù)分組,IP,應(yīng)用,機房等不同維度
- 注冊中心就是個JSF服務(wù),監(jiān)控到壓力大即可進(jìn)行動態(tài)水平擴展
- dogfooding,注冊中心其實是第一個JSF接口
- 服務(wù)列表推送邏輯改進(jìn)
- 例如原來100個Provider,現(xiàn)在加1個節(jié)點,之前的SAF是需要下發(fā)101個節(jié)點,自己判斷加了哪個節(jié)點,進(jìn)行長鏈接建立;
- 現(xiàn)在的改進(jìn)是:修改為下發(fā)一個add事件,告知RPC框架加了1個節(jié)點,RPC框架進(jìn)行長鏈接建立;
- 這樣做大大減少了推送的數(shù)據(jù)量。
- 注冊中心與RPC框架可各種交互
- 注冊中心和RPC框架是長鏈接,而且JSF是支持Callback的,注冊中心可以調(diào)用RPC框架進(jìn)行服務(wù)列表變化之外的操作;
- 例如查看狀態(tài),查看配置,配置下發(fā)等。
JSF RPC框架
RPC框架作為服務(wù)化里面的最基本的組件,其實都大同小異,因為RPC調(diào)用都繞不開代理、網(wǎng)絡(luò)、序列化這些操作。
JSF的RPC框架也類似,主要分為圖中的幾個模塊,
下面大概列下一些功能特性:
- Config:Spring/API/Annotation
- Proxy: Javassist/JDK
- Invoker/Filter:內(nèi)置+自定義,F(xiàn)ilter可擴展
- Client:Failover(默認(rèn))/FailFast/TransportPinpoint/MultiClientProxy
- 調(diào)用方式:同步(默認(rèn))/異步并行/異步回調(diào)/Callback/泛化
- Loadbalance:Random(默認(rèn))/Roundrobin/ConsistentHash/ LocalPreference/LeastActiveCall
- 路由:參數(shù)路由,分組路由,(IP級別路由邏輯在注冊中心做)
- 長連接維護(hù):可用/死亡/亞健康
- 協(xié)議:JSF(默認(rèn))/SAF(dubbo)/HTTP/Telnet/HTTP2
- 第三方:REST/Webservice
- 序列化:MsgPack(默認(rèn))/Hessian/Json/Java/protobuf(c++)
- 壓縮:Snappy/LZMA
- 網(wǎng)絡(luò):基于Netty4.0,長連接復(fù)用
- 線程模型:BOSS+WORKER+BIZ
- 容災(zāi):本地文件
- 請求上下文:IP,參數(shù),隱式傳參
- 事件監(jiān)聽:響應(yīng)事件,連接事件,狀態(tài)事件
- 分布式跟蹤支持:進(jìn)行數(shù)據(jù)埋點
JSF管理平臺
提供強大管理功能,包括服務(wù)管理,監(jiān)控管理,注冊中心管理等功能。