1. 程式人生 > >微服務實戰(一):落地微服務架構到直銷系統(什麼是微服務)

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

網上有很多關於微服務的文章,從不同的維度對微服務進行了相關的講述;有些高屋建瓴,有些涉及細節,有些側重理論,有些側重程式碼,都是非常不錯的瞭解微服務的文章。

我們這個系列的文章的維度主要是實戰落地,也就是我們在平常工作以及產品開發過程中,考慮為什麼選擇微服務架構風格,以及如何將微服務的架構風格落地到我們實際的一個大健康行業直銷電商系統的主要過程。本文涉及有少量理論的部分,主要是架構與實現的層面,讓大家真正對微服務能瞭解、能認識、能實現。

本系列文章從“DDD實戰進階第一波”系列繼續。如果你對我們落地的系統的需求以及DDD不是特別瞭解的話,建議你先檢視我們DDD實戰進階第一波的文章,因為DDD是微服務架構風格的一個重要組成部分,而且本系列的需求和程式碼會緊接著DDD實戰進階第一波。

微服務這幾年很火。其實一種概念或一種架構風格的興起,一定有它背後的原因。我們在這裡不講所謂高大上的理由,而是講我經過將近18年的軟體設計與開發工作,在有選擇性的成功使用了微服務架構風格的體會。

微服務架構風格的興起,主要是因為客戶對現代化的產品和系統的需要,對軟體開發本身提出了更高的要求。

1.服務獨立性:

一個系統通常在設計時,架構師(或專案經理)會根據對需求的理解劃分為設計上的多個界限上下文,每個界限上下文包含本界限上下文需要的領域模型。在實際

開發過程中,會主要出現以下幾個問題:

a.多小組並行開發:在一個大型系統中,界限上下文會分給不同的開發小組進行開發。有些界限上下文之間在業務上有依賴關係,但我們在技術上也做了依賴。比如訂單界限上下文依賴產品界限上下文或客戶界限上下文,這樣通常要先實現被依賴的物件或功能(至少要先定義出來),才做依賴它的功能,影響開發的效率。

b.部署與執行的問題:因為存在依賴關係,所以被依賴界限上下文的元件發生變化時,該元件還要更新到依賴它的界限上下文中,管理複雜。而且一旦被依賴的界限上下文出現問題,依賴它的界限上下文也會出現問題。服務獨立部署到不同的主機或Docker上因為存在引用,也會對管理和部署上帶來障礙。

c.技術選擇的問題:因為技術上存在依賴關係(通常是通過引用),所以多個小組採用的技術通常是相同的。但在某些情況下,界限上下文應該選用最適合它的技術,而且界限上下文之間也不應該通過Restful風格的介面互相訪問。

2.高效能大併發:

現代的網際網路應用,需要支援大量使用者的併發訪問操作,傳統的經典開發方式,會主要出現以下幾個問題:

a.用例介面的直接暴露:通常我們會將功能暴露成介面,而介面通過呼叫應用服務(應用服務協調倉儲和邏輯)完成用例功能,如果邏輯複雜,資料庫訪問負載大,特別該用例通過事務同時操作多個數據訪問上下文,速度會很慢,很長時間才給前端返回結果,如果使用者多,該問題會被放大。

b.查詢的問題:一個界限上下文除了用例的功能,通常我們會有很多查詢的功能提供給使用者。通常我們會將一個界限上下文的所有功能都做到一個Api專案中,另外業務和查詢使用的模型是同一個,這樣也會影響效能。

3.事件溯源與最終一致性:

在大併發的系統中,我們不能使用事務來保證強一致性,因為這樣會影響效能,我們應該採用多界限上下文的最終一致性來保證資料的正確。

a.傳統的經典開發方式,無法實現最終一致性的主要原因是沒有記錄一個物件變化歷史的事件資訊,所以當我們在通過非事務同時更新多個界限上下文的資料時,當需要回滾先更新界限上下文的物件資料時,不知道該物件的歷史狀態,也就沒辦法還原。

b.業務單據的歷史修改資訊:通常在業務系統中,我們有需求需要知道一個物件(比如一張單據)的歷史修改記錄時,因為沒有記錄事件資料,所以無法很好的跟蹤物件的歷史變化狀態。

4.服務的高可用行:

現在對服務的高可用要求越來越高,我們應該儘量保證應用提供的服務可用,否則會丟失使用者,造成業務損失。服務的高可用通常會由於以下兩個方面原因引起:

a.資料庫服務或資料庫down掉、資料訪問網路連線中斷。

b.WebApi網路地址不可用、WebApi訪問負載大、對使用者的請求響應異常。

為了解決上述的開發過程、部署過程以及執行過程中的問題,我們需要一種新的架構風格來指導產品的開發、部署與執行。這種架構風格就是微服務。微服務架構風格提出以下幾個

要求來解決上述問題,並應對使用者與市場對我們的產品與軟體提出的更高的要求。

1.通過構建EDA(事件驅動的架構)並結合訊息匯流排,解決服務獨立性的問題。

2.通過構建CQRS(命令查詢職責分離的架構)並結合訊息匯流排,解決大併發高效能的問題。

3.通過構建Event儲存與還原的機制,實現事件溯源,解決最終一致性的問題,也解決業務上有物件歷史狀態獲取需求。

4.通過資料庫產品本身高可用行,彈性訪問實現資料訪問高可用;通過實現WebApi負載平衡、重試與斷路器、Api閘道器與服務中心等方式,實現WebApi的高可用。

因此,我對微服務的定義是:微服務是一種架構風格,它旨在通過將一個大系統分解成多個小系統(DDD中的界限上下文),並通過一系列的架構建議,解決服務獨立性、效能、事件溯源與最終一致、高可用性的需求,最終使多個界限上下文能夠相互協作,組合成一個為使用者提供高質量的服務的大系統。

本系列文章涉及到的技術包括C#、Asp.net core、EF core、RabbitMq、Ocelot、Consul、Docker等。

本系列文章通過直銷系統的實際案例,最終將實現如下的兩個總體架構圖,並將直銷系統的業務連線到它們。

QQ討論群:309287205 

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

相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SpringCloud Alibaba微服務實 - 基礎環境準備

Springcloud Aibaba現在這麼火,我一直想寫個基於Springcloud Alibaba一步一步構建微服務架構的系列部落格,終於下定決心從今天開始本系列文章的第一篇 - 基礎環境準備。 該系列文章內容主要基於三個微服務:使用者服務AccountService,訂單服務OrderService

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

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

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

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

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

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

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服務客戶端定義方式。

Spring Cloud微服務實---1.9.服務架構容錯處理

在微服務架中,所有功能均通過微服務來提供,如果其中某個關鍵微服務出現問題,如響應時間過長,那麼所有呼叫這個微服務的微服務都會變慢,由於呼叫者微服務變慢,進一步會使其他更廣泛的微服務變慢,最終整個系統可能會因為一個微服務出現問題,而使整個微服務架構出現故障。為了防止這種現象的發生,我們可以使用

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

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

微服務實(三)深入微服務架構的進程間通信 - DockOne.io

ram 可靠的 eat repr 都在 kit 瀏覽器 兼容 信息 原文:微服務實戰(三):深入微服務架構的進程間通信 - DockOne.io 【

Spring-cloud微服務實【六】介面服務feign

在上一篇文章中,我們使用了ribbon進行負載均衡,但是仔細思考一下,我們的請求封裝和呼叫以及結果的返回都是我們自己編碼完成的,如果需要呼叫的介面很多,那麼無疑開發量是比較大的,那有沒有比較好的方式呢?答案就是feign.讓我們先通過程式碼來看一下feign的使用: 首先,我們需要複製一份consumer的程