0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

收藏:從零開始搭建一個(gè)通用業(yè)務(wù)架構(gòu)

架構(gòu)師技術(shù)聯(lián)盟 ? 來(lái)源:51CTO ? 2023-04-03 09:42 ? 次閱讀

1、通用架構(gòu)概述

創(chuàng)業(yè)之初,我們往往會(huì)為了快速迭代出產(chǎn)品,而選擇最簡(jiǎn)單的技術(shù)架構(gòu),比如LAMP架構(gòu),SSH三層架構(gòu)。這些架構(gòu)可以適應(yīng)初期業(yè)務(wù)的快速發(fā)展,但是,隨著業(yè)務(wù)變得越來(lái)越復(fù)雜,我們會(huì)發(fā)現(xiàn)這些架構(gòu)越來(lái)越難支撐業(yè)務(wù)的發(fā)展,出現(xiàn)在一個(gè)類中寫好幾千行代碼,一個(gè)方法中到處都是if else語(yǔ)句,如果中間遇到主程序猿離職,后面介入的程序猿幾乎無(wú)法理解這些代碼,到最后,產(chǎn)品越來(lái)越難迭代,只能推翻重做。如果我們?cè)趧?chuàng)業(yè)初始就以一種適應(yīng)性較強(qiáng)的架構(gòu)去寫代碼,后面就會(huì)少走很多彎路。下面的文章是我自己總結(jié)出來(lái)的一套架構(gòu),經(jīng)過(guò)實(shí)踐,適應(yīng)性還算不錯(cuò)。

2、通用架構(gòu)實(shí)現(xiàn)

總的來(lái)說(shuō)我的通用架構(gòu)還是以三層架構(gòu)為基礎(chǔ)進(jìn)行演變的,在經(jīng)典的三層架構(gòu)中,最上層的是controller,中間是service,下層是dao。在我的架構(gòu)中,最上層是網(wǎng)關(guān)層,controller只是網(wǎng)關(guān)的一種,中間是業(yè)務(wù)層,service只是業(yè)務(wù)層的入口,最下層是基礎(chǔ)層,dao只是基礎(chǔ)層中的數(shù)據(jù)存儲(chǔ)組件。

2.1、網(wǎng)關(guān)層

網(wǎng)關(guān)層本質(zhì)上是對(duì)不同的網(wǎng)絡(luò)協(xié)議的請(qǐng)求進(jìn)行處理,比如HTTP協(xié)議,TCP協(xié)議,當(dāng)然,也可以對(duì)其他協(xié)議進(jìn)行處理。具體見下圖:

84a06de2-d1b0-11ed-bfe3-dac502259ad0.jpg

2.1.1、HTTP請(qǐng)求

一般來(lái)自PC端和APP端的請(qǐng)求都是基于HTTP協(xié)議的,對(duì)于處理HTTP請(qǐng)求的方案,業(yè)內(nèi)已經(jīng)非常成熟了。首先,tomcat容器本身已經(jīng)把HTTP請(qǐng)求處理的復(fù)雜性封裝掉了,其次,spring mvc對(duì)請(qǐng)求處理提供了RESTful風(fēng)格的編碼方式,大大降低了開發(fā)的復(fù)雜度。我們要做的就是對(duì)controller按照業(yè)務(wù)領(lǐng)域劃分,比如按照訂單、會(huì)員去劃分大的領(lǐng)域,里面的各種方法就是這個(gè)領(lǐng)域內(nèi)的操作。這里的controller就是統(tǒng)一網(wǎng)關(guān)處理層,對(duì)于每個(gè)controller的方法只做三件事,第一,將請(qǐng)求參數(shù)解析出來(lái)并組裝成內(nèi)部參數(shù),第二調(diào)用下層服務(wù)執(zhí)行業(yè)務(wù)邏輯,第三組裝返回結(jié)果,對(duì)于異常情況,需要記錄異常堆棧日志并轉(zhuǎn)換錯(cuò)誤碼,堆棧信息不要暴露到調(diào)用方。

2.1.2、TCP請(qǐng)求

對(duì)于處理TCP請(qǐng)求的方案,業(yè)內(nèi)也已經(jīng)很成熟了,比如Netty。但是,TCP請(qǐng)求畢竟太底層,我們往往會(huì)基于TCP協(xié)議去開發(fā)自己的協(xié)議。另外,很多分布式框架都是基于TCP協(xié)議的,比如RPC框架Dubbo,消息框架RocketMQ等等。從單機(jī)系統(tǒng)到分布式系統(tǒng),無(wú)非就是網(wǎng)關(guān)層多了處理TCP請(qǐng)求的邏輯,理論上底層的業(yè)務(wù)是無(wú)需感知自己到底是出于單機(jī)環(huán)境還是分布式環(huán)境,網(wǎng)關(guān)層的作用就是要屏蔽這種不同外部調(diào)用源的細(xì)節(jié)。在Dubbo服務(wù)端中,我們需要實(shí)現(xiàn)遠(yuǎn)程接口,并對(duì)遠(yuǎn)程服務(wù)調(diào)用進(jìn)行內(nèi)部的轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)的邏輯也很簡(jiǎn)單,首先是解析參數(shù)并組裝內(nèi)部參數(shù),然后調(diào)用業(yè)務(wù)層的接口執(zhí)行業(yè)務(wù)邏輯,最后組裝返回結(jié)果,對(duì)于異常處理也需要在這里做掉,防止異常暴露給外部應(yīng)用。

2.1.3、小結(jié)

網(wǎng)關(guān)層本質(zhì)是對(duì)協(xié)議進(jìn)行處理,同時(shí)將業(yè)務(wù)邏輯收斂到網(wǎng)關(guān)層,而不是暴露給外部,當(dāng)內(nèi)部業(yè)務(wù)邏輯進(jìn)行重構(gòu)的時(shí)候,外部調(diào)用方就不需要感知這些變化,當(dāng)外部調(diào)用源增加時(shí),內(nèi)部業(yè)務(wù)邏輯不需要感知這種變化,從而將外部調(diào)用方和內(nèi)部業(yè)務(wù)邏輯進(jìn)行了解耦。

2.2、業(yè)務(wù)層

業(yè)務(wù)層是一個(gè)系統(tǒng),無(wú)論是單機(jī)系統(tǒng)還是分布式系統(tǒng)群中的某個(gè)業(yè)務(wù)系統(tǒng),業(yè)務(wù)層都是承載業(yè)務(wù)流程和規(guī)則的地方。業(yè)務(wù)層從外到內(nèi)包含三層:第一層是業(yè)務(wù)服務(wù),第二層是業(yè)務(wù)流程,第三層是業(yè)務(wù)組件。具體如下圖:

84ae68e8-d1b0-11ed-bfe3-dac502259ad0.jpg

2.2.1、業(yè)務(wù)服務(wù)

業(yè)務(wù)服務(wù)是業(yè)務(wù)層對(duì)外的統(tǒng)一門面,它由三方面組成:業(yè)務(wù)接口、入?yún)?、出參?/p>

a) 業(yè)務(wù)接口

一個(gè)業(yè)務(wù)接口代表一個(gè)領(lǐng)域的業(yè)務(wù)服務(wù),比如訂單域的業(yè)務(wù)服務(wù)就由接口OrderService表示,會(huì)員域的業(yè)務(wù)服務(wù)就由接口MemberService表示。接口可以按照?qǐng)?zhí)行性質(zhì)分為讀接口和寫接口,比如OrderReadService和OrderWriteService。讀寫分離的好處是可以對(duì)集群進(jìn)行讀寫分組,從而管理流量,當(dāng)然,單機(jī)系統(tǒng)讀寫分離意義不是太大。領(lǐng)域內(nèi)的操作則以業(yè)務(wù)接口中的方法的形式體現(xiàn),比如訂單域有下單createOrder,取消訂單cancelOrder等等操作。對(duì)于這些操作,盡量設(shè)計(jì)出有業(yè)務(wù)含義的方法,而不是增刪改查,當(dāng)然,對(duì)于一些簡(jiǎn)單的業(yè)務(wù),也只能增刪改查。

b)入?yún)?/p>

接下來(lái),是入?yún)⒌脑O(shè)計(jì)。入?yún)?duì)于讀方法,比較簡(jiǎn)單,不做討論。對(duì)于寫方法,我們將入?yún)⒃O(shè)計(jì)成有層次的數(shù)據(jù)模型。首先需要設(shè)計(jì)出公共的數(shù)據(jù)模型,比如訂單數(shù)據(jù)模型,商家數(shù)據(jù)模型,商品數(shù)據(jù)模型等,然后將這些數(shù)據(jù)模型和一些特定業(yè)務(wù)下的個(gè)性數(shù)據(jù)結(jié)合,組成Request對(duì)象,這個(gè)request對(duì)象按照不同業(yè)務(wù)操作不同而不同,對(duì)應(yīng)的返回結(jié)果就是response,它也是隨著不同業(yè)務(wù)返回的參數(shù)不同。

舉個(gè)例子,拿下餐飲訂單來(lái)說(shuō),首先,我們應(yīng)該識(shí)別出這些業(yè)務(wù)流程中一些比較基礎(chǔ)的數(shù)據(jù)模型,比如餐飲領(lǐng)域的菜品、桌位等,這些模型之所以說(shuō)是基礎(chǔ)模型,是因?yàn)?,不管下什么餐飲訂單,菜品和桌位肯定是逃不了的,它們是可以被?fù)用的!因此,我們分別為這些基礎(chǔ)模型設(shè)計(jì)相對(duì)于的DO(Domian Object):DishDO(菜品)、BoardDO(桌位)等等,接下來(lái),我們?yōu)橄虏惋嬘唵卧O(shè)計(jì)一個(gè)請(qǐng)求對(duì)象DishOrderCreateRequest其中DishOrderCreateRequest內(nèi)部包含了DishDO和BoardDO,另外會(huì)包含一些特定的屬性,比如人數(shù)啊,折扣啊等等,這樣一來(lái)就能做到通用和靈活兼顧,DishOrderCreateRequest代表的個(gè)性化的靈活的業(yè)務(wù)入?yún)ⅲ鳧ishDO和BoardDO等則代表了不易變化的基礎(chǔ)模型。

c) 出參

最后,是出參的設(shè)計(jì)。對(duì)于寫方法,一般出參比較簡(jiǎn)單。對(duì)于讀方法,出參往往是一個(gè)結(jié)構(gòu)與層次比較復(fù)雜的組合對(duì)象。比如查詢一個(gè)訂單,這個(gè)訂單有訂單基本信息,還有商品信息,收貨人地址信息等。在設(shè)計(jì)出參的時(shí)候,結(jié)構(gòu)上要設(shè)計(jì)成組合對(duì)象,但是真正查詢的時(shí)候,通過(guò)查詢選擇器,去查詢不同的組合對(duì)象。比如查詢選擇器設(shè)置商品查詢?yōu)閠rue,地址查詢?yōu)閒alse,那么這次查詢出的訂單就只包含商品,而不包含地址。

2.2.2、業(yè)務(wù)流程

業(yè)務(wù)流程其實(shí)就是對(duì)業(yè)務(wù)規(guī)則的解釋,只是這種解釋使用代碼去實(shí)現(xiàn)的,我們要做的其實(shí)就是準(zhǔn)確翻譯這些業(yè)務(wù)規(guī)則,并維護(hù)好這些業(yè)務(wù)規(guī)則。

業(yè)務(wù)流程中可以大致分為三種動(dòng)作節(jié)點(diǎn),1、組裝參數(shù)節(jié)點(diǎn) 2、規(guī)則判斷節(jié)點(diǎn) 3、執(zhí)行動(dòng)作節(jié)點(diǎn),其中每個(gè)動(dòng)作節(jié)點(diǎn)都是一些業(yè)務(wù)代碼的片段。舉個(gè)例子,下餐飲訂單,我們第一步就是將上層傳入的參數(shù)組裝出一個(gè)基礎(chǔ)的DishOrderDO(組裝參數(shù)節(jié)點(diǎn)),然后按照特定的規(guī)則去填充這個(gè)DishOrderDO(規(guī)則判斷節(jié)點(diǎn)),然后就是調(diào)用DAO去創(chuàng)建DishOrderDO(執(zhí)行動(dòng)作節(jié)點(diǎn))。

業(yè)務(wù)流程是最容易變化的地方,要想維護(hù)好業(yè)務(wù)流程并不容易,總的思想是將大的業(yè)務(wù)流程拆分成小的業(yè)務(wù)流程,抽出每個(gè)業(yè)務(wù)流程中共有的代碼片段,變成可維護(hù)的業(yè)務(wù)組件。

2.2.2、業(yè)務(wù)組件

a) 基礎(chǔ)組件

業(yè)務(wù)組件其實(shí)是將一些內(nèi)聚的可復(fù)用的代碼片段進(jìn)行封裝。和業(yè)務(wù)流程中的三種業(yè)務(wù)節(jié)點(diǎn)相對(duì)應(yīng),業(yè)務(wù)組件也分為三種:組裝參數(shù)組件 、規(guī)則判斷組件 、動(dòng)作執(zhí)行業(yè)務(wù)組件。業(yè)務(wù)組件的抽象往往是對(duì)業(yè)務(wù)有了深刻理解之后才進(jìn)行的,盲目地進(jìn)行業(yè)務(wù)組件的抽象,往往到頭來(lái)白忙活。

b) 能力

對(duì)業(yè)務(wù)組件進(jìn)行進(jìn)一步抽象,可以得到能力。業(yè)務(wù)能力是具有一定復(fù)用性的組件的組合,比如發(fā)短信能力=組裝短信參數(shù)組件+發(fā)短信組件。對(duì)于發(fā)短信能力,可以被不同的業(yè)務(wù)流程復(fù)用,比如訂單下單成功發(fā)短信,支付成功發(fā)短信,邏輯都是相似的,只有內(nèi)容不同。能力是一種粒度比較大的組件,粒度越大,往往復(fù)用性就越小,對(duì)能力的抽取,也是基于對(duì)特定業(yè)務(wù)深刻的理解,沒有一勞永逸的銀彈。

c)更高緯度的抽象

經(jīng)過(guò)本人的實(shí)踐,對(duì)于互聯(lián)網(wǎng)這樣的需求變化極快的場(chǎng)景,更高緯度的組件抽象往往性價(jià)比很低,不建議大家去做。

2.3、基礎(chǔ)層

基礎(chǔ)層包含兩個(gè)部分,第一是接口定義,第二是技術(shù)組件。

84b691b2-d1b0-11ed-bfe3-dac502259ad0.jpg

2.3.1、接口定義

接口定義是按照不同的技術(shù)框架,同時(shí)結(jié)合業(yè)務(wù)需要,設(shè)計(jì)出合理的接口,對(duì)于業(yè)務(wù)組件來(lái)說(shuō),它們只會(huì)感知技術(shù)接口,而不會(huì)去感知技術(shù)實(shí)現(xiàn),我們也不應(yīng)該將具體的技術(shù)細(xì)節(jié)向上暴露,這也就是所謂的面向接口編程。技術(shù)接口往往是業(yè)務(wù)與技術(shù)之間的橋梁,接口本身是含有業(yè)務(wù)含義的,最常見的就是DAO接口,我們?cè)O(shè)計(jì)DAO接口的時(shí)候,不會(huì)設(shè)計(jì)成insert、update、query這樣業(yè)務(wù)無(wú)關(guān)的接口,而是設(shè)計(jì)成insertUser,updateUserById等等和業(yè)務(wù)相關(guān)的接口,同樣的道理,設(shè)計(jì)緩存接口的時(shí)候,也不能設(shè)計(jì)成put、get這樣的接口,而應(yīng)該設(shè)計(jì)成cacheUser,deprecateUser這樣的接口。

2.3.2、技術(shù)組件

單機(jī)系統(tǒng)的技術(shù)組件一般來(lái)說(shuō)分兩種,一種是通用的技術(shù)組件,比如:數(shù)據(jù)存儲(chǔ)、緩存、消息和調(diào)度任務(wù)、事務(wù)、鎖。一種是基礎(chǔ)設(shè)施,比如spring容器,tomcat容器。下面稍微談?wù)勍ㄓ眉夹g(shù)組件。

數(shù)據(jù)存儲(chǔ):數(shù)據(jù)存儲(chǔ)包括關(guān)系型數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù)以及文件存儲(chǔ)系統(tǒng)。關(guān)系型數(shù)據(jù)庫(kù),比如MySQL,適合存放絕大部分業(yè)務(wù)數(shù)據(jù)。非關(guān)系型數(shù)據(jù)庫(kù),比如hbase,可以存放歷史日志,也可以對(duì)歷史的MySQL數(shù)據(jù)進(jìn)行歸檔。文件存儲(chǔ)系統(tǒng),一般都是基于Linux文件系統(tǒng),比如圖片、html文件等等,也有基于HDFS的,用于大數(shù)據(jù)分析。

緩存:緩存按響應(yīng)時(shí)間分,可以分為納秒級(jí)緩存,毫秒級(jí)緩存和百毫秒級(jí)緩存。納秒級(jí)緩存就是一般的基于本地內(nèi)存的緩存,比如encache,毫秒級(jí)緩存一般是集中式的內(nèi)存緩存,比如memcache,由于訪問時(shí)遠(yuǎn)程調(diào)用,因此響應(yīng)時(shí)間會(huì)延長(zhǎng)到幾毫秒,百毫秒級(jí)緩存一般是集中式可持久化的緩存,比如redis,由于存在遠(yuǎn)程訪問以及緩存擊穿導(dǎo)致的讀取持久化記錄,它的響應(yīng)時(shí)間會(huì)更長(zhǎng)些,到幾十甚至上百毫秒。單機(jī)系統(tǒng)一般用本地內(nèi)存緩存就夠了,當(dāng)緩存被擊穿的時(shí)候,直接訪問數(shù)據(jù)庫(kù)。

消息和調(diào)度任務(wù):消息和調(diào)度任務(wù)本質(zhì)都是一種異步化的手段,區(qū)別在于消息無(wú)法控制異步的時(shí)間,而調(diào)度任務(wù)可以。一般,消息發(fā)送出去后,監(jiān)聽消息的系統(tǒng)會(huì)立即收到消息,從而立即觸發(fā)業(yè)務(wù)邏輯的執(zhí)行,而調(diào)度任務(wù)則會(huì)按照調(diào)度規(guī)則,一次或者多次的執(zhí)行業(yè)務(wù)邏輯。單機(jī)系統(tǒng)中消息和調(diào)度任務(wù)用到的比較少,在做日志監(jiān)控的時(shí)候可能會(huì)用到消息,在進(jìn)行數(shù)據(jù)報(bào)表統(tǒng)計(jì)的時(shí)候可能會(huì)用到調(diào)度任務(wù)。

事務(wù):事務(wù)本質(zhì)都是基于數(shù)據(jù)庫(kù)去實(shí)現(xiàn)的,單機(jī)系統(tǒng)的事務(wù)就是依賴數(shù)據(jù)庫(kù)的事務(wù),我們可以使用spring-tx的事務(wù)模板進(jìn)行事務(wù)操作,在業(yè)務(wù)邏輯開發(fā)中,一定要把握事務(wù)的大小,建議把業(yè)務(wù)比較緊密的一堆數(shù)據(jù)庫(kù)操作放在一個(gè)事務(wù)里,不要隨意的為每個(gè)方法都開啟事務(wù)。

鎖:?jiǎn)螜C(jī)系統(tǒng)中主要用到兩種鎖:樂觀鎖和悲觀鎖。樂觀鎖依靠在數(shù)據(jù)庫(kù)的業(yè)務(wù)表加版本字段來(lái)實(shí)現(xiàn),每次更新都會(huì)去判斷版本是否變化,如果變化則需要重試,這種鎖的粒度比較小。悲觀鎖是基于JDK的Lock接口的,對(duì)一個(gè)業(yè)務(wù)流程進(jìn)行加鎖和釋放鎖的操作,鎖的粒度比較粗。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3737

    瀏覽量

    64173
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3062

    瀏覽量

    48575
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    505

    瀏覽量

    25420

原文標(biāo)題:收藏:從零開始搭建一個(gè)通用業(yè)務(wù)架構(gòu)

文章出處:【微信號(hào):架構(gòu)師技術(shù)聯(lián)盟,微信公眾號(hào):架構(gòu)師技術(shù)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    從零開始學(xué)電路基礎(chǔ)》(從零開始學(xué)電子技術(shù)叢書)

    從零開始學(xué)電路基礎(chǔ)》(從零開始學(xué)電子技術(shù)叢書)下載地址如下http://www.verycd.com/topics/2798785/[從零開始學(xué)電路基礎(chǔ)].劉建清.掃描版.pdf[從零開始
    發(fā)表于 06-05 23:12

    labview從零開始

    怎么從零開始啊,哪位大神給個(gè)意見
    發(fā)表于 07-10 10:29

    從零開始學(xué)系列電子書籍》大集合【值得收藏】!?。?/a>

    收藏! 該系列叢書有:1.從零開始學(xué)電路基礎(chǔ);2.從零開始學(xué)模擬電子技術(shù);3.從零開始學(xué)數(shù)字電子技術(shù);4.從零開始學(xué)單片機(jī)C語(yǔ)言;5.
    發(fā)表于 08-15 11:43

    怎樣從零開始個(gè)操作系統(tǒng)?

    首頁(yè)發(fā)現(xiàn)等你來(lái)答?登錄加入知乎如何從零開始個(gè)簡(jiǎn)單的操作系統(tǒng)?關(guān)注問題寫回答操作系統(tǒng)編程學(xué)習(xí)如何從零開始
    發(fā)表于 07-19 09:10

    如何從零開始搭建個(gè)四輪小車模型?

    如何從零開始搭建個(gè)四輪小車模型?
    發(fā)表于 11-11 06:26

    怎樣從零開始搭建個(gè)STM32F103C8T6工程呢

    怎樣從零開始搭建個(gè)STM32F103C8T6工程呢?MDK的仿真功能該如何去使用呢?
    發(fā)表于 11-26 07:19

    教你怎樣從零開始搭建Firefly-RK3288的開發(fā)板的編譯環(huán)境

    教你怎樣從零開始搭建Firefly-RK3288的開發(fā)板的編譯環(huán)境
    發(fā)表于 03-10 07:32

    從零開始學(xué)ARM》真心適合新手小白

    ARM架構(gòu)直以來(lái)都備受歡迎,無(wú)論是在移動(dòng)設(shè)備、嵌入式系統(tǒng)還是服務(wù)器領(lǐng)域。然而,對(duì)于初學(xué)者而言,ARM架構(gòu)可能顯得復(fù)雜而晦澀。《從零開始學(xué)ARM》這本書為初學(xué)者提供了
    發(fā)表于 09-02 15:29

    從零開始學(xué)電路基礎(chǔ)

    從零開始學(xué)電路基礎(chǔ) 電路基礎(chǔ)是學(xué)習(xí)電子技術(shù)的起步知識(shí)。本書就是為使初學(xué)者從零開始,快速掌握電路基礎(chǔ)知識(shí)而編寫的。與傳統(tǒng)的電路基礎(chǔ)教材不同的是,本書擯棄了
    發(fā)表于 03-15 16:12 ?0次下載

    電腦組裝從零開始

    電腦組裝從零開始問題解答
    發(fā)表于 06-29 17:34 ?148次下載

    STM32神舟III號(hào)開發(fā)板從零開始建立個(gè)模板工程

    STM32神舟III號(hào)開發(fā)板從零開始建立個(gè)模板工程
    發(fā)表于 03-26 15:21 ?132次下載

    從零開始MQX開發(fā)之編譯MQX庫(kù)

    從零開始MQX開發(fā)之:如何 編譯MQX庫(kù)
    發(fā)表于 11-26 14:52 ?0次下載

    從零開始搭建3D打印機(jī)

    從零開始搭建3D打印機(jī)從零開始搭建3D打印機(jī)
    發(fā)表于 01-15 16:35 ?0次下載

    從零開始android游戲編程

    從零開始android游戲編程
    發(fā)表于 03-19 11:23 ?3次下載

    STM32從零開始 - 前言:硬件準(zhǔn)備

    STM32從零開始 - 前言:硬件準(zhǔn)備
    發(fā)表于 11-23 17:51 ?10次下載
    STM32<b class='flag-5'>從零開始</b> - 前言:硬件準(zhǔn)備