日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
六邊形架構(gòu)和分層架構(gòu)的區(qū)別

作為一個(gè)后端程序員,MVC三層架構(gòu)的模式相信大家都不會(huì)陌生,三層分別從上而下排布,只能由上層調(diào)用下層。一般越往下層越通用,越上層越細(xì)節(jié)。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了象山免費(fèi)建站歡迎大家使用!

隨著某些核心業(yè)務(wù)的訪問量發(fā)展,通常我們需要去進(jìn)行優(yōu)化的措施,比如加緩存,加MQ,換數(shù)據(jù)源

  • 緩存可選redis,memcache
  • MQ可選kafka,rocketmq,rabbitmq
  • 數(shù)據(jù)源可選:mysql,mongodb,elasticsearch復(fù)制代碼

當(dāng)然,我們?cè)谧鲞@些優(yōu)化的時(shí)候,會(huì)將mq,mongodb等看成基礎(chǔ)設(shè)施層。 由此衍生出四層的架構(gòu),infrastructure里封裝redis和mq的通用調(diào)用邏輯

這些優(yōu)化的動(dòng)作,通常不會(huì)改變?cè)械臉I(yè)務(wù)邏輯。但是為了做優(yōu)化,我們會(huì)將它寫在service層,比如:

  • 執(zhí)行成功就發(fā)個(gè)MQ
  • 執(zhí)行某個(gè)事件的時(shí)候,同步一下緩存
  • 依賴關(guān)系為,domain依賴infrastructure

問題點(diǎn):

按道理來(lái)說(shuō),domain層是寫業(yè)務(wù)邏輯的,優(yōu)化不會(huì)涉及到業(yè)務(wù)邏輯的改動(dòng),但是卻改動(dòng)了domain層。由于domain層依賴了infrastucture的原因,導(dǎo)致業(yè)務(wù)依賴于具體的實(shí)現(xiàn)技術(shù)。所以,為了將業(yè)務(wù)與具體實(shí)現(xiàn)做分離,我們采用依賴倒置的手段去重構(gòu)。

依賴倒置原則的包含如下的三層含義:

  • 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象
  • 抽象不應(yīng)該依賴細(xì)節(jié)
  • 細(xì)節(jié)應(yīng)該依賴抽象

高層模塊不依賴低層模塊:那就可以在domain層定義存儲(chǔ)的接口,如AARepository,但是不寫具體的技術(shù)實(shí)現(xiàn)。

抽象不依賴細(xì)節(jié):在domain層里,不依賴其他包的類,如用到數(shù)據(jù)存儲(chǔ)時(shí),直接調(diào)用domain的抽象接口即可。

高層通過依賴注入的方式,將基礎(chǔ)設(shè)施的實(shí)現(xiàn)傳到domain層中。

如此一來(lái),我們的架構(gòu)就不再是分層的結(jié)構(gòu)(從上往下調(diào)用)。而是將抽象全部堆在domain層,將細(xì)節(jié)全部往application和infrastructure去推。而越抽象越穩(wěn)定,所以通過這種做法能夠有效減少業(yè)務(wù)的變更。

架構(gòu)變成了一種從內(nèi)而外的邏輯,越往內(nèi)越抽象,越往外越細(xì)節(jié)。在北向網(wǎng)關(guān),可以使用rest和dubbo去調(diào)用業(yè)務(wù)邏輯,南向網(wǎng)關(guān)可以將數(shù)據(jù)寫到redis或mq。具體代碼實(shí)現(xiàn):

 
 
 
  1. 如下業(yè)務(wù):發(fā)送課程成功了,要發(fā)送消息給設(shè)備IOT,發(fā)送MQ,更新緩存

傳統(tǒng)做法:

 
 
 
  1. void sendCourse(){
  2.     //執(zhí)行業(yè)務(wù)邏輯
  3.  //發(fā)送消息給設(shè)備IOT
  4.  //發(fā)送MQ
  5.  //更新緩存
  6. }

隨著優(yōu)化方案的不斷增加,業(yè)務(wù)邏輯會(huì)越堆越多 六邊形架構(gòu)+EDA做法

 
 
 
  1. public SendCourseService sendCourseService{
  2.  void sendCourse(SendCourseCommand command){
  3.      //執(zhí)行業(yè)務(wù)邏輯并發(fā)布發(fā)布課程事件
  4.  eventBus.push(SendCourseEvent())
  5.  } 
  6. }

當(dāng)我們要做更新緩存操作的時(shí)候,實(shí)際上與業(yè)務(wù)邏輯沒有什么關(guān)系,可以定義一個(gè)監(jiān)聽者去監(jiān)聽發(fā)布課程事件。這個(gè)SendCourseCacheHandler類要寫到哪里呢?

 
 
 
  1. public class SendCourseCacheHandler{
  2.  
  3.  private Jedis jedis;
  4.  public void deleteCache(SendCourseEvent event){
  5.  //刪除緩存
  6.  }
  7. }
  • 按照抽象往domain寫,細(xì)節(jié)往外寫的劃分,寫到基礎(chǔ)設(shè)施層不合適,因?yàn)榕c業(yè)務(wù)強(qiáng)相關(guān)。
  • 寫到domain不合適,因?yàn)榕credis這些具體實(shí)現(xiàn)強(qiáng)相關(guān)。

所以這個(gè)類應(yīng)該寫在application層,其實(shí)是domain去調(diào)用application,所以說(shuō)。。。這并不是分層架構(gòu)。我們思考的時(shí)候是按抽象程度去判斷應(yīng)該寫在哪里,而不是從上往下調(diào)用。

那這個(gè)監(jiān)聽者如何與業(yè)務(wù)結(jié)合起來(lái)呢?這時(shí)就發(fā)揮了application層的作用了,我們可以將application作為業(yè)務(wù)組裝的邏輯。

如我們?cè)跇I(yè)務(wù)開始之前,將監(jiān)聽者注冊(cè)上去,這樣在業(yè)務(wù)執(zhí)行的時(shí)候,就可以回調(diào)這些監(jiān)聽者了

 
 
 
  1. public class CourseAppService{
  2.  
  3.  private SendCourseCacheHandler sendCourseCacheHandler;
  4.  private SendCourseMQHandler sendCourseMQHandler;
  5.  private SendCourseService sendCourseService;
  6.  private EventBus eventBus;
  7.  public void sendCourse(SendCourseCommand command){
  8.  //刪除緩存
  9.  eventBus.register(sendCourseCacheHandler);
  10.  //發(fā)MQ
  11.  eventBus.register(sendCourseMQHandler);
  12.  sendCourseService.sendCourse(command);
  13.  }
  14. }

適合場(chǎng)景:

  • 讀/寫比較大的場(chǎng)景
  • 對(duì)查詢實(shí)時(shí)性要求不高的場(chǎng)景
  • 內(nèi)部狀態(tài)改變會(huì)觸發(fā)各種數(shù)據(jù)的同步,如課程完成,課程發(fā)布等等等等。。。
  • 外部實(shí)現(xiàn)可替換,如mq可以隨意替換實(shí)現(xiàn)

不適合場(chǎng)景:

  • 只有簡(jiǎn)單CRUD的業(yè)務(wù),沒有重的業(yè)務(wù)邏輯,不適合搞那么復(fù)雜,因?yàn)闆]必要抽出domain層

分享題目:六邊形架構(gòu)和分層架構(gòu)的區(qū)別
鏈接地址:http://m.5511xx.com/article/dpgiede.html