淺試仿?mapstruct實(shí)現(xiàn)微服務(wù)編排框架詳解
微服務(wù)編排框架
起始原因 是 我們公司 分布式事務(wù) 使用的是 seate 分布式事務(wù)框架,現(xiàn)在只在一些小部分使用,因?yàn)榭紤]到seate 對(duì)性能 TCP的影響,對(duì)事務(wù)這塊沒(méi)有更多的選擇。我就在想 是不是做一個(gè) 微服務(wù) 編排框架 來(lái)解決這個(gè)問(wèn)題。這里就
開發(fā)背景
- 因?yàn)槲覀兪莝aas 可能A企業(yè)要這個(gè)功能,B企業(yè)不要,通過(guò)服務(wù)編排就可以解決這種情況(還是要受制于業(yè)務(wù)的)
- 解決分布式 事務(wù)問(wèn)題,我們涉及到錢的用seate ,其他的用這個(gè)框架,能提升性能和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")); } }
通過(guò)注解的方式
@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")); } }
書寫代碼方式的選擇
代碼實(shí)現(xiàn)上都可以實(shí)現(xiàn),
選擇接口方式 缺點(diǎn)
- 代碼改動(dòng)會(huì)很大
- node的拆分會(huì)根據(jù)開發(fā)人員的 水平 得到不同體現(xiàn)
選擇 注解方式
- 代碼可讀性 會(huì)降低 因?yàn)楦鞣N情況都會(huì)放在同一個(gè)類中
- 和之前代碼的兼容性 比較好,對(duì)代碼和抽象的能力 要求降低
我感覺(jué)還是先按照 接口方式寫,之前代碼不動(dòng),只是新的業(yè)務(wù)才這么寫,讓結(jié)構(gòu)清晰,增強(qiáng)抽象的能力。 之后可以用mapStruct 方式優(yōu)化
張小龍說(shuō)的為客戶/用戶考慮, 到我們這 就是為了開發(fā)人員考慮。這樣能節(jié)省 業(yè)務(wù)開發(fā)的改動(dòng)量
方案選擇
feign
有@FeignClient(name = "provider"),其實(shí)不就是 根據(jù)注解添加代理么?和我們一樣的功能,是不是可以借鑒下,其實(shí)還是反射 拿值 做響應(yīng)的對(duì)應(yīng)
上生產(chǎn),通過(guò)阿里云監(jiān)控平臺(tái)看,8g內(nèi)存的機(jī)器 tps 到200 就會(huì)顯示卡在這個(gè)BeanUtils 方法上
MapStruct
替換 BeanUtils 復(fù)制屬性的新組件,用 生成代理類,set方法賦值 來(lái)替換了反射的方式 提升性能,減小內(nèi)存的使用。這種 也是可以的
方案總結(jié)
我們平時(shí)學(xué)習(xí) 學(xué)一個(gè)技術(shù),其實(shí)了解其原理是為了 自己寫組件的時(shí)候 ,能用上他們的思路和技術(shù) 來(lái)達(dá)到我們的目的。我個(gè)人不是很排斥學(xué)習(xí) 八股文,可以學(xué)到很多的思路 是我們能用上的。但是面試官 別光考八股文
feign 可能是前面第一版會(huì)用,等后面的mapStruct demo寫完了 我就升級(jí)下版本,讓測(cè)試同學(xué)幫忙測(cè)試下,然后換jar 版本唄
說(shuō)實(shí)話 其實(shí)我對(duì)這種換jar包的方式 還是比較方案的,之前我都是這么干,但是涉及到改動(dòng)的地方太多,我現(xiàn)在會(huì)從K8s 下手,直接掛 agent,不影響業(yè)務(wù)系統(tǒng)
兩個(gè)都分析下吧
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); //注冊(cè)client 配置到spring 容器 this.registerClientConfiguration(registry, name, attributes.get("configuration")); //注冊(cè)動(dòng)態(tài)代理類到 spring 容器 this.registerFeignClient(registry, annotationMetadata, attributes); }
MapStruct
先實(shí)現(xiàn)一個(gè)簡(jiǎn)易的微服務(wù) 編排框架 然后 mapStruct 組件畫圖,然后寫一個(gè)demo 升級(jí)版本 兼容接口 和 注解 兩種方式
明天去公司 和公司大佬們 聊聊這個(gè)組件行不,以上就是淺試仿 mapstruct實(shí)現(xiàn)微服務(wù)編排框架詳解的詳細(xì)內(nèi)容,更多關(guān)于仿 mapstruct微服務(wù)編排框架的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring?Boot?配置?Hikari?數(shù)據(jù)庫(kù)連接池的操作代碼
數(shù)據(jù)庫(kù)連接池是一個(gè)提高程序與數(shù)據(jù)庫(kù)的連接的優(yōu)化,連接池它主要作用是提高性能、節(jié)省資源、控制連接數(shù)、連接管理等操作,這篇文章主要介紹了SpringBoot配置Hikari數(shù)據(jù)庫(kù)連接池,需要的朋友可以參考下2023-09-09MybatisPlus更新時(shí)部分失敗的問(wèn)題解決
這篇文章主要為大家詳細(xì)介紹了MybatisPlus更新時(shí)部分失敗的問(wèn)題分析和解決方法,文中的代碼示例講解的非常詳細(xì),需要的朋友可以參考下2023-06-06阿里資深技術(shù)專家:在各階段中3年經(jīng)驗(yàn)的java程序員應(yīng)該具備哪些技術(shù)能力
這篇文章主要介紹了阿里資深技術(shù)專家:在各階段中3年經(jīng)驗(yàn)的java程序員應(yīng)該具備哪些技術(shù)能力,本文給大家列舉了一些內(nèi)容,大家可以根據(jù)自己需要有方法的掌握,感興趣的朋友跟隨小編一起看看吧2020-07-07