欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何理解WEB工程模塊拆分

本篇內(nèi)容主要講解“如何理解WEB工程模塊拆分”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何理解WEB工程模塊拆分”吧!

裕民ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

WEB工程模塊拆分設(shè)想

首先來看目前使用到的一些開發(fā)模塊,通常有dao、api、service、task、base、web五種,上述五種內(nèi)容含義如下:

  • dao:存儲(chǔ)數(shù)據(jù)庫實(shí)體和mapper相關(guān)內(nèi)容。

  • api:存儲(chǔ)open feign相關(guān)接口,為SpringCloud提供服務(wù)。

  • service:存儲(chǔ)當(dāng)前項(xiàng)目中關(guān)于業(yè)務(wù)處理的代碼。

  • task:存儲(chǔ)關(guān)于定時(shí)任務(wù)相關(guān)代碼。

  • base:存儲(chǔ)請求參數(shù),返回參數(shù),枚舉等JavaBean對象,不具備高級功能。

  • web:存儲(chǔ)controller、攔截器、過濾器等于web有關(guān)代碼。

上述這種模塊分包是一個(gè)比較常用的方式,但是上述分包在筆者開發(fā)過程之中產(chǎn)生了很多問題,比如快速找到某一個(gè)對象的轉(zhuǎn)換,快速找到某一個(gè)對象的緩存處理等問題。為此提出了一種新的分包模式。

領(lǐng)域模型

首先從HTTP請求開始,對于一個(gè)請求會(huì)有兩個(gè)內(nèi)容,請求對象,請求響應(yīng)對象,一般而言這兩個(gè)對象是一個(gè)比較獨(dú)立不會(huì)有特殊方法的對象(即一個(gè)普通的JavaBean),對于這塊內(nèi)容筆者將其分在了領(lǐng)域模型(domain-model),在緩存中的對象也可以放在領(lǐng)域模型中,它們基本上不會(huì)具有額外的處理方法。領(lǐng)域模型中存儲(chǔ)各類模型對象,它們不具備特殊方法。

可以被歸屬在領(lǐng)域模型模塊的內(nèi)容有:

  1. 請求對象:request params 、request-body

  2. 請求響應(yīng)對象:response

  3. 緩存對象

  4. 異常對象

繼續(xù)說回HTTP請求,一個(gè)請求參數(shù)進(jìn)入到web應(yīng)用時(shí)開發(fā)者通常會(huì)對這些請求參數(shù)進(jìn)行驗(yàn)證,對于驗(yàn)證有一些比較簡單的驗(yàn)證可以通過hibernate-validator 中提供的注解來提高編碼效率,在這種注解使用過程中會(huì)有各種group。下面舉一個(gè)例子,UserAppViewReq類作為一個(gè)請求參數(shù),在使用了驗(yàn)證相關(guān)注解后變成下面代碼:

public class UserAppViewReq {
  @NotBlank(
      message = "appId不能為空",
      groups = {First.class, Second.class})
  private String appId;
}

在上述代碼中出現(xiàn)了First,Second兩個(gè)組別,對于這種組別有時(shí)候可能多達(dá)4個(gè),同時(shí)在翻閱代碼時(shí)比如Controller進(jìn)入,具體代碼如下:

@PostMapping("/addUserAppView")
public ResultVO addUserAppView(@RequestBody @Validated(First.class) UserAppViewReq req) {
  userService.addUserAppView(req);
  return ResultVO.success();
}

在這段代碼中還需要記錄First這個(gè)group標(biāo)記,才可以對應(yīng)到實(shí)體對象中的一些驗(yàn)證。同時(shí)這些驗(yàn)證只能支持一些簡單的驗(yàn)證,遇到邏輯驗(yàn)證比如數(shù)據(jù)庫唯一這個(gè)驗(yàn)證器沒有辦法給開發(fā)者直接提供幫助,開發(fā)者還是需要去寫一個(gè)單獨(dú)的驗(yàn)證方法。因此對于參數(shù)驗(yàn)證這塊提取出了一個(gè)新的模塊領(lǐng)域模型驗(yàn)證(domain-validator),在這個(gè)模塊中開發(fā)者需要編寫領(lǐng)域模型中對于數(shù)據(jù)驗(yàn)證的內(nèi)容。在這個(gè)模塊中它需要具備數(shù)據(jù)庫操作或者其他的第三方數(shù)據(jù)操作功能(比如HTTP請求)。

說完了驗(yàn)證相關(guān)內(nèi)容在前文的例子中HTTP請求參數(shù)已經(jīng)進(jìn)入到后端應(yīng)用,假設(shè)數(shù)據(jù)全部處理完成現(xiàn)在到了返回對象的時(shí)候,此時(shí)開發(fā)者經(jīng)常需要做一些數(shù)據(jù)轉(zhuǎn)換,將數(shù)據(jù)庫對象轉(zhuǎn)換成請求返回對象。舉一個(gè)例子:用戶名密碼,兩者只能返回用戶名,密碼一般不會(huì)返回,通常這部分操作是在Service中進(jìn)行,筆者認(rèn)為這部分操作應(yīng)該獨(dú)立出來,它可以提取出一個(gè)新的模塊領(lǐng)域模型轉(zhuǎn)換(domain-convert)。在這個(gè)模塊中筆者希望是一個(gè)獨(dú)立的只有領(lǐng)域模型轉(zhuǎn)換的一個(gè)工程,不希望有一些數(shù)據(jù)庫或者緩存的操作,這只是希望,開發(fā)者還是可以在這個(gè)模塊中進(jìn)行一些數(shù)據(jù)庫或者緩存的查詢操作。但是不能直接操作redisTemplateDataSource

領(lǐng)域模型小結(jié)

通過前文的描述可以提取出如下的一些maven工程

  • domain:存儲(chǔ)領(lǐng)域模型相關(guān)工程

    • domain-convert:領(lǐng)域模型轉(zhuǎn)換工程,負(fù)責(zé)領(lǐng)域模型的轉(zhuǎn)換。

    • domain-model:領(lǐng)域模型存儲(chǔ)工程,負(fù)責(zé)存儲(chǔ)各類領(lǐng)域模型。

    • domain-validator:領(lǐng)域模型驗(yàn)證工程,負(fù)責(zé)對領(lǐng)域模型進(jìn)行驗(yàn)證。

注意:在當(dāng)前版本的領(lǐng)域模型中未對領(lǐng)域事件進(jìn)行定義。有關(guān)領(lǐng)域事件可以使用SpringEvent相關(guān)內(nèi)容作為補(bǔ)充

Controller

下面將介紹Controller相關(guān)的分類,對于一個(gè)WEB項(xiàng)目項(xiàng)目通常會(huì)有公開到互聯(lián)網(wǎng)的接口也會(huì)有僅限于內(nèi)部局域網(wǎng)訪問的接口,在這兩者之間可能還會(huì)存在一些公共的接口,對此可以總結(jié)下面三種類型的Controller:

  1. 公共Controller

  2. 互聯(lián)網(wǎng)Controller

  3. 局域網(wǎng)Controller

公共Controller被互聯(lián)網(wǎng)Controller和局域網(wǎng)Controller引用。根據(jù)這樣的一個(gè)設(shè)計(jì)思路可以做出如下的maven工程:

  • controller:存儲(chǔ)controller相關(guān)工程

    • controller-common:存儲(chǔ)公共的Controller接口。

    • controller-inner:存儲(chǔ)局域網(wǎng)內(nèi)可訪問的Controller接口。

    • controller-public-network:存儲(chǔ)互聯(lián)網(wǎng)上可以訪問的Controller接口。

注意:在controller工程種只存有controller接口定義和控制層的一些基本處理不具備業(yè)務(wù)處理能力

業(yè)務(wù)相關(guān)分層

一個(gè)常規(guī)的業(yè)務(wù)處理的處理中開發(fā)者至少需要用到對象,數(shù)據(jù)庫,緩存(某些項(xiàng)目可能沒有)這三者。下面將根據(jù)這三者常用操作對象進(jìn)行工程模塊的劃分。對象這塊內(nèi)容各位可以將其分?jǐn)?shù)到領(lǐng)域模型種,這里不過多討論,下面先來看數(shù)據(jù)庫層面內(nèi)容。

DAO

通常進(jìn)行數(shù)據(jù)庫交互會(huì)使用ORM框架,本文以MyBatis框架為例來對DAO層如何進(jìn)行工程劃分。在Mybatis中開發(fā)時(shí)可能會(huì)引入一些插件這些插件通常都需要通過Java類來進(jìn)行配置或者配置文件等,根據(jù)此可以建立數(shù)據(jù)庫配置工程(db-config),除此之外在MyBatis中還有兩個(gè)關(guān)鍵要素一個(gè)是數(shù)據(jù)庫實(shí)體對象另一個(gè)是mapper,這兩個(gè)都需要獨(dú)立進(jìn)行拆分,數(shù)據(jù)庫實(shí)體對象可以i建立數(shù)據(jù)庫實(shí)體(db-entity)工程,mapper可以建立mapper工程

接下來對數(shù)據(jù)庫實(shí)體的單獨(dú)拆分進(jìn)行說明,在一個(gè)單表對象的增刪改查操作過程中請求參數(shù)對象有可能可以直接轉(zhuǎn)換為數(shù)據(jù)庫對象,因此為了避免多余的Java類引入,在domain-convert工程中可以只引入db-entity,來達(dá)到最小依賴原則。同理對于緩存也是一個(gè)含義因此將數(shù)據(jù)庫實(shí)體單獨(dú)拆分出一個(gè)工程。

根據(jù)前文的設(shè)計(jì)思路可以創(chuàng)建出如下maven工程

  • database-object:存儲(chǔ)DAO相關(guān)工程。

    • db-config:存儲(chǔ)數(shù)據(jù)庫配置相關(guān)內(nèi)容,主要是以MyBatis插件配置為主。

    • db-entity:存儲(chǔ)數(shù)據(jù)庫實(shí)體。

    • mapper:存儲(chǔ)mapper接口和mapperXML文件。

緩存

接下來介紹緩存應(yīng)該如何做好工程分組,首先需要知道緩存的對象可能是那些,前文提到了兩種。第一種是在domain-model中存放的緩存對象,第二種是數(shù)據(jù)庫實(shí)體對象(db-entity工程)。通過這兩點(diǎn)可以確認(rèn)緩存依賴于domain-model和db-entity工程。依賴項(xiàng)解釋完成下面來看具體的工程分類,首先對于緩存的使用通常是redis,對于redis會(huì)有一些RedisTemplate相關(guān)的配置,這部分配置會(huì)被拆分成一個(gè)單獨(dú)的配置工程(cache-configuration),此外還有緩存接口和緩存接口實(shí)現(xiàn)兩個(gè)工程,拆分這兩個(gè)工程的主要目的是為了對外直接提供緩存調(diào)用,配合dubbo框架進(jìn)行使用。

根據(jù)前文設(shè)計(jì)思路可以創(chuàng)建出如下maven工程

  • cache:存儲(chǔ)緩存相關(guān)工程

    • cache-api:存儲(chǔ)緩存交互接口

    • cache-api-impl:存儲(chǔ)緩存交互接口的實(shí)現(xiàn)類

    • cache-configuration:存儲(chǔ)緩存相關(guān)的配置類

業(yè)務(wù)處理能力

業(yè)務(wù)處理能力即項(xiàng)目的核心,提供了本項(xiàng)目的所有功能。在這個(gè)工程中只有兩個(gè)子工程,第一個(gè)是api第二個(gè)是api實(shí)現(xiàn)。在api實(shí)現(xiàn)工程中編寫的內(nèi)容就是常規(guī)開發(fā)中需要編寫的代碼,在這個(gè)模塊中主要是將前文提到的各種依賴關(guān)系引入。

首先需要引入的依賴是數(shù)據(jù)庫層面的兩個(gè)依賴(db-entity和mapper)它們可以提供數(shù)據(jù)庫交互(增刪改查),繼續(xù)引入的依賴是domain工程中的三個(gè)依賴(domain-convert、domain-model、domain-validator),其次是緩存相關(guān)依賴(如果沒有緩存層可以不引入),需要引入的是(cache-api和cache-api-impl)。引入完成這些依靠即可進(jìn)行業(yè)務(wù)相關(guān)開發(fā)。

根據(jù)上述思路可以將業(yè)務(wù)處理能力分為下面幾個(gè)mavne工程

  • infrastructure:存儲(chǔ)業(yè)務(wù)處理能力相關(guān)工程

    • infrastructure-api:存儲(chǔ)業(yè)務(wù)相關(guān)的接口定義

    • infrastructure-api-impl:存儲(chǔ)業(yè)務(wù)相關(guān)的接口實(shí)現(xiàn)類

最后業(yè)務(wù)處理能力要和controller工程中的三個(gè)工程進(jìn)行整合,這部分整合根據(jù)項(xiàng)目需求進(jìn)行整合即可

注意:在業(yè)務(wù)處理能力相關(guān)工程拆分時(shí)并沒有按照網(wǎng)絡(luò)環(huán)境進(jìn)行區(qū)分。

項(xiàng)目內(nèi)自定義配置

在項(xiàng)目開發(fā)過程中難免會(huì)定義一些項(xiàng)目內(nèi)的配置,這部分配置不是SpringBoot的配置也不是SpringCloud相關(guān)的配置,而是在項(xiàng)目中獨(dú)立的配置,比如友盟推送的一些配置。這部分配置需要有一個(gè)單獨(dú)的地方來進(jìn)行存儲(chǔ),由于配置類在SpringBoot中通常是一個(gè)簡單的Java對象,因此配置工程不會(huì)有太多的子工程,目前配置工程的maven工程定義如下:

  • project-configuration:存儲(chǔ)項(xiàng)目內(nèi)自定義的配置類

注意:這部分自定義配置通常會(huì)引入到業(yè)務(wù)處理能力的模塊中,即infrastructure-impl工程中。

啟動(dòng)類

接下來將介紹關(guān)于啟動(dòng)相關(guān)內(nèi)容。根據(jù)前文提到的一些內(nèi)容可以推論出下面三個(gè)啟動(dòng)類:

  1. 對內(nèi)部局域網(wǎng)使用的啟動(dòng)類

  2. 對互聯(lián)網(wǎng)使用的啟動(dòng)類

  3. 定時(shí)任務(wù)啟動(dòng)類

說是說三個(gè)啟動(dòng)類,但是它們應(yīng)該是一個(gè)獨(dú)立的工程,對于web工程來說他沒有自己獨(dú)立的攔截器、過濾器等內(nèi)容,對于定時(shí)任務(wù)而言它會(huì)根據(jù)項(xiàng)目所選擇的定時(shí)任務(wù)框架進(jìn)行定制處理。

根據(jù)上述思路可以做出如下maven工程

  • start:存儲(chǔ)啟動(dòng)工程

    • inner-web-start:存儲(chǔ)內(nèi)部局域網(wǎng)使用相關(guān)啟動(dòng)類及相關(guān)內(nèi)容。

    • public-network-web-start:存儲(chǔ)互聯(lián)網(wǎng)使用相關(guān)啟動(dòng)類及相關(guān)內(nèi)容。

    • task-start:存儲(chǔ)定時(shí)任務(wù)啟動(dòng)類及相關(guān)內(nèi)容。

在這要說明一些依賴關(guān)系,在兩個(gè)web工程中都需要引入與之對應(yīng)的controller工程,除此之外還需要引入額外的兩個(gè)配置工程:數(shù)據(jù)庫配置工程(db-config)和緩存配置工程(cache-configuration),定時(shí)任務(wù)同理按需引入需要的工程模塊即可。

還有另外一種情況是內(nèi)部RPC調(diào)用的情況,這里講到的基本上都是web應(yīng)用,都需要通過http協(xié)議進(jìn)行調(diào)用,某些時(shí)候http并不是最優(yōu)解還會(huì)有其他的RPC方式,比如dubbo。在筆者遇到的開發(fā)過程中有時(shí)候緩存層可能被其他項(xiàng)目進(jìn)行調(diào)用,此時(shí)就會(huì)在start工程中建立一個(gè)dubbo-starter工程將需要的內(nèi)容放到這個(gè)工程中然后發(fā)布一個(gè)dubbo項(xiàng)目對方即可直接通過dubbo來進(jìn)行接口調(diào)用。其他的業(yè)務(wù)處理層也可以通過這樣的方式開放接口。

對外提供服務(wù)

下面介紹對外提供服務(wù),一般情況下工程是以WEB工程的形式運(yùn)行,對外提供服務(wù)有兩種模式第一種是HTTP-CLIENT另一種是OpenFeign,在HTTP-CLIENT中又可以細(xì)分httpclient和okhttp。根據(jù)這個(gè)思路可以做出如下maven工程

  • open-api:存儲(chǔ)對外提供服務(wù)的工程。

    • open-api-httlclient:存儲(chǔ)基于httpClient實(shí)現(xiàn)的外部服務(wù)。

    • open-api-okhttp:存儲(chǔ)基于okHttp實(shí)現(xiàn)的外部服務(wù)。

    • with-http-client:存儲(chǔ)httpClient相關(guān)工程。

    • with-open-feign:存儲(chǔ)基于OpenFeign的外部接口調(diào)用服務(wù)。

到此,相信大家對“如何理解WEB工程模塊拆分”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文標(biāo)題:如何理解WEB工程模塊拆分
網(wǎng)站鏈接:http://chinadenli.net/article0/gshpio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)搜索引擎優(yōu)化網(wǎng)站改版全網(wǎng)營銷推廣外貿(mào)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司