溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么仿mapstruct實(shí)現(xiàn)微服務(wù)編排框架

發(fā)布時(shí)間:2022-08-29 16:23:45 來源:億速云 閱讀:160 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“怎么仿mapstruct實(shí)現(xiàn)微服務(wù)編排框架”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“怎么仿mapstruct實(shí)現(xiàn)微服務(wù)編排框架”文章能幫助大家解決問題。

開發(fā)背景

  • 因?yàn)槲覀兪莝aas 可能A企業(yè)要這個(gè)功能,B企業(yè)不要,通過服務(wù)編排就可以解決這種情況(還是要受制于業(yè)務(wù)的)

  • 解決分布式 事務(wù)問題,我們涉及到錢的用seate ,其他的用這個(gè)框架,能提升性能和TPS

怎么仿mapstruct實(shí)現(xiàn)微服務(wù)編排框架

接口的方式

@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"));
    }
}

書寫代碼方式的選擇

代碼實(shí)現(xiàn)上都可以實(shí)現(xiàn),

選擇接口方式 缺點(diǎn)

  • 代碼改動(dòng)會(huì)很大

  • node的拆分會(huì)根據(jù)開發(fā)人員的 水平 得到不同體現(xiàn)

選擇 注解方式

  • 代碼可讀性 會(huì)降低 因?yàn)楦鞣N情況都會(huì)放在同一個(gè)類中

  • 和之前代碼的兼容性 比較好,對(duì)代碼和抽象的能力 要求降低

我感覺還是先按照 接口方式寫,之前代碼不動(dòng),只是新的業(yè)務(wù)才這么寫,讓結(jié)構(gòu)清晰,增強(qiáng)抽象的能力。 之后可以用mapStruct 方式優(yōu)化

張小龍說的為客戶/用戶考慮, 到我們這 就是為了開發(fā)人員考慮。這樣能節(jié)省 業(yè)務(wù)開發(fā)的改動(dòng)量

方案選擇

feign

有@FeignClient(name = "provider"),其實(shí)不就是 根據(jù)注解添加代理么?和我們一樣的功能,是不是可以借鑒下,其實(shí)還是反射 拿值 做響應(yīng)的對(duì)應(yīng)

上生產(chǎn),通過阿里云監(jiān)控平臺(tái)看,8g內(nèi)存的機(jī)器 tps 到200 就會(huì)顯示卡在這個(gè)BeanUtils 方法上

MapStruct

替換 BeanUtils 復(fù)制屬性的新組件,用 生成代理類,set方法賦值 來替換了反射的方式 提升性能,減小內(nèi)存的使用。這種 也是可以的

方案總結(jié)

我們平時(shí)學(xué)習(xí) 學(xué)一個(gè)技術(shù),其實(shí)了解其原理是為了 自己寫組件的時(shí)候 ,能用上他們的思路和技術(shù) 來達(dá)到我們的目的。我個(gè)人不是很排斥學(xué)習(xí) 八股文,可以學(xué)到很多的思路 是我們能用上的。但是面試官 別光考八股文

feign 可能是前面第一版會(huì)用,等后面的mapStruct demo寫完了 我就升級(jí)下版本,讓測(cè)試同學(xué)幫忙測(cè)試下,然后換jar 版本唄

說實(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

怎么仿mapstruct實(shí)現(xiàn)微服務(wù)編排框架

先實(shí)現(xiàn)一個(gè)簡(jiǎn)易的微服務(wù) 編排框架 然后 mapStruct 組件畫圖,然后寫一個(gè)demo 升級(jí)版本 兼容接口 和 注解 兩種方式

關(guān)于“怎么仿mapstruct實(shí)現(xiàn)微服務(wù)編排框架”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI