Decision--基于java-agent實(shí)現(xiàn)微服務(wù)的動(dòng)態(tài)路由
前言
隨著技術(shù)不斷的發(fā)展杖小,在業(yè)務(wù)規(guī)模化和研發(fā)效能提升等因素的驅(qū)動(dòng)下浸剩,大多數(shù)公司都逐步從單體架構(gòu)演變到微服務(wù)架構(gòu)糠馆。而在微服務(wù)架構(gòu)模式下,一個(gè)系統(tǒng)的服務(wù)少則幾十個(gè)工腋,多則上百個(gè)姨丈,所以存在許多問題需要解決。比如:
-
對(duì)于多個(gè)開發(fā)團(tuán)共同開發(fā)一個(gè)系統(tǒng)來說擅腰,最可能需要多套開發(fā)測(cè)試環(huán)境進(jìn)行開發(fā)測(cè)試蟋恬。這樣不僅增加了運(yùn)維的難度也大大增大了機(jī)器資源成本。
-
對(duì)于開發(fā)人員來說需要本地的服務(wù)注冊(cè)到開發(fā)環(huán)境上進(jìn)行驗(yàn)證趁冈,如果是多個(gè)開發(fā)人員在同一個(gè)環(huán)境共同開發(fā)時(shí)歼争,則會(huì)相互影響,從而大大降低開發(fā)效率渗勘。
如果你正在使用springcloud沐绒,并且有遇到以上的問題,那以下內(nèi)容可能會(huì)對(duì)你有所幫助呀邢。
decision
介紹
decision是一款基于Spring Cloud Discovery服務(wù)注冊(cè)發(fā)現(xiàn)洒沦、Ribbon負(fù)載均衡豹绪、Feign和RestTemplate調(diào)用等組件全方位增強(qiáng)的微服務(wù)解決方案价淌,可通過設(shè)置Header或者配置中心配置來定義路由策略,并將路由策略傳遞到全鏈路服務(wù)中瞒津,實(shí)現(xiàn)在全鏈路中訪問指定的服務(wù)版本蝉衣。 decision是基于開源的字節(jié)碼框架bytebuddy開發(fā)的環(huán)境治理工具,通過javaagent字節(jié)碼織入技術(shù)實(shí)現(xiàn)巷蚪,對(duì)業(yè)務(wù)代碼完全透明無侵入病毡,業(yè)務(wù)代碼無需做修改即可實(shí)現(xiàn)服務(wù)的自定義路由,借助于類隔離機(jī)制屁柏,保證了業(yè)務(wù)代碼的安全性啦膜,從而實(shí)現(xiàn)高效穩(wěn)定的微服務(wù)環(huán)境治理方案。
源碼地址
工程架構(gòu)
通過decision的幫助淌喻,不在需要多個(gè)獨(dú)立的隔離開發(fā)環(huán)境僧家,可以將所有服務(wù)都部署在同一個(gè)開發(fā)環(huán)境,并且注冊(cè)到統(tǒng)一的注冊(cè)中心裸删,然后在http請(qǐng)求中八拱,帶上對(duì)應(yīng)的header信息,剩下的交由decision幫你完成對(duì)應(yīng)的動(dòng)態(tài)路由涯塔,具體路由策略如下所示:
① version路由策略
策略說明:
- 通過header中配置對(duì)應(yīng)服務(wù)的version信息進(jìn)行服務(wù)版本的路由選擇肌稻,目前有兩種方式添加header信息
- ①通過網(wǎng)關(guān)的配置添加配置參數(shù)decision.header.version來配置
- ②通過在外部系統(tǒng)的http請(qǐng)求中(例如在Nginx中統(tǒng)一配置、在前端工程中統(tǒng)一配置匕荸、或者在postman等工具中配置)設(shè)置header值vd-version來配置爹谭,如果兩種方式都配置的話,外部系統(tǒng)配置優(yōu)先級(jí)大于網(wǎng)關(guān)配置中的配置
- 當(dāng)請(qǐng)求鏈路中的服務(wù)未在header中指定版本榛搔,則默認(rèn)是選擇common版本(所以每個(gè)服務(wù)都需要指定common版本)诺凡,如為配置common版本并且header中未指定版本會(huì)導(dǎo)致找不到對(duì)應(yīng)的服務(wù)
② env路由策略
策略說明:
- 通過header中配置對(duì)應(yīng)服務(wù)的env信息進(jìn)行服務(wù)的路由選擇齿风,目前有兩種方式添加header信息
- ①通過網(wǎng)關(guān)的配置添加配置參數(shù)decision.header.env來配置
- ②通過在外部系統(tǒng)的http請(qǐng)求中(例如在Nginx中統(tǒng)一配置、在前端工程中統(tǒng)一配置绑洛、或者在postman等工具中配置)設(shè)置header值vd-env來配置救斑,如果兩種方式都配置的話,外部系統(tǒng)配置優(yōu)先級(jí)大于網(wǎng)關(guān)配置中的配置
- 當(dāng)請(qǐng)求鏈路中的服務(wù)未在header中指定環(huán)境或者未找到指定的環(huán)境真屯,則默認(rèn)是選擇common環(huán)境脸候,如為配置common版本并且header中未指定版本會(huì)導(dǎo)致找不到對(duì)應(yīng)的服務(wù)
核心技術(shù)
java agent & bytebuddy
decision是基于bytebuddy框架(ByteBuddy是一個(gè)可以在運(yùn)行時(shí)動(dòng)態(tài)生成java class的類庫)通過java agent字節(jié)碼織入技術(shù),實(shí)現(xiàn)對(duì)業(yè)務(wù)代碼無侵入的攔截增強(qiáng)绑蔫,從而能夠達(dá)到對(duì)業(yè)務(wù)代碼完全透明無感知的動(dòng)態(tài)路由效果运沦。具體關(guān)于java agent和bytebuddy的介紹以及細(xì)節(jié),這里就不在贅述了配深,網(wǎng)上有許多優(yōu)秀的文章介紹它們携添。
基于SPI的插件化組件
decision是通過對(duì)springcloud的各個(gè)組件進(jìn)行攔截獲取信息和字節(jié)碼織入來達(dá)到上下文傳遞和改變路由規(guī)則的效果,所以為了方便擴(kuò)展對(duì)更多組件的支持篓叶,采用了SPI技術(shù)烈掠,進(jìn)行可插拔式的組件管理機(jī)制。
插件的具體實(shí)現(xiàn)(更新中)
decision插件詳解--核心插件Ribbon負(fù)載均衡器
總結(jié)
以上就是對(duì)decision的一些介紹缸托,如果大家覺得對(duì)你有所幫助左敌,或者有感興趣的,歡迎大家體驗(yàn)使用和交流俐镐,后續(xù)我也會(huì)不斷去優(yōu)化和支持更多的插件矫限,同時(shí)對(duì)于插件的具體實(shí)現(xiàn)也會(huì)更新相應(yīng)的文章與大家分享,也希望大家能提出高貴意見和指出不足佩抹,謝謝叼风!