Decision--基于java-agent實現(xiàn)微服務的動態(tài)路由
前言
隨著技術(shù)不斷的發(fā)展,在業(yè)務規(guī)?;脱邪l(fā)效能提升等因素的驅(qū)動下,大多數(shù)公司都逐步從單體架構(gòu)演變到微服務架構(gòu)。而在微服務架構(gòu)模式下,一個系統(tǒng)的服務少則幾十個,多則上百個,所以存在許多問題需要解決。比如:
-
對于多個開發(fā)團共同開發(fā)一個系統(tǒng)來說,最可能需要多套開發(fā)測試環(huán)境進行開發(fā)測試。這樣不僅增加了運維的難度也大大增大了機器資源成本。
多環(huán)境開發(fā) -
對于開發(fā)人員來說需要本地的服務注冊到開發(fā)環(huán)境上進行驗證,如果是多個開發(fā)人員在同一個環(huán)境共同開發(fā)時,則會相互影響,從而大大降低開發(fā)效率。
本地同一服務開發(fā)
如果你正在使用springcloud,并且有遇到以上的問題,那以下內(nèi)容可能會對你有所幫助。
decision
介紹
decision是一款基于Spring Cloud Discovery服務注冊發(fā)現(xiàn)、Ribbon負載均衡、Feign和RestTemplate調(diào)用等組件全方位增強的微服務解決方案,可通過設置Header或者配置中心配置來定義路由策略,并將路由策略傳遞到全鏈路服務中,實現(xiàn)在全鏈路中訪問指定的服務版本。 decision是基于開源的字節(jié)碼框架bytebuddy開發(fā)的環(huán)境治理工具,通過javaagent字節(jié)碼織入技術(shù)實現(xiàn),對業(yè)務代碼完全透明無侵入,業(yè)務代碼無需做修改即可實現(xiàn)服務的自定義路由,借助于類隔離機制,保證了業(yè)務代碼的安全性,從而實現(xiàn)高效穩(wěn)定的微服務環(huán)境治理方案。
源碼地址
工程架構(gòu)
通過decision的幫助,不在需要多個獨立的隔離開發(fā)環(huán)境,可以將所有服務都部署在同一個開發(fā)環(huán)境,并且注冊到統(tǒng)一的注冊中心,然后在http請求中,帶上對應的header信息,剩下的交由decision幫你完成對應的動態(tài)路由,具體路由策略如下所示:
① version路由策略
策略說明:
- 通過header中配置對應服務的version信息進行服務版本的路由選擇,目前有兩種方式添加header信息
- ①通過網(wǎng)關的配置添加配置參數(shù)decision.header.version來配置
- ②通過在外部系統(tǒng)的http請求中(例如在Nginx中統(tǒng)一配置、在前端工程中統(tǒng)一配置、或者在postman等工具中配置)設置header值vd-version來配置,如果兩種方式都配置的話,外部系統(tǒng)配置優(yōu)先級大于網(wǎng)關配置中的配置
- 當請求鏈路中的服務未在header中指定版本,則默認是選擇common版本(所以每個服務都需要指定common版本),如為配置common版本并且header中未指定版本會導致找不到對應的服務
② env路由策略
策略說明:
- 通過header中配置對應服務的env信息進行服務的路由選擇,目前有兩種方式添加header信息
- ①通過網(wǎng)關的配置添加配置參數(shù)decision.header.env來配置
- ②通過在外部系統(tǒng)的http請求中(例如在Nginx中統(tǒng)一配置、在前端工程中統(tǒng)一配置、或者在postman等工具中配置)設置header值vd-env來配置,如果兩種方式都配置的話,外部系統(tǒng)配置優(yōu)先級大于網(wǎng)關配置中的配置
- 當請求鏈路中的服務未在header中指定環(huán)境或者未找到指定的環(huán)境,則默認是選擇common環(huán)境,如為配置common版本并且header中未指定版本會導致找不到對應的服務
核心技術(shù)
java agent & bytebuddy
decision是基于bytebuddy框架(ByteBuddy是一個可以在運行時動態(tài)生成java class的類庫)通過java agent字節(jié)碼織入技術(shù),實現(xiàn)對業(yè)務代碼無侵入的攔截增強,從而能夠達到對業(yè)務代碼完全透明無感知的動態(tài)路由效果。具體關于java agent和bytebuddy的介紹以及細節(jié),這里就不在贅述了,網(wǎng)上有許多優(yōu)秀的文章介紹它們。
基于SPI的插件化組件
decision是通過對springcloud的各個組件進行攔截獲取信息和字節(jié)碼織入來達到上下文傳遞和改變路由規(guī)則的效果,所以為了方便擴展對更多組件的支持,采用了SPI技術(shù),進行可插拔式的組件管理機制。
插件的具體實現(xiàn)(更新中)
總結(jié)
以上就是對decision的一些介紹,如果大家覺得對你有所幫助,或者有感興趣的,歡迎大家體驗使用和交流,后續(xù)我也會不斷去優(yōu)化和支持更多的插件,同時對于插件的具體實現(xiàn)也會更新相應的文章與大家分享,也希望大家能提出高貴意見和指出不足,謝謝!