日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABP VNext从单体切换到微服务

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ABP VNext从单体切换到微服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注:此處的微服務只考慮服務部分,不考慮內外層網關、認證等。

ABP VNext從單體切換到微服務,提供了相當大的便利性,對于各模塊內部不要做任何調整,僅需要調整承載體即可。

ABP can help you in that point by offerring a?microservice-compatible, strict module architecture?where your module is splitted into multiple layers/projects and developed in its own VS solution completely isolated and independent from other modules. Such a developed module is a natural microservice yet it can be easily plugged-in a monolithic application.

分層架構

  • ABP VNext自身提供的分層方式如下圖,核心部分是Application、Domain與EntityFrameworkCore層,至于HttpApi.Client與HttpApi都是屬于將應用去承載到其他系統之上的。

  • Controller層在ABP VNext中被削弱了,VNext提供了將Application提供動態Controller,所以可能習慣了將部分邏輯寫在控制器中的會有些唐突,但理解就行。

  • 規劃層次結構

  • 新建空文件夾,取名隨意(本次取名GravelService),用于存放整體項目。

  • 在上一步的空文件夾內新建空白解決方案,可以用VS去生成或是按照dotnet的命令生成。

  • 習慣上按照ABP VNext給定的微服務Demo中的格式創建三個文件夾,思路清晰。當然提供的微服務Demo還有更多文件夾,但是這次只關注這三個。

  • 增加三個模塊

  • 設計三個限界上下文并繪制上下文映射。依照常見的訂單、產品與客戶劃分成三個限界上下文。并規劃好訂單作為下游依賴產品與客戶作為的上游。

  • 從官網直接下載三個模塊,或是按照命令行去生成(前提是已經安裝了ABP CLI),無論哪種方式,確保準備好就行,依照模塊化思想,將其存到modules文件夾下。

  • 如本次準備了三個模塊Product,Order,Customer,依照實際需要,可以去精簡一下內部文件,此處各模塊內部我只留著src和test文件夾。

  • 對于customer模塊的src內部,具體生成的文件夾如下,對于其中的HttpApi、HttpApi.Client及MongoDB,我采取了剔除,無需這部分(在稍后的承載體中有同等功能)。

  • 清理之后變得簡簡單單的。

    對于test內部,同樣采取剔除無需的HttpApi.CLient、MongoDB文件夾(注:此處的無需只是針對我而言,如果有需要還是留著吧)。

    清理之后,層次劃分變得簡簡單單的。

  • 改造下各模塊內給定的Sample案例,改造成各模塊命名開頭,方便加以區分。以Customer模塊為例,將自帶的Sample案例更名成Customer,僅作該項改動。

  • 模擬服務調用

  • 對于Order與Product模塊內增加一個下游訪問上游服務的鏈路,方便驗證從單體跨越到微服務,底層服務的無需任何改動。對于下游訪問上游服務的調用形式,了解到的有兩種方式。

    • 當前上下文的應用層直接依賴其他上下文的應用服務;

    • 當前上下文設定出防腐層(在限界上下文間增加一層隔離,方便保證依賴限界上下文存在變動時只需更改隔離層),在防腐層的實現中去依賴或遠程調用其他上下文的應用服務;

  • 我個人傾向于增加防腐層,雖然在VNext中并無相關說法。具體使用時,在領域層或應用層增加防腐層接口,及在EF Core層給與防腐層實現,此時的EF Core層,更應該更名為基礎設施層,而不單單是作為資源庫的形式。

  • 在Order中Domain層增加ServiceClients文件夾用于存放防腐層接口,而在EntityFrameworkCore層增加ServiceClients文件夾用于存放防腐層實現。

    • 在防腐層接口中增加IProductServiceClient。

    public interface IProductServiceClient : ITransientDependency {Task<int> GetProductId(); }
    • 在防腐層實現中增加ProductServiceClient。

    • 在Order中的EntityFrameworkCore層引用Product模塊內的Application.Contracts層。

    • 依賴ProductAppService并完成調用。

    public class ProductServiceClient : IProductServiceClient {private readonly IProductAppService _productAppService;public ProductServiceClient(IProductAppService productAppService){_productAppService = productAppService;}public async Task<int> GetProductId(){var productDto = await _productAppService.GetAsync();return productDto.Value;} }
    • 在OrderAppService中依賴防腐層接口,并完成調用。

    public class OrderAppService : OrderManagementAppService, IOrderAppService {private readonly IProductServiceClient _productServiceClient;public OrderAppService(IProductServiceClient productServiceClient){_productServiceClient = productServiceClient;}public async Task<OrderDto> GetAsync(){var productId = await _productServiceClient.GetProductId();...} }
  • 這樣一來,在防腐層實現中便可以使用到Product上下文的應用服務了,對于這個應用服務的請求是當前進程內的還是進程間的,由具體的承載方式而決定。

  • 大單體承載

    將依照如下圖,將三個模塊承載到GravelService.Host上。

  • 新建一個GravelService.Host的項目,采用WebApi類型即可。存放到microservices文件夾下,這樣方便理解整個層級劃分。

  • 其次依賴一些基本的Nuget包,諸如ABP自身的及方便展示Api的Swagger。本次不考慮實體的創建,也就不考慮EF Core包的依賴了。

    • Volo.Abp

    • Volo.Abp.AspNetCore.MultiTenancy

    • Volo.Abp.AspNetCore.Mvc

    • Volo.Abp.Autofac

    • Swashbuckle.AspNetCore

  • 引用各模塊內的Application層及EntityFrameworkCore層。模仿著給定的微服務Demo,完成一波CV操作。增加一個類出來承擔著服務與中間件的配置。

  • 在其中依賴引用的各Application層及EntityFrameworkCore層中的Module,這樣一來模塊依賴就搞定了。

  • [DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule),typeof(AbpAspNetCoreMultiTenancyModule),typeof(CustomerManagementApplicationModule),typeof(CustomerManagementEntityFrameworkCoreModule),typeof(OrderManagementApplicationModule),typeof(OrderManagementEntityFrameworkCoreModule),typeof(ProductManagementApplicationModule),typeof(ProductManagementEntityFrameworkCoreModule))] public class GravelServiceHostModule : AbpModule {... }
  • 增加服務配置,將各模塊中的應用服務動態轉換成Api控制器。

  • Configure<AbpAspNetCoreMvcOptions>(options => {options.ConventionalControllers.Create(typeof(CustomerManagementApplicationModule).Assembly, opts =>{opts.RootPath = "CustomerManagement";}).Create(typeof(OrderManagementApplicationModule).Assembly, opts =>{opts.RootPath = "OrderManagement";}).Create(typeof(ProductManagementApplicationModule).Assembly, opts =>{opts.RootPath = "ProductManagement";}); });
  • 然后,啟動即可,所有模塊中的接口都承載到了該承載體中。

  • 通過訪問Order的api/OrderManagement/order接口獲得返回的9527,也就驗證了,防腐層內去訪問Product上下文的應用服務。

  • 此時是在同一進程內,使用到的是ProductAppService的具體實現,斷點查看也可看出當前進程內的請求,依賴其他上下文服務的應用服務為ApplicationServiceProxy。

    多服務承載

    依照如下圖開始切換承載模式,只更改承載體,將一個大的承載體切分成各上下文獨自承載體。

  • 新建三個和GravelService.Host同等的WebApi項目。在GravelService.Host上裁剪即可,每個獨立的承載體只擁有自身的上下文。

  • 依據上下文映射關系,對處于下游的Order承載體增加對上游Product的依賴,在Order承載體中增加對Product模塊中Application.Contracts層的依賴。并在服務配置中完成依賴(第7行)。

  • [DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule),typeof(AbpAspNetCoreMultiTenancyModule),typeof(OrderManagementApplicationModule),typeof(OrderManagementEntityFrameworkCoreModule),typeof(ProductManagementApplicationContractsModule))] public class OrderServiceHostModule : AbpModule { ... }
  • 配置遠程服務代理,在服務配置中設置從Order承載體到Product承載體的遠程服務請求。在Order承載體中增加Volo.Abp.Http.Client包并在服務配置中完成依賴。

  • [DependsOn(...typeof(AbpHttpClientModule),...)] public class OrderServiceHostModule : AbpModule {public override void ConfigureServices(ServiceConfigurationContext context){var configuration = context.Services.GetConfiguration();...? ? context.Services.AddHttpClientProxies( typeof(ProductManagementApplicationContractsModule).Assembly);...} }
  • 在配置源appsettings文件中加入對Product承載體的遠程調用地址

  • ?{"RemoteServices": {"Default": {"BaseUrl": "http://localhost:57687"} }
  • 更改項目配置,啟動多個文件,一并啟動三個獨立承載體,再次調用Order中的Get請求,同樣獲得了從Product上下文的應用服務中的數據

  • 這次采用的不同進程間的承載方式,通過防腐層,然后經ABP提供的Http代理服務調用Product承載體,可以斷點查看當前在防腐層中的AppService類型,已經不再是直接使用ProductAppService了。

  • 真香

    從大單體承載切換多服務承載,Modules部分不需要做任何更改,著實方便。至于內部的遠程調用,本身ABP VNext還存在一些問題像類似集合的Get請求在3.1的版本中才做了修復,但是這絲毫不影響這一巨人的前行。

    總結

    以上是生活随笔為你收集整理的ABP VNext从单体切换到微服务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。