AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

從CRUD到CQRS:使用Spring微服務(wù)轉(zhuǎn)變你的架構(gòu)策略

來源: 責(zé)編: 時(shí)間:2023-10-16 17:10:05 223觀看
導(dǎo)讀介紹微服務(wù)的興起以及現(xiàn)代軟件架構(gòu)對可擴(kuò)展性、靈活性和可維護(hù)性的需求,促使開發(fā)者采用各種設(shè)計(jì)模式。近年來,命令查詢責(zé)任分離(Command Query Responsibility Segregation,CQRS)模式在實(shí)踐中獲得大量推廣。CQRS特別適用于

介紹

eCw28資訊網(wǎng)——每日最新資訊28at.com

微服務(wù)的興起以及現(xiàn)代軟件架構(gòu)對可擴(kuò)展性、靈活性和可維護(hù)性的需求,促使開發(fā)者采用各種設(shè)計(jì)模式。近年來,命令查詢責(zé)任分離(Command Query Responsibility Segregation,CQRS)模式在實(shí)踐中獲得大量推廣。CQRS特別適用于那些命令(用于修改狀態(tài))和查詢(用于讀取狀態(tài))之間存在明顯區(qū)別的系統(tǒng)。本文將深入探討CQRS,并演示如何使用Spring微服務(wù)進(jìn)行實(shí)現(xiàn)。eCw28資訊網(wǎng)——每日最新資訊28at.com

什么是 CQRS?

命令查詢職責(zé)分離(CQRS)是一種架構(gòu)模式,建議將數(shù)據(jù)修改操作(命令)與數(shù)據(jù)檢索操作(查詢)分離。這種分離允許為查詢和更新數(shù)據(jù)開發(fā)專門的模型,提高應(yīng)用程序的清晰度和可擴(kuò)展性。eCw28資訊網(wǎng)——每日最新資訊28at.com

CQRS 的核心目標(biāo)是通過確保每個(gè)任務(wù)負(fù)責(zé)單個(gè)操作(命令或查詢,但絕不會同時(shí)負(fù)責(zé)兩者)來簡化任務(wù)。eCw28資訊網(wǎng)——每日最新資訊28at.com

起源和演進(jìn)

CQRS并不是一個(gè)全新的概念。它的根源可以追溯到CQS(Command Query Separation,命令查詢分離)原則,該原則由Eiffel編程語言的創(chuàng)建者Bertrand Meyer推廣。盡管CQS主要關(guān)注方法層面,即一個(gè)方法應(yīng)該執(zhí)行命令或回答查詢,但CQRS將這一原則擴(kuò)展到了應(yīng)用程序的架構(gòu)層面,建議使用獨(dú)立的架構(gòu)組件處理命令和查詢。eCw28資訊網(wǎng)——每日最新資訊28at.com

為什么使用CQRS?

  • 可擴(kuò)展性:CQRS允許水平擴(kuò)展,可以根據(jù)需求部署多個(gè)命令或查詢服務(wù)的實(shí)例。讀操作和寫操作可以獨(dú)立進(jìn)行擴(kuò)展,優(yōu)化資源利用率。
  • 靈活性:命令和查詢之間職責(zé)明確,意味著開發(fā)者可以針對每個(gè)操作使用最適合的持久化機(jī)制、策略和優(yōu)化方式。例如,雖然關(guān)系數(shù)據(jù)庫可能用于事務(wù)性命令操作,但非規(guī)范化的視圖存儲甚至全文搜索引擎可以用于處理查詢。
  • 可維護(hù)性:良好實(shí)現(xiàn)的CQRS模式簡化了代碼庫。通過為讀操作和寫操作分別建立模型,開發(fā)者可以專注于每個(gè)操作的具體內(nèi)容,而不會被無關(guān)的問題分散注意力。這種分離有利于開發(fā)出更清晰、更易于維護(hù)和擴(kuò)展的代碼。
  • 增強(qiáng)安全性:CQRS本質(zhì)上促進(jìn)了更好的安全實(shí)踐。通過分離命令和查詢操作,可以更容易地對寫操作進(jìn)行嚴(yán)格的驗(yàn)證和授權(quán)檢查,同時(shí)優(yōu)化讀操作以提高性能。

CQRS在微服務(wù)中的應(yīng)用

在分布式系統(tǒng)中,服務(wù)通常需要具有自治性和高度解耦,CQRS提供了一個(gè)清晰的路徑。每個(gè)微服務(wù)都可以采用CQRS模式,確保它處理命令和查詢的內(nèi)部細(xì)節(jié)與其他服務(wù)分離。這也與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)非常契合,其中領(lǐng)域事件可以觸發(fā)不同微服務(wù)中的命令操作。eCw28資訊網(wǎng)——每日最新資訊28at.com

潛在的問題

盡管CQRS帶來了許多好處,但也存在一些挑戰(zhàn):eCw28資訊網(wǎng)——每日最新資訊28at.com

  • 復(fù)雜性增加:引入CQRS可能會增加開銷,特別是在讀操作和寫操作之間的區(qū)別不明顯的系統(tǒng)中。并不總是需要將每個(gè)讀操作和寫操作分離,這樣做可能會導(dǎo)致不必要的復(fù)雜性增加。
  • 一致性:考慮到寫存儲和讀存儲可能是不同的,確保它們之間的數(shù)據(jù)一致性可能具有挑戰(zhàn)性,特別是在分布式系統(tǒng)中。

使用Spring微服務(wù)實(shí)現(xiàn)CQRS

Spring生態(tài)系統(tǒng)中豐富的工具和框架非常適合在微服務(wù)環(huán)境中實(shí)現(xiàn)CQRS模式。eCw28資訊網(wǎng)——每日最新資訊28at.com

新建一個(gè)Spring Boot項(xiàng)目

第一步是創(chuàng)建一個(gè)基本的Spring Boot項(xiàng)目。如果你是第一次使用Spring Boot,可以使用Spring Initializr初始化項(xiàng)目。可以根據(jù)自己偏好引入一些必需的依賴項(xiàng)包括Spring Web、Spring Data JPA、數(shù)據(jù)庫連接器等。eCw28資訊網(wǎng)——每日最新資訊28at.com

命令、命令處理器和聚合

在基于Spring的CQRS系統(tǒng)中,命令表示改變某個(gè)狀態(tài)的意圖,而命令處理器則用于處理這些命令。eCw28資訊網(wǎng)——每日最新資訊28at.com

命令示例如下:eCw28資訊網(wǎng)——每日最新資訊28at.com

public class CreateUserCommand {    private final String userId;    private final String username;    // 構(gòu)造函數(shù), getters,以及其他方法...}

對于每個(gè)命令,都需要定義了相應(yīng)的命令處理器。該處理器需要包含處理命令的實(shí)際邏輯,如下:eCw28資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic class CreateUserCommandHandler implements CommandHandler<CreateUserCommand> {        @Autowired    private UserRepository userRepository;    @Override    public void handle(CreateUserCommand command) {        User user = new User(command.getUserId(), command.getUsername());        userRepository.save(user);    }}

在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的上下文中,狀態(tài)變更通常發(fā)生在聚合根上。這些聚合根需要遵循所有領(lǐng)域規(guī)則,然后在對數(shù)據(jù)變更進(jìn)行持久化。eCw28資訊網(wǎng)——每日最新資訊28at.com

查詢和查詢處理器

類似地,查詢表示讀取某些狀態(tài)的請求,而查詢處理器則處理這些請求。eCw28資訊網(wǎng)——每日最新資訊28at.com

查詢命令示例:eCw28資訊網(wǎng)——每日最新資訊28at.com

public class GetUserByIdQuery {    private final String userId;    // 構(gòu)造函數(shù), getters, 以及其他方法}

對應(yīng)的查詢處理器:eCw28資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic class GetUserByIdQueryHandler implements QueryHandler<GetUserByIdQuery, User> {        @Autowired    private UserRepository userRepository;    @Override    public User handle(GetUserByIdQuery query) {        return userRepository.findById(query.getUserId()).orElse(null);    }}

事件溯源及Axon框架集成

盡管CQRS提供了分離的機(jī)制,但使用事件溯源可以簡化在命令和查詢之間維護(hù)狀態(tài)的過程。Axon Framework是一個(gè)實(shí)現(xiàn)了CQRS和事件溯源的流行框架。eCw28資訊網(wǎng)——每日最新資訊28at.com

在Axon中,事件在命令處理后進(jìn)行發(fā)布。這些事件可以被持久化,然后用于重新創(chuàng)建聚合根的狀態(tài),有助于保持查詢端與命令端的同步。eCw28資訊網(wǎng)——每日最新資訊28at.com

使用Apache Kafka進(jìn)行異步通信

考慮到微服務(wù)的分布式特性,實(shí)現(xiàn)服務(wù)之間的異步通信是非常有必要的。可以將Apache Kafka集成到Spring生態(tài)系統(tǒng)中,以實(shí)現(xiàn)強(qiáng)大的事件驅(qū)動(dòng)架構(gòu),這在CQRS設(shè)置中尤其有用。eCw28資訊網(wǎng)——每日最新資訊28at.com

由命令端產(chǎn)生的事件可以推送到Kafka的主題中,查詢端可以消費(fèi)這些事件來更新自己的數(shù)據(jù)存儲。這確保了命令端和查詢端之間的解耦,使系統(tǒng)更具彈性和可擴(kuò)展性。eCw28資訊網(wǎng)——每日最新資訊28at.com

事件溯源和CQRS

盡管CQRS專注于分離命令和查詢的責(zé)任,但事件溯源確保將應(yīng)用程序狀態(tài)的每次更改捕獲在事件對象中,并按照應(yīng)用順序存儲在相同聚合根上。這樣允許你重建過去的狀態(tài),在與CQRS結(jié)合使用時(shí)特別有優(yōu)勢。eCw28資訊網(wǎng)——每日最新資訊28at.com

事件溯源的核心思想

事件溯源是一種將領(lǐng)域事件持久化而不是持久化狀態(tài)本身的方式。這些事件捕獲狀態(tài)轉(zhuǎn)換。通過重新播放這些事件,可以重建聚合根的當(dāng)前狀態(tài)。eCw28資訊網(wǎng)——每日最新資訊28at.com

例如,可以存儲銀行賬戶的所有交易(像存款和提款這樣的事件),而不是僅存儲當(dāng)前余額。通過重新播放這些事件,可以計(jì)算出當(dāng)前余額。eCw28資訊網(wǎng)——每日最新資訊28at.com

事件溯源的好處

  • 審計(jì)追蹤:事件溯源提供了自然的更改審計(jì)日志,這對于需要追溯性和歷史記錄的領(lǐng)域非常重要。
  • 時(shí)間查詢:可以確定系統(tǒng)在任何時(shí)間點(diǎn)的狀態(tài)。這對于調(diào)試和理解過去的狀態(tài)非常有用。
  • 事件重放:通過重新播放事件,可以重新生成面向讀取的優(yōu)化視圖。當(dāng)你想要?jiǎng)?chuàng)建新投影或重建損壞的投影時(shí),這特別有用。

事件溯源與CQRS集成

CQRS和事件溯源是相輔相成的,表現(xiàn)在以下幾個(gè)方面:eCw28資訊網(wǎng)——每日最新資訊28at.com

  • 解耦:就像CQRS中的命令和查詢解耦一樣,通過事件溯源,事件(代表狀態(tài)變化)與實(shí)際狀態(tài)解耦,這促進(jìn)了松散耦合的架構(gòu)。
  • 可擴(kuò)展性:CQRS中讀操作和寫操作的分離性與事件驅(qū)動(dòng)系統(tǒng)非常契合。命令模型處理命令并生成事件,而查詢模型處理查詢并可以通過偵聽這些事件進(jìn)行更新。
  • 彈性:通過重播事件,可以在發(fā)生故障甚至遷移到全新系統(tǒng)時(shí)重新構(gòu)建系統(tǒng)的狀態(tài)。

使用Spring和Axon框架實(shí)現(xiàn)

正如之前提到的,Axon Framework為在Spring應(yīng)用程序中實(shí)現(xiàn)CQRS和事件溯源提供了一種無縫的方案:eCw28資訊網(wǎng)——每日最新資訊28at.com

  • 聚合根和事件處理:在Axon中,聚合根負(fù)責(zé)處理命令和生成事件。在處理完命令后,它們會應(yīng)用導(dǎo)致狀態(tài)變化的事件。
@Aggregatepublic class Account {    @AggregateIdentifier    private String accountId;    private int balance;    @CommandHandler    public void handle(WithdrawMoneyCommand cmd) {        if (cmd.getAmount() > balance) {            throw new InsufficientFundsException();        }        apply(new MoneyWithdrawnEvent(cmd.getAccountId(), cmd.getAmount()));    }    @EventSourcingHandler    public void on(MoneyWithdrawnEvent evt) {        this.balance -= evt.getAmount();    }}
  • 事件存儲:Axon提供了一種存儲和檢索事件的機(jī)制。這些事件可以重播,以重建聚合根的狀態(tài)。
  • 投影:Axon中的投影提供了CQRS的查詢端。它們監(jiān)聽事件并更新讀取優(yōu)化的視圖。這樣,查詢模型始終與最新的更改保持同步。

挑戰(zhàn)和考慮因素

盡管CQRS和事件溯源可以帶來巨大的好處,但也帶來了復(fù)雜性。eCw28資訊網(wǎng)——每日最新資訊28at.com

復(fù)雜性開銷

  • 架構(gòu)復(fù)雜性:CQRS和事件溯源引入了額外的層次和組件到系統(tǒng)中,如事件存儲、命令和事件總線以及同步機(jī)制。
  • 學(xué)習(xí)曲線:對于不熟悉這些模式的團(tuán)隊(duì)來說,需要一個(gè)學(xué)習(xí)階段。從傳統(tǒng)的基于CRUD的系統(tǒng)轉(zhuǎn)變思維可能是具有挑戰(zhàn)性的。

數(shù)據(jù)一致性

  • 最終一致性:由于命令和查詢模型的分隔性質(zhì),即時(shí)一致性常常被犧牲以換取最終一致性。這意味著在命令端進(jìn)行的更改在查詢端反映出來之前可能會有延遲。
  • 事件順序:確保事件按照生成的順序進(jìn)行處理,特別是在分布式系統(tǒng)中,可能會很棘手,但對于維護(hù)一致的狀態(tài)至關(guān)重要。

事件版本控制

隨著時(shí)間的推移,事件的結(jié)構(gòu)或語義可能會發(fā)生變化,從而帶來以下挑戰(zhàn):eCw28資訊網(wǎng)——每日最新資訊28at.com

  • 版本不匹配:處理同一事件類型的不同版本可能變得復(fù)雜。
  • 事件升級:隨著事件的演變,系統(tǒng)必須能夠?qū)⑴f版本的事件升級到新版本,而不修改存儲的事件。

數(shù)據(jù)存儲和重放

  • 存儲考慮:由于所有事件都被存儲,事件存儲庫可能會迅速增長,導(dǎo)致存儲成本增加和潛在的性能問題。
  • 重放持續(xù)時(shí)間:通過重放大量歷史事件來重建系統(tǒng)狀態(tài)可能耗時(shí)很長,影響系統(tǒng)的恢復(fù)和初始化時(shí)間。

其他系統(tǒng)集成

使用CQRS和事件溯源的系統(tǒng)與不遵循這些模式的外部系統(tǒng)集成可能具有挑戰(zhàn)性,特別是在數(shù)據(jù)同步和事務(wù)管理方面。eCw28資訊網(wǎng)——每日最新資訊28at.com

邊界確定

  • 粒度決策:決定應(yīng)用CQRS和事件溯源的粒度非常重要。在微觀級別實(shí)施可能導(dǎo)致過度復(fù)雜化,而過于廣泛地實(shí)施可能會削弱其好處。
  • 領(lǐng)域復(fù)雜性:對于簡單的域來說,這些模式可能過于復(fù)雜。它們更適用于復(fù)雜的領(lǐng)域,其中好處超過了實(shí)施和維護(hù)成本。

工具和基礎(chǔ)設(shè)施

雖然有像Axon這樣的工具和框架支持CQRS和事件溯源,但它們可能并不完全適合所有場景。可能需要進(jìn)行定制實(shí)現(xiàn),這可能會增加項(xiàng)目的復(fù)雜性和持續(xù)時(shí)間。eCw28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論

CQRS為擴(kuò)展和組織微服務(wù)提供了一種獨(dú)特的方式。當(dāng)與Spring生態(tài)系統(tǒng)結(jié)合使用時(shí),它可以提供一個(gè)強(qiáng)大的工具包,用于構(gòu)建健壯、可擴(kuò)展和易于維護(hù)的系統(tǒng)。然而,就像所有架構(gòu)決策一樣,需要權(quán)衡利弊并確保它是否適合你的實(shí)際場景。eCw28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13617-0.html從CRUD到CQRS:使用Spring微服務(wù)轉(zhuǎn)變你的架構(gòu)策略

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 向量化操作簡介和Pandas、Numpy示例

下一篇: 掌握這五個(gè)要點(diǎn),利用IntelliJ IDEA進(jìn)行前端開發(fā)

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網(wǎng)課,網(wǎng)課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點(diǎn)就是停滯的這幾年行業(yè)又有了新的發(fā)展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • vivo TWS Air開箱體驗(yàn):真輕 臻好聽

    在vivo S15系列新機(jī)的發(fā)布會上,vivo的最新款真無線藍(lán)牙耳機(jī)vivo TWS Air也一同發(fā)布,本次就這款耳機(jī)新品給大家?guī)硪粋€(gè)簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產(chǎn)
  • 消息稱迪士尼要拍真人版《魔發(fā)奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實(shí)有點(diǎn)忙,忙著將不少動(dòng)畫改成真人版,繼《美人魚》后,真人版《白雪公主》、《魔發(fā)奇緣》也在路上了。據(jù)外媒消息稱,迪士尼將打造真人版
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進(jìn)和創(chuàng)新,Node.js 在 2023 年達(dá)到了一個(gè)新的高度。Node.js 擁有一個(gè)龐大的生態(tài)系統(tǒng),可以幫助開發(fā)人員更快地實(shí)現(xiàn)復(fù)雜的應(yīng)用。本文就來看看 Node.js 最新的生
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是&ldquo;環(huán)境保
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 三星獲批量產(chǎn)iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續(xù)在今年9月舉辦一年一度的秋季新品發(fā)布會,有傳言稱發(fā)布會將于9月12日舉行,屆時(shí)全新的iPhone 15系列將正式與大家見面,不出意外的話
  • iQOO 11S新品發(fā)布會

    iQOO將在7月4日19:00舉行新品發(fā)布會,推出杭州亞運(yùn)會電競賽事官方用機(jī)iQOO 11S。
  • 三翼鳥智能家居亮相電博會,讓用戶體驗(yàn)更真實(shí)

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現(xiàn)場,成為了展會的一大看點(diǎn)。這也是三翼鳥繼9月9日發(fā)布了行業(yè)首個(gè)一站式定制智慧家平臺后的
Top