ABP VNext从单体切换到微服务 (2)

依赖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上裁剪即可,每个独立的承载体只拥有自身的上下文。

图片

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjgsd.html