Decision基于java-agent實現(xiàn)微服務的環(huán)境治理

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)境治理方案。

源碼地址

https://github.com/IRONMAN-KD/decision

工程架構(gòu)

路由架構(gòu)

通過decision的幫助,不在需要多個獨立的隔離開發(fā)環(huán)境,可以將所有服務都部署在同一個開發(fā)環(huán)境,并且注冊到統(tǒng)一的注冊中心,然后在http請求中,帶上對應的header信息,剩下的交由decision幫你完成對應的動態(tài)路由,具體路由策略如下所示:

① version路由策略

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路由策略

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ù),進行可插拔式的組件管理機制。


SPI機制實現(xiàn)

插件的具體實現(xiàn)(更新中)

decision插件詳解--核心插件Ribbon負載均衡器

總結(jié)

以上就是對decision的一些介紹,如果大家覺得對你有所幫助,或者有感興趣的,歡迎大家體驗使用和交流,后續(xù)我也會不斷去優(yōu)化和支持更多的插件,同時對于插件的具體實現(xiàn)也會更新相應的文章與大家分享,也希望大家能提出高貴意見和指出不足,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容