成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

六邊形架構和分層架構的區別

開發 架構 開發工具
作為一個后端程序員,MVC三層架構的模式相信大家都不會陌生,三層分別從上而下排布,只能由上層調用下層。一般越往下層越通用,越上層越細節。

作為一個后端程序員,MVC三層架構的模式相信大家都不會陌生,三層分別從上而下排布,只能由上層調用下層。一般越往下層越通用,越上層越細節。

六邊形架構和分層架構的區別

隨著某些核心業務的訪問量發展,通常我們需要去進行優化的措施,比如加緩存,加MQ,換數據源

  • 緩存可選redis,memcache
  • MQ可選kafka,rocketmq,rabbitmq
  • 數據源可選:mysql,mongodb,elasticsearch復制代碼

當然,我們在做這些優化的時候,會將mq,mongodb等看成基礎設施層。 由此衍生出四層的架構,infrastructure里封裝redis和mq的通用調用邏輯

六邊形架構和分層架構的區別

這些優化的動作,通常不會改變原有的業務邏輯。但是為了做優化,我們會將它寫在service層,比如:

  • 執行成功就發個MQ
  • 執行某個事件的時候,同步一下緩存
  • 依賴關系為,domain依賴infrastructure

問題點:

按道理來說,domain層是寫業務邏輯的,優化不會涉及到業務邏輯的改動,但是卻改動了domain層。由于domain層依賴了infrastucture的原因,導致業務依賴于具體的實現技術。所以,為了將業務與具體實現做分離,我們采用依賴倒置的手段去重構。

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

  • 高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象
  • 抽象不應該依賴細節
  • 細節應該依賴抽象

高層模塊不依賴低層模塊:那就可以在domain層定義存儲的接口,如AARepository,但是不寫具體的技術實現。

抽象不依賴細節:在domain層里,不依賴其他包的類,如用到數據存儲時,直接調用domain的抽象接口即可。

高層通過依賴注入的方式,將基礎設施的實現傳到domain層中。

如此一來,我們的架構就不再是分層的結構(從上往下調用)。而是將抽象全部堆在domain層,將細節全部往application和infrastructure去推。而越抽象越穩定,所以通過這種做法能夠有效減少業務的變更。

六邊形架構和分層架構的區別

架構變成了一種從內而外的邏輯,越往內越抽象,越往外越細節。在北向網關,可以使用rest和dubbo去調用業務邏輯,南向網關可以將數據寫到redis或mq。具體代碼實現:

  1. 如下業務:發送課程成功了,要發送消息給設備IOT,發送MQ,更新緩存 

傳統做法:

  1. void sendCourse(){ 
  2.     //執行業務邏輯 
  3.  //發送消息給設備IOT 
  4.  //發送MQ 
  5.  //更新緩存 

隨著優化方案的不斷增加,業務邏輯會越堆越多 六邊形架構+EDA做法

  1. public SendCourseService sendCourseService{ 
  2.  void sendCourse(SendCourseCommand command){ 
  3.      //執行業務邏輯并發布發布課程事件 
  4.  eventBus.push(SendCourseEvent()) 
  5.  }  

當我們要做更新緩存操作的時候,實際上與業務邏輯沒有什么關系,可以定義一個監聽者去監聽發布課程事件。這個SendCourseCacheHandler類要寫到哪里呢?

  1. public class SendCourseCacheHandler{ 
  2.   
  3.  private Jedis jedis; 
  4.  public void deleteCache(SendCourseEvent event){ 
  5.  //刪除緩存 
  6.  } 
  • 按照抽象往domain寫,細節往外寫的劃分,寫到基礎設施層不合適,因為與業務強相關。
  • 寫到domain不合適,因為與redis這些具體實現強相關。

所以這個類應該寫在application層,其實是domain去調用application,所以說。。。這并不是分層架構。我們思考的時候是按抽象程度去判斷應該寫在哪里,而不是從上往下調用。

那這個監聽者如何與業務結合起來呢?這時就發揮了application層的作用了,我們可以將application作為業務組裝的邏輯。

如我們在業務開始之前,將監聽者注冊上去,這樣在業務執行的時候,就可以回調這些監聽者了

  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.  //發MQ 
  11.  eventBus.register(sendCourseMQHandler); 
  12.  sendCourseService.sendCourse(command); 
  13.  } 

適合場景:

  • 讀/寫比較大的場景
  • 對查詢實時性要求不高的場景
  • 內部狀態改變會觸發各種數據的同步,如課程完成,課程發布等等等等。。。
  • 外部實現可替換,如mq可以隨意替換實現

不適合場景:

  • 只有簡單CRUD的業務,沒有重的業務邏輯,不適合搞那么復雜,因為沒必要抽出domain層

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2017-02-21 17:25:51

架構六邊形架構數據庫

2023-08-06 23:31:36

架構系統RPC

2020-04-02 13:44:57

架構Netflix數據

2023-12-13 10:06:28

六邊形架構系統測試

2023-04-14 08:00:00

架構測試開發

2023-11-01 07:41:39

六邊形架構適配器架構

2024-04-17 08:06:41

六邊形洋蔥架構領域

2022-12-28 07:48:40

六邊形動畫CSS

2023-10-30 10:12:20

2021-08-29 18:32:18

CSS

2025-01-17 11:38:10

2025-02-24 07:39:53

2017-06-08 10:33:42

軟件開發前后端架構

2022-11-08 08:00:00

開發Uber數據庫

2023-09-08 18:37:34

HarmonyOS

2024-07-08 08:33:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97国产一区二区精品久久呦 | 一区二区福利视频 | 毛片免费视频 | 91色视频在线观看 | 国产高清视频在线观看 | 成人不卡视频 | 91在线免费视频 | 国产精品美女久久久久久免费 | 欧美一级免费观看 | 国产一区二区在线视频 | 偷拍自拍网 | 亚洲视频一区二区三区四区 | 亚洲精品久久久久久下一站 | 国产sm主人调教女m视频 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 99热碰| 国产一区2区 | 国产一级在线 | 免费一级做a爰片久久毛片潮喷 | 日韩在线视频免费观看 | 久久久久久免费精品一区二区三区 | 国产精品久久久久久久久久久免费看 | 人人艹人人爽 | 九九久久久 | 欧美精品1区2区3区 精品国产欧美一区二区 | 午夜精品视频在线观看 | 亚洲一区二区在线免费观看 | 91电影院| 精品国产91乱码一区二区三区 | 日韩一区二区免费视频 | 日韩aⅴ视频 | 日韩av免费在线观看 | 国产精品18久久久久久久 | 国产精品久久久久久久久婷婷 | 国产精品福利视频 | 久久一区二区三区免费 | 精品国产第一区二区三区 | 国产一二区视频 | 日本一区二区在线视频 | 久久久免费毛片 | 91看片视频|