天画-codeMaker组件化架构升级实践
神帥
讀完需要
11
分鐘速讀僅需 4 分鐘
1
? ?
背景
1.1
? ?
背景說(shuō)明
在兩個(gè)月前我擴(kuò)展了基于調(diào)用時(shí)序的代碼生成,將代碼生成的粒度從代碼方法級(jí)別提升到了代碼行級(jí)別,從整個(gè)迭代過(guò)程來(lái)看也逐步積累了一些問(wèn)題,在一些模塊設(shè)計(jì)上實(shí)現(xiàn)的不夠好,同時(shí)沒(méi)有擴(kuò)展到 Spring Cloud 體系,另外也在這一段時(shí)間重點(diǎn)看了很多低代碼的實(shí)現(xiàn),比如易鯨云,簡(jiǎn)道云,金蝶云等等,我發(fā)現(xiàn)如果需要把 codeMaker 提升到企業(yè)級(jí)的層次就不能一點(diǎn)點(diǎn)優(yōu)化,而是要做一個(gè)大的架構(gòu)升級(jí),提高兼容性,擴(kuò)展性,并在易用性上下功夫。因此準(zhǔn)備設(shè)計(jì)并實(shí)現(xiàn)了本次 1.2.2 版本的組件化架構(gòu)升級(jí)的版本,來(lái)解決 codeMaker 后續(xù)迭代的整體架構(gòu)問(wèn)題,同時(shí)也為 codeMaker 統(tǒng)一后端 Java 代碼生成做基礎(chǔ)。
1.2
? ?
V2 架構(gòu)
上面是 V2 架構(gòu)的整體架構(gòu)圖,也就是從 1.X 進(jìn)化到 1.2.X 的一個(gè)里程碑,因此做了一個(gè)架構(gòu)圖,上圖可以明顯看到 codeMaker 在 V2 版本下已經(jīng)可以生成很多代碼元素了。同時(shí) codeMaker 本身提供的工具能力也初步顯現(xiàn)。在 1.2.0,1.2.1 等版本中主要為了解決將基于 plantUML 的調(diào)用時(shí)序圖融入到代碼生成中。但是遇到一些瓶頸,由于開(kāi)發(fā)工作量比較大,對(duì)于時(shí)序圖本身的解析沒(méi)有太深,但是很明顯的感覺(jué)到如果要讓調(diào)用時(shí)序圖發(fā)揮更大的威力就需要在繪制方法調(diào)用時(shí)序的時(shí)候去引用 plantUML 領(lǐng)域文檔之外的類(lèi)和服務(wù)。在早期 codeMaker 依賴(lài)的工具 jar 包還是自己封裝的,但是明顯已經(jīng)無(wú)法滿足業(yè)務(wù)快速生成的需求了。
同時(shí)跟很多微信群友和大佬討論技術(shù)問(wèn)題的時(shí)候發(fā)現(xiàn)組件化這個(gè)方向可以幫忙解決 codeMaker 當(dāng)前所遇到的問(wèn)題,因此就著手設(shè)計(jì)和實(shí)現(xiàn) codeMaker 的組件化架構(gòu)升級(jí)的需求了。
這里基于動(dòng)態(tài)調(diào)用時(shí)序圖的代碼生成技術(shù)文章也跟大家分享一下,可以先看一下,避免本篇技術(shù)文章看的云里霧里。
codeMaker-支持動(dòng)態(tài)調(diào)用時(shí)序代碼生成
1.3
? ?
V2 版本痛點(diǎn)
說(shuō)明:上述架構(gòu)圖中并沒(méi)有體現(xiàn)出 codeMaker 動(dòng)態(tài)調(diào)用時(shí)序技術(shù)設(shè)計(jì),以及在 1.2.x 版本的一些新增代碼元素,是想在 V3 版本統(tǒng)一體現(xiàn)的,這里 1.2.x 的特性都按 V2 版本算。因此本篇文章算是 V2 版本組件化架構(gòu)升級(jí)的一個(gè)里程碑,基于此達(dá)到 V3 版本的發(fā)布特性。這里說(shuō)一下在 V2 版本的幾個(gè)比較大的痛點(diǎn),以及為什么基于這些痛點(diǎn)去做組件化架構(gòu)升級(jí)的技術(shù)決策。
基于 ftl 代碼元素生成比較死板,雖然已經(jīng)構(gòu)建了 30 余種代碼元素,支持了 Dubbo, Spring Boot, Cola 架構(gòu),但是從架構(gòu)+框架級(jí)別來(lái)看,終究無(wú)法窮舉所有 Java 企業(yè)級(jí)代碼元素,比如對(duì)于 Spring Cloud 生態(tài)的工程架構(gòu)代碼就需要在代碼生成之后做一定的修改才能做到。
在動(dòng)態(tài)調(diào)用時(shí)序中無(wú)法識(shí)別依賴(lài)的下游接口,在整個(gè)代碼調(diào)用流程中無(wú)法形成閉環(huán)。在調(diào)用流程上仍然需要手寫(xiě)調(diào)用下游接口的邏輯。
V2 版本引入的 API 封裝組件為 coderman-utils。coderman-utils 雖然提供了 ResultDataDto,ResultDto 的封裝類(lèi),但是如果要讓其他用戶(hù)引入或者被企業(yè)應(yīng)用就需要把 coderman-utils 從 codeMaker 中剝離開(kāi),降低耦合和依賴(lài)程度。
在代碼生成的時(shí)候有些工具類(lèi)是比較獨(dú)立的,可以被多個(gè)項(xiàng)目引用,但是卻沒(méi)有封裝為組件 jar 包,復(fù)用能力弱,需要手動(dòng)復(fù)制引入到項(xiàng)目工程中。V2 版本已經(jīng)默認(rèn)引入了 AppEventPublisher 等內(nèi)置的工具類(lèi),但是仍然是比較獨(dú)立的無(wú)法被調(diào)用時(shí)許圖的內(nèi)容引入并識(shí)別,同時(shí)內(nèi)置的實(shí)現(xiàn)是一個(gè)個(gè)工具類(lèi)手動(dòng)注冊(cè)的,所以無(wú)法滿足更多工具類(lèi)組件的復(fù)用,引入,積累和管理等需求。
從組件級(jí)別來(lái)說(shuō),企業(yè)架構(gòu)應(yīng)用工程中有自研的技術(shù)棧,有封裝的工具組件,有大量的開(kāi)源組件,這些如果需要被低代碼引入就必然要進(jìn)行改造,不能一個(gè)個(gè)的去適配引入。
在領(lǐng)域模型中雖然增加了 extend key 來(lái)擴(kuò)展并銜接領(lǐng)域模型文檔與工程代碼,但是擴(kuò)展過(guò)多就會(huì)帶來(lái)額外的復(fù)雜性并降低易用性,所以從某些方面來(lái)說(shuō)也許控制 extend key 的數(shù)量同時(shí)用其他的思路方案可能更好。
2
? ?
需求說(shuō)明
2.1
? ?
總體需求列表
在 1.2.x 系列中按版本算的話,本次組件化架構(gòu)升級(jí)屬于 1.2.2,本版本的特性實(shí)現(xiàn)列表也比之前的更多,這里就簡(jiǎn)單概括幾個(gè)方面吧:
增加 cache,queryobj,feign 接口等代碼元素的生成
增加 springcloud 應(yīng)用架構(gòu)的代碼生成
重構(gòu)包引用邏輯,工具類(lèi)組件手動(dòng)注冊(cè)邏輯等
組件化動(dòng)態(tài)配置,掃描和引入
工具類(lèi)手動(dòng)定義和引入
進(jìn)行代碼生成的同時(shí)構(gòu)建 API 接口文檔
其他需求特性
下面我重點(diǎn)說(shuō)一下
2.2
? ?
組件化&配置化需求
上面已經(jīng)說(shuō)了當(dāng)前 V2 版本的一些痛點(diǎn)以及要做組件化的目標(biāo),那么這里就需要對(duì)組件化的需求稍微細(xì)化一下。
支持除了 springboot,dubbo 框架之外的其他類(lèi)似自研的框架應(yīng)用代碼生成
需要引入的組件模型可以與低代碼模型協(xié)同輔助構(gòu)建基于調(diào)用時(shí)序圖的代碼內(nèi)容
對(duì)工具類(lèi)組件既可以被引入也可以被復(fù)制使用,也可以被用于裝飾基本的代碼元素,如抽象的 Base 類(lèi)等。對(duì)于上述相對(duì)細(xì)化的需求而言,我們需要注意到另外一個(gè)潛在的需求,就是靈活性。如果要實(shí)現(xiàn)上面的需求就需要做一些配置化,通過(guò)配置化可以幫助構(gòu)建更加靈活生動(dòng)的代碼內(nèi)容。所以需要在上面的需求實(shí)現(xiàn)中構(gòu)建一些配置項(xiàng),如初始化組件依賴(lài)配置,組件掃描依賴(lài)配置,組件掃描實(shí)現(xiàn) bean 配置等等。
2.3
? ?
接口文檔需求
這個(gè)需求是構(gòu)建 1.2.2 版本特性的時(shí)候突然想到的,因?yàn)榧热活I(lǐng)域模型文檔上已經(jīng)通過(guò)了 extend key 來(lái)擴(kuò)展出了領(lǐng)域模型的 API 接口聲明,那么基于這些 API 接口聲明則可以很方便的構(gòu)建接口文檔,另外一方面代碼生成出來(lái)除了修改,調(diào)試運(yùn)行之外還需要編寫(xiě)接口文檔,如果這部分工作量能少一些那么這個(gè)需求也是非常值得實(shí)現(xiàn)的。
2.4
? ?
重構(gòu)需求
在重構(gòu)方面,我一直想說(shuō)的就是 codeMaker 每個(gè)版本的迭代都有大量的重構(gòu)??赡芤?yàn)榇a冗余,因?yàn)闆](méi)有經(jīng)過(guò)詳細(xì)設(shè)計(jì),因?yàn)橐恍?xiě)死邏輯的妥協(xié)等等。所以重構(gòu)依然是本版本的重點(diǎn)。在包引用,代碼繪制,代碼派生工廠,過(guò)時(shí)配置等方面都需要更好更合適的實(shí)現(xiàn)。
3
? ?
整體設(shè)計(jì)方案
3.1
? ?
設(shè)計(jì)思想
兼容并蓄,在 codemaker 的組件化架構(gòu)設(shè)計(jì)中一切業(yè)務(wù)組件,中間件,腳手架都是組件都是可配置的。
3.2
? ?
組件模型
由于需要做組件化,因此這里在設(shè)計(jì)實(shí)現(xiàn)的時(shí)候就采用頂層接口設(shè)計(jì)的模式,確立組件模型并將組件行為定義為頂級(jí)接口,讓現(xiàn)有的代碼生成流程可以很容易的插入組件化模型。以下是設(shè)計(jì)的三個(gè)頂級(jí)接口和兩個(gè)組件模型。
1. 組件頂級(jí)接口
2. 組件模型
3.3
? ?
工程重構(gòu)
淺藍(lán)色模塊:codeMaker 支持的應(yīng)用代碼生成模塊
粉紅色模塊:codeMaker 本身提供的平臺(tái)能力模塊
在之前的微信群推廣中有群友就說(shuō)了 codeMaker 的文檔和流程不夠清晰,正好借著這次發(fā)版的契機(jī),為自己定下了一個(gè)目標(biāo)就是不急于發(fā)布版本,而是先把文檔流程補(bǔ)充上來(lái)。另外由于 codeMaker 的項(xiàng)目工程也逐步變多了,所以也將 codeMaker-core 的代碼遷移到了 codeMaker-parent 模塊里,做父子模塊與其他代碼生成工程區(qū)分開(kāi)來(lái)。
3.4
? ?
整體使用流程
上圖是結(jié)合了組件化之后的流程,增加了多個(gè)基于組件的配置,因此從代碼生成能力上來(lái)看又厲害了一些。
3.5
? ?
組件&工具類(lèi)注冊(cè)流程
這里有必要說(shuō)明一下組件和工具類(lèi)如何注冊(cè)到 codeMaker 的過(guò)程,然后再說(shuō)如何被 codeMaker 應(yīng)用。首先 codeMaker 會(huì)將組件分為三個(gè)等級(jí),一個(gè)應(yīng)用場(chǎng)景。三個(gè)等級(jí)就是框架級(jí),應(yīng)用級(jí)和工具類(lèi)組件級(jí)別,另外一個(gè)場(chǎng)景就是項(xiàng)目初始化構(gòu)建需要的不僅僅是業(yè)務(wù)模型代碼,還有一些輔助的工具類(lèi),所以開(kāi)發(fā)者可以自己定義工具類(lèi)模板來(lái)幫助在項(xiàng)目初始化的時(shí)候工具類(lèi)能被復(fù)制到目標(biāo)項(xiàng)目工程里,這樣很多工具類(lèi)就可以通過(guò)模板配置到 codeMaker 中,將整體的組件能力從單個(gè)類(lèi)到組件本身都可以在 codeMaker 上被廣泛復(fù)用。
3.6
? ?
組件&工具掃描構(gòu)建使用流程
上面說(shuō)了組件注冊(cè)的流程,這里簡(jiǎn)單說(shuō)一下組件的掃描和構(gòu)建流程,限于篇幅,我簡(jiǎn)單介紹兩個(gè)點(diǎn)
組件掃描過(guò)程前置與代碼繪制過(guò)程,這樣組件的代碼會(huì)被引用到
組件被引用的過(guò)程有個(gè)優(yōu)先級(jí),優(yōu)先尋找 plantUML 領(lǐng)域文檔本身定義的類(lèi),然后調(diào)用時(shí)序顯示依賴(lài)的業(yè)務(wù)組件,然后就是全組件集合掃描,如果找不到則對(duì)應(yīng)的調(diào)用時(shí)序的那一行則繪制代碼行失敗。
3.7
? ?
接口文檔生成
整個(gè)實(shí)現(xiàn)過(guò)程就是將 plantUML 領(lǐng)域文檔的接口聲明構(gòu)建出來(lái)并按接口類(lèi)寫(xiě)入到 MD 文檔中,按照簡(jiǎn)單的 MD 文檔語(yǔ)法構(gòu)建接口文檔。
3.8
? ?
重構(gòu)點(diǎn)
在本次版本中主要有以下幾個(gè)重構(gòu)的內(nèi)容
READEME.md 文檔重構(gòu),同時(shí)增加多個(gè)相關(guān)技術(shù)流程文檔和使用文檔,把文檔方面完全補(bǔ)充上來(lái)
重構(gòu)整體 codeMaker 的工程模塊
重構(gòu)包引用的實(shí)現(xiàn)
擴(kuò)展配置文件
4
? ?
配置化設(shè)計(jì)
說(shuō)明:applicationType=cola,springboot,springcloud,dubbo
4.1
? ?
組件化相關(guān)配置
1#全局配置-組件化需要的maven?repository本地路徑,用來(lái)掃描依賴(lài)的組件jar包2application.maven.repo.path=jar:file:///Users/shenshuai/.m2/repository34#全局配置-代碼生成需要的全局組件,框架中間件可以放到全局組件依賴(lài)配置里,類(lèi)似于腳手架,或者自己封裝的業(yè)務(wù)組件框架5application.component.scan.config=dubbo,spring-web,openfeign67#全局配置-自定義的組件掃描bean,defaultCompScanService為codeMaker默認(rèn)實(shí)現(xiàn)支持全局組件的配置,開(kāi)發(fā)者可以參考進(jìn)行自定義掃描組件實(shí)現(xiàn)替代掉默認(rèn)的8application.component.scan.bean=defaultCompScanService9 10#全局配置-自定義的組件裝飾bean,defaultCompDecorateService默認(rèn)實(shí)現(xiàn)支持全局組件的裝飾,開(kāi)發(fā)者可以參考進(jìn)行自定義掃描組件實(shí)現(xiàn)替代掉默認(rèn)的 11application.component.decorate.bean=defaultCompDecorateService 12 13#需要導(dǎo)入的組件列表,多個(gè)逗號(hào)分割,適用于cola模塊下依賴(lài)的業(yè)務(wù)組件包或者對(duì)外api接口包,或者cola項(xiàng)目本身已有的代碼類(lèi),或者其他偏業(yè)務(wù)的工具類(lèi)組件等等。 14#如要生成的項(xiàng)目會(huì)依賴(lài) infosys-user 服務(wù)的api則在這里定義即可。 15applicationType.component.scan.config=apiresult,infosysuser,hutool-core 16 17#應(yīng)用級(jí)組件中間件工具包的組件掃描bean配置 18applicationType.component.scan.beans=appCompScanService 19 20#應(yīng)用級(jí)組件中間件工具包的組件裝飾bean配置 21applicationType.component.decorate.beans=appCompDecorateService 22 23#代碼工具類(lèi)注冊(cè),項(xiàng)目初始化時(shí)可以幫助初始化對(duì)應(yīng)的工具類(lèi) 24#后面生成代碼的時(shí)候可以刪掉工具類(lèi),只專(zhuān)注于生成業(yè)務(wù)代碼 25#格式說(shuō)明?eg:BaseEvent:core?前面是需要初始化的類(lèi),后面是這個(gè)類(lèi)放到哪個(gè)模塊下 26applicationType.component.init.clazz=BaseEvent:domain,Application:start,BaseController:adapter,SpringApplicationContext:domain,AppEventPublisher:domain4.2
? ?
讀寫(xiě)語(yǔ)義配置
1#需要在領(lǐng)域文檔和調(diào)用時(shí)序文檔中識(shí)別的讀操作統(tǒng)一語(yǔ)言 2applicationType.component.dsl.read=check 3 4#需要在領(lǐng)域文檔和調(diào)用時(shí)序文檔中識(shí)別的寫(xiě)操作統(tǒng)一語(yǔ)言 5applicationType.component.dsl.write=settle,apply4.3
? ?
接口文檔生成配置
1#是否構(gòu)建api?文檔,否則進(jìn)行構(gòu)建,默認(rèn)構(gòu)建 2applicationType.api.generator=true4.4
? ?
sub 子包 request,response 配置
1#是否需要根據(jù)該參數(shù)設(shè)置請(qǐng)求參數(shù)的最后一級(jí)包名為request,默認(rèn)false 2applicationType.subpackage.request=true 3 4#是否需要根據(jù)該參數(shù)設(shè)置響應(yīng)參數(shù)的最后一級(jí)包名為response,默認(rèn)false 5applicationType.subpackage.response=true5
? ?
組件化設(shè)計(jì)
5.1
? ?
框架級(jí)組件化
codeMaker 針對(duì) dubbo 和 spring-web 做了框架級(jí)組件化配置和裝飾實(shí)現(xiàn)
5.2
? ?
應(yīng)用級(jí)組件化
針對(duì)應(yīng)用級(jí)組件則與框架級(jí)組件一樣,只是用在了代碼生成繪制調(diào)用時(shí)序上了,也可以用來(lái)當(dāng)作框架級(jí)組件
5.3
? ?
工具類(lèi)組件化
在工具類(lèi)組件上其模型與組件模型和低代碼模型是相通的,因此很容易實(shí)現(xiàn)工具類(lèi)組件化
5.4
? ?
二次開(kāi)發(fā)
由于對(duì) codeMaker 整體進(jìn)行了重構(gòu),因此將低代碼模型和組件模型以及頂層接口獨(dú)立出來(lái)之后則可以針對(duì)某一技術(shù)組件或者技術(shù)棧做針對(duì)性的低代碼設(shè)計(jì)。
5.5
? ?
組件復(fù)用
從上面的組件構(gòu)建和使用流程上看,業(yè)務(wù)組件,技術(shù)組件,工具類(lèi)等都可以在 codeMaker 上實(shí)現(xiàn)復(fù)用,很容易基于此對(duì)新項(xiàng)目的開(kāi)發(fā)提供幫助,同時(shí)在業(yè)務(wù)組件上,迭代二期,三期的時(shí)候可以把業(yè)務(wù)組件本身的內(nèi)容打包注冊(cè)到 codeMaker 上這樣增量迭代則會(huì)容易很多。
6
? ?
代碼生成模式說(shuō)明
相當(dāng)于簡(jiǎn)要的使用手冊(cè)了,這里從技術(shù)角度簡(jiǎn)單總結(jié)一下 codeMaker 具有哪些代碼生成模式。
6.1
? ?
純數(shù)據(jù)庫(kù)模式
顧名思義就是支持基于數(shù)據(jù)模型的代碼生成,生成過(guò)程很簡(jiǎn)單,修改配置連數(shù)據(jù)庫(kù)啟動(dòng)并訪問(wèn)代碼生成 API 就結(jié)束了。這種方式是當(dāng)前很多低代碼都可以實(shí)現(xiàn)的。
6.2
? ?
動(dòng)態(tài) DDD 模式
基于領(lǐng)域模型生成,只生成與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)相關(guān)的代碼元素,比如 BO,Factory,Repository,VO,Entity 等等,這種模式可以很方便的構(gòu)建模擬領(lǐng)域模型在代碼上的落地情況。并幫助優(yōu)化領(lǐng)域模型更好的實(shí)踐 DDD,同時(shí)這種模式不需要依賴(lài)數(shù)據(jù)庫(kù),僅僅是鏈接了數(shù)據(jù)庫(kù)而已。當(dāng)然這種模式生成的代碼只有參考作用。
6.3
? ?
數(shù)據(jù)庫(kù)模式 + 動(dòng)態(tài) DDD 模式
這種模式就是上面兩種的結(jié)合,將數(shù)據(jù)庫(kù)模型與領(lǐng)域代碼模型結(jié)合在一起就構(gòu)成了低代碼模型,這樣的話兼具兩者的優(yōu)勢(shì)從而在各個(gè)層次都變得靈活,讓低代碼實(shí)現(xiàn)上不再變得死板。
6.4
? ?
數(shù)據(jù)庫(kù)+動(dòng)態(tài) DDD 模式+調(diào)用時(shí)序
這種模式是加入了動(dòng)態(tài)調(diào)用時(shí)序圖文檔,將低代碼的生成內(nèi)容從方法級(jí)別提升到了代碼行級(jí)別,如果調(diào)用時(shí)序文檔足夠詳細(xì)可以達(dá)到無(wú)代碼的地步,這樣的話生成即可運(yùn)行是能實(shí)現(xiàn)的。
6.5
? ?
混合模式
這種混合模式是在 V3 版本要實(shí)現(xiàn)的,目前從 1.2.x 系列已經(jīng)完成了基于數(shù)據(jù)模型和基于領(lǐng)域模型的低代碼了,后面需要往 API 方向?qū)崿F(xiàn),也就是面向元數(shù)據(jù)模式構(gòu)建低代碼,包括不再?gòu)?qiáng)行依賴(lài)數(shù)據(jù)庫(kù)的數(shù)據(jù)源了。
7
? ?
預(yù)覽版本架構(gòu)
7.1
? ?
應(yīng)用架構(gòu)圖
7.2
? ?
升級(jí)改造成果
一鍵式生成業(yè)務(wù)代碼,業(yè)務(wù)接口和接口文檔,在構(gòu)建過(guò)程中即可一次性構(gòu)建領(lǐng)域模型,數(shù)據(jù)庫(kù)模型和調(diào)用時(shí)序文檔(相當(dāng)于一鍋出了),讓開(kāi)發(fā)者有更多時(shí)間花在方案設(shè)計(jì)等其他可以提效的問(wèn)題上。
基本具備框架級(jí),應(yīng)用級(jí),工具類(lèi)級(jí)組件復(fù)用和代碼生成,codeMaker 本身也將邁入企業(yè)級(jí)低代碼平臺(tái)的門(mén)檻。
開(kāi)放低代碼模型和組件化接口模型方便二次開(kāi)發(fā)
8
? ?
未來(lái)演進(jìn)
當(dāng)前 codeMaker 雖然已經(jīng)實(shí)現(xiàn)了大概的組件化模型和基本能力,但是還沒(méi)有進(jìn)行實(shí)際驗(yàn)證,另外還有一些其他的需求需要跟進(jìn),所以借著這個(gè)契機(jī)發(fā)布了 V3 預(yù)覽版本,那么在 V3 完整版將把后端涉及到的其他方面完全實(shí)現(xiàn)。未來(lái)將有以下幾點(diǎn)需要實(shí)現(xiàn)來(lái)構(gòu)建 V3 完整版本
選擇一個(gè)工具框架組件如 Mybatis-plus 來(lái)跟 codeMaker 組件化適配
實(shí)現(xiàn)多個(gè)模式的參數(shù)校驗(yàn)
支持元數(shù)據(jù)模式+其他模式生成代碼
細(xì)化調(diào)用時(shí)序圖,讓低代碼更低,生成的代碼盡量接近于 0 代碼。
進(jìn)行重構(gòu)支持自定義代碼模板并順利融入代碼生成流程中。
更多相關(guān) codeMaker 項(xiàng)目相關(guān)的信息請(qǐng)?jiān)L問(wèn)項(xiàng)目主頁(yè):https://gitee.com/sky-painting/code-maker 也可以關(guān)注《神帥的架構(gòu)實(shí)戰(zhàn)》公眾號(hào):
往期推薦
2022年伊始,IT圈還有這些事是你不知道的?
干掉visio,這個(gè)畫(huà)圖神器真的絕了!!!
RedisJson 是什么?比ES快 500 倍?
中國(guó)工商銀行的 Service Mesh 探索與實(shí)踐
數(shù)字化轉(zhuǎn)型下的銀行云單元架構(gòu)
漫畫(huà):據(jù)說(shuō)很多搞軟件的羨慕硬件工程師
源三:聊聊注冊(cè)中心在螞蟻集團(tuán)的降本提效之路
聊聊技術(shù)人的“績(jī)效考核”
總結(jié)
以上是生活随笔為你收集整理的天画-codeMaker组件化架构升级实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2020年Java程序员应该学习的10大
- 下一篇: 函数公开问题、简短模式、多一个返回值