注:此处的微服务只考虑服务部分,不考虑内外层网关、认证等。
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.
清理之后变得简简单单的。
对于test内部,同样采取剔除无需的HttpApi.CLient、MongoDB文件夹(注:此处的无需只是针对我而言,如果有需要还是留着吧)。
清理之后,层次划分变得简简单单的。
public interface IProductServiceClient : ITransientDependency
{
Task<int> GetProductId();
}
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;
}
}
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();
...
}
}
将依照如下图,将三个模块承载到GravelService.Host上。
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMultiTenancyModule),
typeof(CustomerManagementApplicationModule),
typeof(CustomerManagementEntityFrameworkCoreModule),
typeof(OrderManagementApplicationModule),
typeof(OrderManagementEntityFrameworkCoreModule),
typeof(ProductManagementApplicationModule),
typeof(ProductManagementEntityFrameworkCoreModule)
)]
public class GravelServiceHostModule : AbpModule
{
...
}
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";
});
});
此时是在同一进程内,使用到的是ProductAppService的具体实现,断点查看也可看出当前进程内的请求,依赖其他上下文服务的应用服务为ApplicationServiceProxy。
依照如下图开始切换承载模式,只更改承载体,将一个大的承载体切分成各上下文独自承载体。
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMultiTenancyModule),
typeof(OrderManagementApplicationModule),
typeof(OrderManagementEntityFrameworkCoreModule),
typeof(ProductManagementApplicationContractsModule)
)]
public class OrderServiceHostModule : AbpModule
{
...
}
[DependsOn(
...
typeof(AbpHttpClientModule),
...
)]
public class OrderServiceHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
...
context.Services.AddHttpClientProxies( typeof(ProductManagementApplicationContractsModule).Assembly);
...
}
}
{
"RemoteServices": {
"Default": {
"BaseUrl": "http://localhost:57687"
}
}
从大单体承载切换多服务承载,Modules部分不需要做任何更改,着实方便。至于内部的远程调用,本身ABP VNext还存在一些问题像类似集合的Get请求在3.1的版本中才做了修复,但是这丝毫不影响这一巨人的前行。
2020-09-26,望技术有成后能回来看见自己的脚步
原文:https://www.cnblogs.com/CKExp/p/13735261.html