高清欧美不卡一区二区三区-高清免费毛片-高清精品-高清国语自产拍免费视频国产-天天综合天天做-天天综合天天综合

業務中臺構建-服務識別

SOA團隊 2020-03-16

對于中臺構建,實際上兩個關鍵點,第一個是劃分微服務模塊粒度,第二個就是在模塊劃分清楚后確定服務識別和定義的粒度。在服務識別和定義前,可以先參考本文檔【3.2.2.2 Http Rest接口設計】這篇文章。

在上篇談中臺構建模塊劃分的時候,強調了一個關鍵點,就是盡可能以數據的維度來進行模塊拆分,數據包括了基礎主數據和核心共享數據,在數據驅動下拆分模塊,那么模塊底層對應的數據庫如何拆分基本也就清楚了。一定要知道,微服務架構下,我們底層數據庫也是拆分了的。

底層數據庫沒有拆分,但是仍然用SpringCloud框架開發,可以拆分為多個JAR包,在這種模式下只能認為是一個微服務模塊,而不是獨立,因為其不存在獨立自治能力。我們看到很多上層開發采用SpringCloud框架,但是數據庫仍然采用一個數據庫的情況,再次說明,對于這種架構設計,不是標準意義上的微服務架構,沒有做到徹底解耦。

面向資源,面向對象和領域驅動設計

對于Http Rest接口說的最多的就是面向資源的設計,對于資源有標準的Http Put,Post,Delte,Get等操作。因此你需要定義好相應的資源。資源可以放在計算機上并體現為比特流的事物,可以是結構化的數據或對象集合,也可以是圖片或文件流,這些都是可以處理和操作的資源。

面向資源和領域驅動本身不是一種新的軟件工程設計方法,真正的方法只有傳統的面向結構設計和面向對象設計兩種。因此對于面向資源可以按面向傳統結構化設計,也可以按面向對象設計。當然最好的方式仍然是面向對象進行設計。

資源即實體,實體即對象,這個對象代表的是業務對象,有明確的業務含義,類似供應商,采購訂單,產品,合同等。同時這些對象本身存在關聯和遞進的層次結構,比如供應商有對應的聯系人,有對應的銀行賬號。產品可能有對應的維修記錄等。

而這些業務對象正是我們在領域驅動設計時候經常會識別的領域對象,這個領域對象涉及到多個子類,是否歸結到一個大的領域對象最關鍵的還是是否共屬一個生命周期。面向資源設計,完全可以采用面向領域設計方法,首先定義領域對象,將領域對象建模為對應的資源,然后再考慮看這個資源應該暴露哪些能力接口出來。

所以在微服務架構下,首先要了解清楚面向資源進行Rest接口能力設計,資源的識別和定義可以參考領域設計的思路進行,識別和定義領域對象,然后再轉為資源定義。

接口服務的粗粒度是關鍵

如果我們不按領域對象方式來定義資源,那么我們最容易犯的錯誤就是將所有的數據庫表對象都全部定義為一個個獨立的資源,將這些資源的CRUD操作,全部暴露為Get,Put,Post和Delete接口方法。那么這樣暴露出來的Http Rest接口方法就全部是細粒度的接口。

這種方法很省事,一個模塊有100張表,你只需要暴露100個接口,每個接口都含標準的上述操作就完事了。但是這種接口服務識別和定義沒有任何意義,也不符合我們粗粒度的要求。

那么問題的關鍵點在哪里?其關鍵就是原來應該是粗粒度的體現業務價值的接口服務全部都變成了細粒度的DAO訪問類細粒度接口服務。失去了接口的意義,同時又將本身應該完全內聚在微服務模塊內部的業務邏輯全部暴露到外層去解決。這個有點類似我們在進行領域驅動設計的時候,經常談到的貧血的領域服務層,即我們的Http Rest接口應該是粗粒度的,應該是滿血的領域服務層的能力暴露,而不是底層數據庫CRUD操作的暴露。

通過識別的資源來識別和定義接口

只要確定了資源,那么我們就很容易來確定資源應該提供哪些接口。

在我們進行接口設計的時候,如果一個資源完全不需要和外部微服務模塊或外部應用打交道,那么這個資源完全不用開放任何接口。這個是我一直強調的原則,即在微服務模塊內部最好是走傳統API接口交付方法進行調用,而不是走Http Rest接口服務,這一方面是提升性能,一方面是減少各類難以應對的分布式事務問題。

在資源定義清楚后,往往資源都是一個復合對象,比如采購訂單資源,涉及到采購訂單頭或采購訂單明顯信息,之間還存在關聯,但是這是一個完整的資源對象。對于采購訂單對象,根據業務場景,存在外部導入新的采購訂單,存在外部對已有的采購訂單進行變更后導入,存在外部需要查詢采購訂單集合,同時查看某一個特定key值的采購訂單的詳細明細數據。這可能是我們經常會遇到的接口需求場景,從這些場景可以看到,我們的設計完全可以基于采購訂單資源展開。

創建新的采購訂單:POST /Orders

修改一張ID為1的已有訂單:PATCH /Orders/1

刪除ID為1的已有訂單:DELETE /Orders/1

查詢所有采購訂單:GET /Orders

查詢ID為1的采購訂單:GET /Orders/1

查詢1月到5月的訂單:GET /Orders?StartData='201801'&&EndDate='201805'

可以看到,第一種方法就是上面的,可以直接在資源后面增加不同的參數條件進行模糊查詢。其次,我們可以將查詢條件定義為一個查詢實體類,同時將整個查詢實體類的信息通過一個完整的實體對象傳遞過去進行查詢,查詢完成后再返回相應的結果。比如我們定義一個OrderQueryExt實體類。

基于特定條件的模糊查詢:POST /Orders/OrderQueryExt

那是否會存在只查詢一張采購訂單的采購明細列表信息?如果存在這種情況,應該按照資源和資源層次關系進行設計,由資源逐層展開查詢。

查詢ID為1的訂單的所有采購明細:GET /Orders/1/OrderDetails

查詢ID為1的訂單的流程審批記錄信息:GET /Orders/1/ProcessDetails

查詢ID為1的訂單的所有附件信息:GET /Orders/1/Attaches

對于PUT和PATCH而言,如果涉及的情況一般是對實體的部分數據進行更新,同時還需要支持SaveAndUpdate操作,那么我們一般都采用PATCH方式,而不是PUT方式。即實際資源接口設計的時候,單純的PUT場景往往現在已經很少發生。

定義業務規則和邏輯處理類接口

這是我們遇到的第二大類,前面基于資源進行接口設計思路已經很明確。但是對于業務規則處理類往往比較難,比如我們經常遇到的提交報賬單的時候需要進行預算校驗和控制,這個就是典型的業務規則處理類,報賬單提交需要,合同提交往往也需要。

那么這里的資源究竟是什么?

對于預算信息應該不是這里的資源,因為預算信息的錄入和維護,才會涉及到預算信息開放接口。而這里的業務場景是對已有的預算信息進行規則計算和校驗。

基于這類場景,我們看到比較好的設計方法是定義一個獨立的規則類,將規則類映射為一個資源,比如這例子里面我們可以定義一個BudgetControl的規則類,這個類可以定義為一個資源對象。任何一個規則處理都涉及到有具體的輸入和輸出。

比如預算校驗:

輸入:具體的組織信息,預算科目信息,當前申請預算信息,年度或月度信息

輸出:校驗結果信息

你會看到對于預算校驗,預算扣減,預算凍結,實際上他們的輸入和輸出都是相同的,那么我們可以劃歸到同一個規則處理類里面進行處理。那么規則類的定義,需要增加一個規則處理類型即可。

那么不論是預算校驗,還是預算凍結,可以看到實際的接口調用都是:

POST /BudgetControls

當然也可以將預算檢查,預算凍結等定義為預算控制類的子對象,比如預算檢查Valid,那接口調用為:

POST /BudgetControls/Valid

所以對于業務規則的處理可以看到,最重要的是業務規則類的定義,業務規則類定義清楚了,業務規則類轉為資源,形成對資源的Http操作接口。

對于業務規則類,一定是粗粒度服務接口,規則的處理邏輯都應該完全控制在模塊內部而不是被暴露到外面去。因此對于規則類的定義也是,僅僅提供僅有的輸入和輸出,能夠滿足規則處理和計算要求即可。

返回上頁
999热视频| 国产日韩三区| 亚洲精品一区二区三区av| 特级西西444www大精品视频| 99视频网站| 97超碰人人看人人| 一道精品一区二区三区| 精品高清视频| 精品午夜一区二区| 精品欧美一区二区三区久久久| 欧洲精品久久| 亚洲一区高清| 国产精品 日韩| 国产精品永久入口久久久| 亚洲人体一区| 最新国产精品久久| 日本在线高清视频一区| 久久精品日产第一区二区三区精品版| 亚洲人成人77777线观看| 天堂va久久久噜噜噜久久va| 国产在线一区二区三区欧美| 国产尤物91| 一本色道久久综合亚洲二区三区| 91丨九色丨国产| 久久久精品有限公司| 日本一区二区高清视频| 亚洲国产欧洲综合997久久| 日韩三级电影免费观看| av一区二区三区四区电影| 国产综合欧美在线看| 亚洲电影网站| 九九九九九九精品| 在线丝袜欧美日韩制服| 茄子视频成人在线观看 | 国产精品国产一区二区 | 亚洲免费精品视频| 国产视色精品亚洲一区二区| 五月天亚洲综合| 欧洲成人一区二区| 欧美亚洲另类在线一区二区三区| 丁香五月网久久综合| 高清日韩一区| 国模一区二区三区私拍视频| eeuss一区二区三区| 一本一道久久a久久精品综合| 免费在线一区二区| 国产亚洲精品久久飘花| 国内一区二区三区在线视频| 国产精品9999久久久久仙踪林 | 天天人人精品| 亚洲精品中字| 在线丝袜欧美日韩制服| 亚洲欧洲精品一区二区| 亚洲欧洲另类精品久久综合| 亚欧洲精品在线视频免费观看| 日本一区网站| av在线亚洲男人的天堂| 久久精品国产一区二区三区日韩| 精品国产aⅴ麻豆| 日本亚洲导航| 成人av资源网| 欧美日韩大片一区二区三区| 91嫩草视频在线观看| 久久综合九色综合网站| 91免费看网站| 日本黑人久久| 精品国产乱码久久久久久郑州公司 | 日韩av一区二区三区美女毛片| 视频在线精品一区| 蜜桃久久精品乱码一区二区| 666精品在线| 天堂精品一区二区三区| 久久综合伊人77777麻豆| 成人国产1314www色视频| 亚洲不卡1区| 日韩影视精品| 日本一区二区三区免费观看| 欧洲精品久久| 日韩精品不卡| 欧美日韩精品综合| 久久久久资源| 久久久久资源| 日韩一区国产在线观看| 日本视频一区在线观看| 国产精品亚洲一区| 国产乱码一区| 久久资源亚洲| 久久视频在线观看中文字幕| 久久久精品动漫| 欧美一级二级三级| 91精品国产一区二区三区动漫 | 欧美激情论坛| 精品麻豆av| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲一二三区精品| 麻豆久久久av免费| 国产精品二区二区三区| 国产精品theporn88| 亚洲看片网站| 精品国产乱码久久久久久108| 91超碰rencao97精品| 欧美日韩一区二区视频在线观看| 水蜜桃一区二区三区| 神马一区二区影院| 久久久精品动漫| 久久综合福利| 天堂资源在线亚洲资源| 日韩国产高清一区| 国产精品区一区| 一区二区三区我不卡| 亚洲欧洲另类精品久久综合| 一区二区三区的久久的视频| 免费看国产精品一二区视频| 中文字幕日韩一区二区三区不卡 | 国产亚洲欧美一区二区三区| 国产一区自拍视频| 日韩精品一区二区三区外面| 国产精品亚洲综合| 正在播放精油久久| 日韩亚洲不卡在线| 色一情一乱一伦一区二区三区丨 | 亚洲砖区区免费| 九色一区二区| 国产亚洲精品美女久久久m| **亚洲第一综合导航网站 | 99久久精品无码一区二区毛片| 精品午夜一区二区| 农村寡妇一区二区三区| 国产亚洲欧美一区二区| 激情五月综合色婷婷一区二区| 在线一区亚洲| 成人午夜影院在线观看| 国产免费一区| 欧美三级网色| 高清国产在线一区| 欧美精品二区三区四区免费看视频 | 麻豆蜜桃91| 欧美亚州在线观看| 亚洲成人网上| 91久久大香伊蕉在人线| 精品久久精品久久| 在线精品日韩| 蜜桃网站成人| 不卡一区二区三区四区五区| 欧美精品七区| 国产欧美日韩综合精品二区| 日韩在线导航| 狠狠色噜噜狠狠狠狠色吗综合| 四虎影视永久免费在线观看一区二区三区| 中文字幕欧美日韩一区二区三区| 国产精品视频免费一区| 亚洲精品一品区二品区三品区| 国产精品对白一区二区三区| 一区在线电影| 五月天国产一区| 神马影院我不卡| 亚洲国产欧美不卡在线观看| 日韩免费中文专区| 日本不卡一区二区三区在线观看| 国产a一区二区| 操人视频欧美| 国产精品sss| 日韩亚洲视频| 成人午夜电影在线播放| 在线码字幕一区| 91超碰在线电影| 97中文在线观看| 99高清视频有精品视频| 99国产在线| 国产一区二区中文字幕免费看| 国产视频一区二区三区四区| 精品一卡二卡三卡四卡日本乱码| 久久亚洲精品欧美| 在线观看福利一区| 麻豆精品蜜桃一区二区三区| 日本不卡二区高清三区| 在线成人性视频| 精品无人乱码一区二区三区的优势| 欧美日韩亚洲免费| 国产91亚洲精品一区二区三区| 欧美激情论坛| 国产亚洲精品美女久久久m| 欧美极品一区二区| av一区二区三区免费| 欧美日韩高清在线一区| 中文精品视频一区二区在线观看| 高清视频一区| 亚洲开发第一视频在线播放| 国产一区二区精品免费| 亚洲精品久久区二区三区蜜桃臀 | 一区二区三区四区在线视频| 国产乱码精品一区二区三区日韩精品| 欧美精品一区三区在线观看| 一本色道久久综合亚洲二区三区| 精品不卡在线| 国产自产精品| 国产精品xxx在线观看www| 在线视频欧美一区| 中文字幕在线亚洲三区| 一区二区三区四区不卡|