《Spring Cloud Alibaba 從入門到實戰》分布式消息(事件)驅動

分布式消息(事件)驅動

1、簡介

事件驅動架構(Event-driven 架構,簡稱 EDA)是軟件設計領域內的一套程序設計模型。

這套模型的意義是所有的操作通過事件的發送/接收來完成

傳統軟件設計

舉個例子,比如一個訂單的創建在傳統軟件設計中服務端通過接口暴露創建訂單的動作,然后客戶端訪問創建訂單。

事件驅動設計

在事件驅動設計里,訂單的創建通過接收訂單事件來完成,這個過程中有事件發送者和事件接受者這兩個模塊,事件發送者的作用是發送訂單事件,事件接受者的作用的接收訂單事件。

2、Spring 消息編程模型

不同的消息中間件發送消息的代碼:

image

可以看出,每個消息中間件都有自己的消息模型編程。

統一模型

Spring 生態里有兩個消息相關的模塊和項目,分別是 spring-messaging 模塊和 Spring Integration 項目,它們對消息的編程模型進行了統一,不論是 Apache RocketMQ 的 Message,或者是 Apache Kafka 的 ProducerRecord,都被統一稱為 org.springframework.messaging.Message 接口。

Message 接口有兩個方法,分別是 getPayload 以及 getHeaders 用于獲取消息體以及消息頭。這也意味著一個消息 Message 由 Header 和 Payload 組成

Payload 是一個泛型,意味是消息體可以放任意數據類型。Header 是一個 MessageHeaders 類型的消息頭。

有了消息之后,這個消息被發送到哪里呢?

Spring 提供了消息通道 MessageChannel 的概念。消息可以被發送到消息通道里,然后再通過消息處理器 MessageHandler 去處理消息通道里的消息。

如果消息通道里只有 1 個消息,但是消息處理器有 N 個,這個時候要被哪個消息處理器處理呢?

這里又涉及一個消息分發器的問題。

  • UnicastingDispatcher 表示單播的處理方式,消息會通過負載均衡被分發到某一個消息處理器上(默認)
  • BroadcastingDispatcher 表示廣播的方式,消息會被所有的消息處理器處理。

3、Spring Cloud Stream

Spring Cloud Stream 是一套基于消息的事件驅動開發框架,它提供了一套全新的消息編程模型,此模型屏蔽了底層具體消息中間件的使用方式。開發者們使用這套模型可以完成基于消息的事件驅動應用開發。

Spring Cloud Stream 在上面說到的 spring-messaging 和 Spring Integration 項目的基礎上再進行了一些封裝,提出一些新的概念,讓開發者能夠更簡單地使用這套消息編程模型。

image

最佳實踐

參考筆者另一篇文章:https://cmty256.github.io/pages/d67430/#%E4%BB%80%E4%B9%88%E6%98%AF-spring-cloud-stream

參考書籍

重磅下載 | Java 開發者必備手冊《Spring Cloud Alibaba 從入門到實戰》,阿里雙11同款!-阿里云開發者社區 (aliyun.com)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215691.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215691.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「差生文具多系列」推薦兩個好看的 Redis 客戶端

📢?聲明: 🍄 大家好,我是風箏 🌍 作者主頁:【古時的風箏CSDN主頁】。 ?? 本文目的為個人學習記錄及知識分享。如果有什么不正確、不嚴謹的地方請及時指正,不勝感激。 直達博主:「…

ModuleNotFoundError: No module named ‘huggingface_hub.snapshot_download‘

ModuleNotFoundError: No module named ‘huggingface_hub.snapshot_download’ 的解決方法 根據提示顯示XXX模塊不存在,一般會直接安裝XXX模塊,但是這個不需要顯式安裝huggingface-hub。 只需要升級sentence-transformers即可。 pip install -U sente…

Innosetup 安裝包 在安裝前判斷是否有其他安裝程序正在安裝...

方法有: 1.使用系統服務WinMgmts 系統信息通過 "winmgmts:\\.\root\CIMV2" 遍歷進程列表。 var FSWbemLocator: Variant; FWMIService : Variant; FWbemObjectSet: Variant; begin Result : false; FSWbemLocator : CreateOleObject(WBEMScripti…

Fabric使用自己的鏈碼進行測試-go語言

書接前文 Fabric鏈碼部署-go語言 通過上面這篇文章,你可以部署好自己的鏈碼 (后面很多命令是否需要修改,都是根據上面這篇文章來的,如果零基礎的話建議先看上面這篇) 就進行下一步 在測試網絡上運行自己的鏈碼 目…

PDF文件的限制編輯,如何設置?

想要給PDF文件設置一個密碼防止他人對文件進行編輯,那么我們可以對PDF文件設置限制編輯,設置方法很簡單,我們在PDF編輯器中點擊文件 – 屬性 – 安全,在權限下拉框中選中【密碼保護】 然后在密碼保護界面中,我們勾選【…

系列十、SpringBoot + MyBatis + Redis實現分布式緩存(基于注解方式)

一、概述 上篇文章 系列九、SpringBoot MyBatis Redis實現分布式緩存 介紹了基于xml方式實現分布式緩存的效果,當前大家使用的技術棧基本是springboot各種框架的組合,而springboot顯著的一個特點就是去xml配置,那么在無xml配置的情形下&…

CStdioFile

CStdioFile 文件創建、數據寫入、寫入路徑 void StdReferenceDWG::RefDrawCrvt(StdOneReference& ref) {char* old_locale _strdup(setlocale(LC_CTYPE, NULL));setlocale(LC_CTYPE, "chs");//設定CString strPath StdTool::GetCurPath() _T("襯圖\\Re…

界面控件DevExpress中文教程 - 如何用Office File API組件填充PDF表單

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫,不用安裝Microsoft Office,就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

基于SpringBoot的就業信息管理系統設計與實現(源碼+數據庫+文檔)

摘 要 在新冠肺炎疫情的影響下,大學生的就業問題已經變成了一個引起人們普遍重視的社會焦點問題。在這次疫情的沖擊之下,大學生的就業市場的供求雙方都受到了不同程度的影響,大學生的就業情況并不十分樂觀。目前,各種招聘平臺上…

Netty高性能的原因

Netty 之所以具有高性能,主要得益于以下幾個方面的設計和實現: 異步非阻塞: Netty采用基于事件驅動的異步非阻塞模型,即 Reactor 模式。這意味著它能夠處理大量并發連接而不會因為I/O操作而阻塞線程。不會因為每個連接都需要一個單…

云原生之使用Docker部署Mariadb數據庫

目錄 一、什么是云原生 二、Docker介紹 三、Mariadb數據庫介紹 四、如何使用Docker部署Mariadb數據庫 一、什么是云原生 云原生是一種綜合性的技術和方法論,旨在對應用程序進行全生命周期的管理,包括開發、部署、運行和擴展。它倡導將應用程序設計為…

moviepy基本參數用法大全

閱讀本文檔的前置說明: 本文檔用于講解Python的moviepy庫的自帶函數的用法,主要目的是講一下每個函數的每個參數的含義,無需一開始就全部掌握,粗略看一下就行,可以在后面自己開發過程,遇到不會用的函數再回…

大模型應用_AutoGPT

1 功能 整體功能,想解決什么問題 單獨使用 ChatGPT 時,只提供基本的聊天,無法實現具體的功能,如果想提供某種功能,則需要結合程序實現。AutoGPT目標是建立和使用 AI Agent,設定一個或多個目標,…

數據庫——字段拆分與合并

一、GP或PostgreSQL 1.字段拆分成行 unnest(string_to_array(test, ,)) 例如某一字段值為"a,b,c,d",使用string_to_array將其拆分為數組,然后使用unnest將數組平鋪成一張表 SELECT unnest(string_to_array(555,666,777, ,)) 2.字段拆分成列…

【EI征稿倒計時3天】第四屆IEEE信息科學與教育國際學術會議(ICISE-IE 2023)

第四屆IEEE信息科學與教育國際學術會議(ICISE-IE 2023) 2023 4th International Conference on Information Science and Education(ICISE-IE 2023) ICISE-IE2024已上線嶺南師范學院官網(點擊查看) 第四屆IEEE信息科學與教育國…

雙熒光素酶報告基因檢測(五)

關于雙熒光素酶報告基因檢測中遇到的問題及解決措施 問題1:為什么要用熒光素酶實驗來做檢測,不用其他報告基因來做,GFP可以嗎? 采用熒光素酶來做實驗是由其自身的優勢所決定的:(1)蛋白不需要翻…

@Transactional失效問題

作者簡介:大家好,我是smart哥,前中興通訊、美團架構師,現某互聯網公司CTO 聯系qq:184480602,加我進群,大家一起學習,一起進步,一起對抗互聯網寒冬 關于Transactional 日…

解讀 | 為什么有很多名人讓人們警惕人工智能

大家好,我是極智視界,歡迎關注我的公眾號,獲取我的更多前沿科技分享 邀您加入我的知識星球「極智視界」,星球內有超多好玩的項目實戰源碼和資源下載,鏈接:https://t.zsxq.com/0aiNxERDq 這個話題總能引起很…

六、ZGC深度剖析

一、引言 對于Java 程序員來說,JVM 幫助我們做了很多事情。 JVM是虛擬機,能夠識別字節碼,就是class文件或者你打包的jar文件,運行在操作系統上。 JVM幫我們實現了跨平臺,你只需要編譯一次,就可以在不同的…

在線課堂知識付費小程序源碼系統 開發組合PHP+MySQL:用手機隨時隨地地學習,講師親自在線授業解惑 帶安裝部署教程

近年來,人們對于學習的需求也日益增加。傳統的課堂教學已經無法滿足人們的學習需求,而在線課堂則能夠讓人們隨時隨地地進行學習。同時,隨著知識付費的興起,越來越多的講師也愿意將自己的知識和經驗分享給更多的人。因此&#xff0…