Catalog microservice(目錄微服務)維護着全部產品信息,包括庫存、價格。因此該微服務的核心業務爲:數據庫
如上圖所示,本微服務採用簡單的數據驅動的CRUD微服務架構,來執行產品信息的建立、讀取、更新和刪除(CRUD)操做。
這種類型的服務在單個 ASP.NET Core Web API 項目中便可實現全部功能,該項目包括數據模型類、業務邏輯類及其數據訪問類。其項目結構以下:
架構
核心技術選型:異步
Pollyasync
該微服務的核心領域實體是商品,其類圖以下:ide
對於實體這一塊,有兩個小知識點須要說明一下:微服務
ForSqlServerUseSequenceHiLo
指定使用HI-LO
高低位序列進行主鍵生成。CatalogController
的構造方法中,明確指定如下代碼來進行查詢優化,這一點也是咱們值得學習的地方。((DbContext)context).ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
Polly
開啓了Retry機制。private Policy CreatePolicy( ILogger<CatalogContextSeed> logger, string prefix,int retries = 3) { return Policy.Handle<SqlException>(). WaitAndRetryAsync( retryCount: retries, sleepDurationProvider: retry => TimeSpan.FromSeconds(5), onRetry: (exception, timeSpan, retry, ctx) => { logger.LogTrace($"[{prefix}] Exception {exception.GetType().Name} with message ${exception.Message} detected on attempt {retry} of {retries}"); } ); } public async Task SeedAsync(CatalogContext context,IHostingEnvironment env,IOptions<CatalogSettings> settings,ILogger<CatalogContextSeed> logger) { var policy = CreatePolicy(logger, nameof(CatalogContextSeed)); await policy.ExecuteAsync(async () => { //... }); }
你確定會好奇爲何會多了一張IntegrationEventLog
表,這裏先按住不表。學習
若是eShopOnContainers採用的是單體式應用架構而非微服務架構,那麼以上業務邏輯的實現並不複雜,使用簡單的CRUD再輔以ACID事務就能很好的完成業務需求。本文的介紹也就能夠到此爲止了。優化
然而將其抽取出來成爲獨立的基礎微服務,那麼咱們要考慮的問題就多了。好比:設計
而這一切咱們都不能再享受單體應用中直接使用ACID事務的便利了。由於在微服務應用裏,產品表和購物籃表被各自的微服務所佔有。任何微服務不該該在本身的事務中包含其餘微服務的表或存儲,即便是直接查詢也是不能夠的。目錄微服務不能直接更新購物籃表,由於購物籃表被購物籃微服務佔有。要更新購物籃微服務,產品微服務應該使用基於異步通訊,如集成事件(消息和基於事件的通訊)來實現最終一致性。code
那下一節咱們就來詳細闡述eShopOnContainers是如何經過事件機制完成最終一致性的。