1. 程式人生 > >微服務實戰(四):落地微服務架構到直銷系統(將生產者與消費者接入訊息匯流排)

微服務實戰(四):落地微服務架構到直銷系統(將生產者與消費者接入訊息匯流排)

前一篇文章我們已經完成了基於RabbitMq實現的的訊息匯流排,這篇文章就來看看生產者(訂單微服務)與消費者(經銷商微服務)如何接入訊息匯流排實現訊息的傳送與訊息的接收處理。

定義需要傳送的訊息:

下單訊息要被髮送到訊息匯流排,並被經銷商微服務的處理器處理。經銷商微服務處理時,需要知道要對哪個經銷商處理多少的PV值與電子幣餘額。這些資訊就是事件訊息需要承載的重要資訊。

public class OrderCreatedProcessDealerEvent:BaseEvent
    {
        public decimal OrderTotalPrice { get; set; }
        
public decimal OrderTotalPV { get; set; } public Guid DealerId { get; set; } public Guid OrderId { get; set; } public OrderCreatedProcessDealerEvent(Guid dealerid,Guid orderid,decimal ordertotalprice,decimal ordertotalpv) { this.OrderTotalPrice = ordertotalprice;
this.OrderTotalPV = ordertotalpv; this.DealerId = dealerid; this.OrderId = orderid; } }

生產者(訂單微服務)連線到訊息匯流排:

生產者-訂單微服務通過Asp.net core WebApi自帶的依賴注入,連線到RabbitMq訊息匯流排。

            services.AddSingleton<IEventHandlerExecutionContext>(new EventHandlerExecutionContext(services));
            
var connectionFactory = new ConnectionFactory { HostName = "localhost" }; services.AddSingleton<IEventBus>(sp => new RabbitMqEB(connectionFactory, sp.GetRequiredService<IEventHandlerExecutionContext>(), "exchange2", "direct", "ordereventqueue", 1));

從上面程式碼可以看出,生產者連線到了localhost的Rabbit伺服器,並通過呼叫訊息匯流排的建構函式,定義了傳送訊息的通道。建構函式具體內容可以檢視上一篇文章。

生產者(訂單微服務)傳送訊息到訊息匯流排:

ieventbus.Publish(new OrderCreatedProcessDealerEvent(orderdto.DealerId,
                        orderid, order.OrderTotalPrice.TotalPrice, order.OrderTotalPV.TotalPV));

ieventbus是注入到訂單微服務的建構函式中,並傳遞到訂單建立的用例中。 

實現消費者(經銷商微服務)的訊息處理器:

消費者會連線到訊息匯流排,接收到特定型別的訊息(這裡是OrderCreatedProcessDealerEvent),會交給特定的處理器進行處理,所以需要先定義並實現訊息處理器。

public class OrderCreatedEventHandler : IEventHandler
    {
        ServiceLocator servicelocator = new ServiceLocator();
        public Task<bool> HandleAsync<TEvent>(TEvent @event) where TEvent : IEvent
        {
            var idealercontext = servicelocator.GetService<IDealerContext>();
            var irepository =
                servicelocator.GetService<IRepository>(new ParameterOverrides { { "context", idealercontext } });
            var idealerrepository = servicelocator.GetService<IDealerRepository>(new ParameterOverrides { { "context", idealercontext } });
  //先將接收到的訊息轉換成特定型別          
var ordercreatedevent = @event as OrderCreatedProcessDealerEvent;
            using (irepository)
            {
                try
                {
                  //根據訊息內容,處理自己的邏輯與持久化
                    idealerrepository.SubParentEleMoney(ordercreatedevent.DealerId, ordercreatedevent.OrderTotalPrice);
                    idealerrepository.AddDealerPV(ordercreatedevent.DealerId, ordercreatedevent.OrderTotalPV);
                    irepository.Commit();
                }
                catch (EleMoneyNotEnoughException)
                {
                     //先不處理電子幣餘額不足的情況                   

                }
            }
            return Task.FromResult(true);
        }
    }

消費者(經銷商微服務)連線到訊息匯流排:

需要在經銷商微服務指定需要連線到的訊息匯流排,並訂閱哪個型別的訊息交給哪個事件處理器進行處理。

            //用於偵聽訂單上下文傳遞的訊息
            services.AddSingleton<IEventHandlerExecutionContext>(new EventHandlerExecutionContext(services));
            var connectionFactory = new ConnectionFactory { HostName = "localhost" };
            services.AddSingleton<IEventBus>(sp => new RabbitMqEB(connectionFactory,
                sp.GetRequiredService<IEventHandlerExecutionContext>(), "exchange2", "direct", "ordereventqueue", 2));
            var eventbus = app.ApplicationServices.GetService<IEventBus>();
//訂閱訊息
                        eventbus.Subscribe<OrderCreatedProcessDealerEvent, OrderCreatedEventHandler>();

這樣,兩個微服務直接就能通過RabbitMq訊息匯流排進行訊息的傳送、訊息的接收與處理了,實現瞭解耦。

QQ討論群:309287205 

微服務實戰視訊請關注微信公眾號:

相關推薦

微服務實()落地服務架構直銷系統(生產者消費者接入訊息匯流排)

前一篇文章我們已經完成了基於RabbitMq實現的的訊息匯流排,這篇文章就來看看生產者(訂單微服務)與消費者(經銷商微服務)如何接入訊息匯流排實現訊息的傳送與訊息的接收處理。 定義需要傳送的訊息: 下單訊息要被髮送到訊息匯流排,並被經銷商微服務的處理器處理。經銷商微服務處理時,需要知道要對哪個經銷商處理多少

微服務實(九)落地服務架構直銷系統(回顧總結)

這個系列我們大概寫了八篇文章,將微服務的最重要的內容過了一遍。當然其中有些內容還沒有涉及到,比如Docker(不是微服務架構風格中必須的)等,關於Docker我們自己可以在網上找找其他文章。 這篇文章就來回顧下微服務架構風格是如何落地的,如果你對以下回顧的內容都很清楚並已經有一些實踐的經驗,那麼恭喜你,你已

微服務實(七)落地服務架構直銷系統(實現命令命令處理器)

我們先來看看CQRS架構,你對下圖的架構還有印象嗎?每個元件的功能都還清楚嗎?如果有疑問,請查考文章《微服務實戰(五):落地微服務架構到直銷系統(構建高效能大併發系統)》。   前一篇文章已經實現了Event Store的基礎功能部分,本篇文章我們通過C端的標準方式,實現一個下單的高併發命令端,來看看需要實現

微服務實(八)落地服務架構直銷系統(服務高可用性)

在微服務架構風格的系統中,如果單個微服務垮掉或地址不可訪問,雖然對系統的影響是有限的,但我們也必須採取一定的手段來保證每個微服務儘量可用;並且在大併發的情況下,雖然可以通過EDA訊息佇列處理的方式提高吞吐量,但仍然需要WebApi能夠更加高效的偵聽使用者請求,處理訊息,即使在某個服務短暫不可用的情況下。本篇文

微服務實(二)落地服務架構直銷系統(構建訊息匯流排框架介面)

從上一篇文章大家可以看出,實現一個自己的訊息匯流排框架是非常重要的內容,訊息匯流排可以將界限上下文之間進行解耦,也可以為大併發訪問提供必要的支援。 訊息匯流排的作用: 1.界限上下文解耦:在DDD第一波文章中,當更新了訂單資訊後,我們通過呼叫經銷商界限上下文的領域模型和倉儲,進行了經銷商資訊的更新,這造成了

微服務實(一)落地服務架構直銷系統(什麼是服務)

網上有很多關於微服務的文章,從不同的維度對微服務進行了相關的講述;有些高屋建瓴,有些涉及細節,有些側重理論,有些側重程式碼,都是非常不錯的瞭解微服務的文章。 我們這個系列的文章的維度主要是實戰落地,也就是我們在平常工作以及產品開發過程中,考慮為什麼選擇微服務架構風格,以及如何將微服務的架構風格落地到我們實際的

微服務實(六)落地服務架構直銷系統(事件儲存)

在CQRS架構中,一個比較重要的內容就是當命令處理器從命令佇列中接收到相關的命令資料後,通過呼叫領域物件邏輯,然後將當前事件的物件資料持久化到事件儲存中。主要的用途是能夠快速持久化物件此次的狀態,另外也可以通過未來最終一致性的需求,通過事件資料將物件還原到一個特定的狀態,這個狀態通常是通過物件事件的版本來進行

微服務實(三)落地服務架構直銷系統(構建基於RabbitMq的訊息匯流排)

從前面文章可以看出,訊息匯流排是EDA(事件驅動架構)與微服務架構的核心部件,沒有訊息匯流排,就無法很好的實現微服務之間的解耦與通訊。通常我們可以利用現有成熟的訊息代理產品或雲平臺提供的訊息服務來構建自己的訊息匯流排;也可以自己完全寫一個訊息代理產品,然後基於它構建自己的訊息匯流排。通常我們不用重複造輪子(除

微服務實(五)落地服務架構直銷系統(構建高效能大併發系統)

在現代系統中,特別是網際網路軟體,通常會涉及到大量使用者的併發訪問,我們的系統一定要在架構上支援高效能、大併發的訪問。一個高效能的系統通常由很多的方面組成,包括資料庫高效能、Web伺服器高效能、負載均衡、快取、軟體架構等。我們這篇文章先從軟體開發架構的角度作為切入點來介紹如何構建高效能的系統。 傳統架構效能

《Spring Cloud微服務實》讀書筆記之服務治理Spring Cloud Eureka

摘要 服務治理是微服務架構最為核心和基礎的模組,用於實現各個微服務例項的自動化註冊與發現。Spring Cloud Eureka 是對Netflix Eureka的二次封裝,負責服務的治理。 關鍵詞:服務治理 一、服務治理介紹 服務治理是微服務架構最為核心和基礎

圖靈學院服務架構】SpringCloud之Ribbon()

SpringCloud Ribbon​    一:Ribbon是什麼? Ribbon是Netflix釋出的開源專案,主要功能是提供客戶端的軟體負載均衡演算法,將Netflix的中間層服務連線在一起。Ribbon客戶端元件提供一系列完善的配置項如連線超時,重試等。簡單的說,就是

多研究些架構,少談些框架(1)服務架構的核心概念

定位 dubbo spring 提供服務 電信 cor res gate 虛擬 微服務架構和SOA區別 微服務現在辣麽火,業界流行的對比的卻都是所謂的Monolithic單體應用,而大量的系統在十幾年前都是已經是分布式系統了,那麽微服務作為新的理念和原來的分布式系統,或者說

圖靈學院服務架構】SpringCloud之Eureka(服務註冊和服務發現基礎篇)(二)

一:Eureka簡介   Eureka是Spring Cloud Netflix的一個子模組,也是核心模組之一。用於雲端服務發現,一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。服務註冊與發現對於微服務系統來說非常重要。有了服務發現與註冊,你就不需要

《基於SpringCloud服務架構廣告系統設計實現》筆記

img span 設計與實現 微服務 課程 png 1-1 分享圖片 bubuko 1-1 課程導學 什麽是廣告系統? 2-1 廣告系統概覽 2-2 廣告系統架構 2-3 準備工作與系統目錄結構 《基於SpringCl

微服務實服務發現的可行方案以及實踐案例

mesos aws ec2 動態配置 load 顯示 一個 cer c118 分布 微服務實戰(四):服務發現的可行方案以及實踐案例 這是關於使用微服務架構創建應用系列的第四篇文章。第一篇介紹了微服務架構的模式,討論了使用微服務架構的優缺點。第二和第三篇描

微服務實(六)選擇服務部署策略

因此 區別 嚴重 http 虛擬化 one rose 精確 命名空間 微服務實戰(一):微服務架構的優勢與不足 微服務實戰(二):使用API Gateway 微服務實戰(三):深入微服務架構的進程間通信 微服務實戰(四):服務發現的可行方案以及實踐案例 微服務實踐(五)

微服務實(六)選擇服務部署策略 - DockOne.io

利用 -- 的區別 box imp 通信 標準 應用打包 email 原文:微服務實戰(六):選擇微服務部署策略 - DockOne.io 【編者的話】這篇博客是用微服務建應用的第六篇,第一篇介紹了微服務架構

Spring cloud微服務實(三)——基於OAUTH2.0統一認證授權的服務基礎架構升級

前言 從2018年年初寫的一篇主題為 Spring cloud微服務實戰——基於OAUTH2.0統一認證授權的微服務基礎架構的文章後就很少更新了。自從小寶貝誕生和公司業務的繁忙,年初計劃每週更新一篇博文的計劃已經落空了。年底了,終於清閒了些。 升級 Spring cloud微

《Spring微服務實》讀書筆記——構建服務

設計微服務架構 構建程式碼的腳手架 分解業務問題 描述業務問題,安裝名詞來描述問題 注意動詞 尋找資料內聚性 確定服務粒度 使用資料模型作為將單體應用分解到微服務的基礎。 可以通過下面的概念來確定正確的服務粒度: 廣泛的使用微

Spring Cloud 微服務實 第六章 宣告式服務呼叫Spring Cloud Feign

    本章介紹的是Spring Cloud Feign ,它是基於Netfix Feign 實現 ,整合了Spring Cloud Ribbon 與 Spring Cloud Hystrix, 除了提供這兩者的強大功能之外,還提供了一種宣告式的web服務客戶端定義方式。