淺試仿 mapstruct實現微服務編排框架詳解
微服務編排框架
起始原因 是 我們公司 分佈式事務 使用的是 seate 分佈式事務框架,現在隻在一些小部分使用,因為考慮到seate 對性能 TCP的影響,對事務這塊沒有更多的選擇。我就在想 是不是做一個 微服務 編排框架 來解決這個問題。這裡就
開發背景
- 因為我們是saas 可能A企業要這個功能,B企業不要,通過服務編排就可以解決這種情況(還是要受制於業務的)
- 解決分佈式 事務問題,我們涉及到錢的用seate ,其他的用這個框架,能提升性能和TPS
接口的方式
@Component public class AProcessorDemo extends RollbackProcessor { @Override protected void processInternal(ProcessContext context) { System.out.println("a RollBackProcessor " + context.get("id")); } @Override protected void rollback(ProcessContext context) { System.out.println("a rollback RollBackProcessor " + context.get("id")); } }
通過註解的方式
@Component public class AProcessorDemo { @Processor(name="a") protected void processInternal(ProcessContext context) { System.out.println("a RollBackProcessor " + context.get("id")); } @ProcessoRrollback(name="a") protected void rollback(ProcessContext context) { System.out.println("a rollback RollBackProcessor " + context.get("id")); } }
書寫代碼方式的選擇
代碼實現上都可以實現,
選擇接口方式 缺點
- 代碼改動會很大
- node的拆分會根據開發人員的 水平 得到不同體現
選擇 註解方式
- 代碼可讀性 會降低 因為各種情況都會放在同一個類中
- 和之前代碼的兼容性 比較好,對代碼和抽象的能力 要求降低
我感覺還是先按照 接口方式寫,之前代碼不動,隻是新的業務才這麼寫,讓結構清晰,增強抽象的能力。 之後可以用mapStruct 方式優化
張小龍說的為客戶/用戶考慮, 到我們這 就是為瞭開發人員考慮。這樣能節省 業務開發的改動量
方案選擇
feign
有@FeignClient(name = "provider"),其實不就是 根據註解添加代理麼?和我們一樣的功能,是不是可以借鑒下,其實還是反射 拿值 做響應的對應
上生產,通過阿裡雲監控平臺看,8g內存的機器 tps 到200 就會顯示卡在這個BeanUtils 方法上
MapStruct
替換 BeanUtils 復制屬性的新組件,用 生成代理類,set方法賦值 來替換瞭反射的方式 提升性能,減小內存的使用。這種 也是可以的
方案總結
我們平時學習 學一個技術,其實瞭解其原理是為瞭 自己寫組件的時候 ,能用上他們的思路和技術 來達到我們的目的。我個人不是很排斥學習 八股文,可以學到很多的思路 是我們能用上的。但是面試官 別光考八股文
feign 可能是前面第一版會用,等後面的mapStruct demo寫完瞭 我就升級下版本,讓測試同學幫忙測試下,然後換jar 版本唄
說實話 其實我對這種換jar包的方式 還是比較方案的,之前我都是這麼幹,但是涉及到改動的地方太多,我現在會從K8s 下手,直接掛 agent,不影響業務系統
兩個都分析下吧
Feign @FeignClient
主要看 FeignClientsRegistrar registerFeignClients 方法中
BeanDefinition candidateComponent = (BeanDefinition)var21.next(); if (candidateComponent instanceof AnnotatedBeanDefinition) { AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition)candidateComponent; AnnotationMetadata annotationMetadata = beanDefinition.getMetadata(); Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface"); Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName()); String name = this.getClientName(attributes); //註冊client 配置到spring 容器 this.registerClientConfiguration(registry, name, attributes.get("configuration")); //註冊動態代理類到 spring 容器 this.registerFeignClient(registry, annotationMetadata, attributes); }
MapStruct
先實現一個簡易的微服務 編排框架 然後 mapStruct 組件畫圖,然後寫一個demo 升級版本 兼容接口 和 註解 兩種方式
明天去公司 和公司大佬們 聊聊這個組件行不,以上就是淺試仿 mapstruct實現微服務編排框架詳解的詳細內容,更多關於仿 mapstruct微服務編排框架的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Spring Cloud OpenFeign 遠程調用
- Feign調用中的兩種Header傳參方式小結
- 詳解Spring中Lookup註解的使用
- 基於spring cloud多個消費端重復定義feign client的問題
- 使用Feign動態設置header和原理分析