集成服务
集成服务概念的提出,旨在区分专为模块间(或微服务间)通信构建的 应用服务 与面向UI或客户端应用程序调用的应用服务。
下图展示了位于API网关后端的几个微服务,这些服务由UI应用程序和第三方客户端应用调用:
从API网关外部发起的HTTP请求可称为外部请求,而微服务之间发起的HTTP请求则视为内部请求。专门设计用于响应这些内部请求的应用服务被称为集成服务,因为它们的主要目的是实现系统内微服务的集成,而非直接响应用户请求。
将应用服务标记为集成服务
假设您有一个名为ProductAppService的应用服务,并希望将其作为集成服务使用。此时,您可以在应用服务类上方使用[IntegrationService]特性,如下所示:
[IntegrationService]
public class ProductAppService : ApplicationService, IProductAppService
{
// ...
}
若您的应用服务包含接口(如本例中的IProductService),也可在服务接口上使用该特性:
[IntegrationService]
public interface IProductAppService : IApplicationService
{
// ...
}
如果您已在服务接口上使用了
[IntegrationService]特性,则无需在服务类上重复使用。
至此配置完成。此后,ABP将遵循约定将您的应用服务作为集成服务处理,并自动实现以下行为:
- 默认情况下该服务不对外暴露,除非显式设置
ExposeIntegrationServices选项(参见"暴露集成服务"章节)。 - 若应用程序中使用 自动API控制器 功能,集成服务的URL前缀将使用
/integration-api而非/api。借此可区分内部与外部服务通信,并执行额外操作(例如阻止通过API网关外部调用集成服务的REST API)。 - 集成服务默认禁用审计日志。如需启用请参阅下一章节。
将MVC控制器标记为集成服务
除应用服务外,您还可以使用相同的IntegrationService特性或将继承自具有IntegrationService特性的接口,将常规MVC控制器标记为集成服务。
示例:
[IntegrationService] // 标记为集成服务
[Route("integration-api/products")]
public class ProductController : AbpControllerBase
{
//...
}
使用IntegrationService特性后,ABP将遵循约定将您的控制器作为集成服务处理:
- 默认情况下该控制器不向客户端暴露,除非显式设置
ExposeIntegrationServices选项(参见"暴露集成服务"章节)。 - 控制器默认禁用审计日志。如需启用请参阅下一章节。
配置选项
暴露集成服务
出于安全考虑,集成服务及控制器默认不对外暴露。这些服务通常不需要授权验证,因此需要审慎且显式地允许它们对客户端应用程序可见和可用。
要暴露集成服务及控制器,请在模块类的ConfigureServices方法中设置AbpAspNetCoreMvcOptions.ExposeIntegrationServices为true:
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ExposeIntegrationServices = true;
});
当构建可复用应用模块时,隐藏集成服务非常实用——这些模块可能被用于单体应用或微服务系统。在单体应用中,由于模块间可能通过进程内通信,集成服务无需对外暴露。相反,如果您构建微服务解决方案并将该模块作为服务使用,则适合暴露集成服务,以便其他微服务可在私有网络(或Kubernetes集群)内部远程调用。此时需注意避免意外将集成服务暴露到私有网络之外。配置API网关以阻止从外部网络访问带
integration-api前缀的URL将是一个较好的选择。
启用/禁用审计日志
集成服务默认禁用审计日志,但可通过在模块类的ConfigureServices方法中配置AbpAuditingOptions 选项类 来启用:
Configure<AbpAuditingOptions>(options =>
{
options.IsEnabledForIntegrationService = true;
});
其他选项与详细信息请参阅 审计日志文档 。
过滤自动API控制器
在创建 自动API控制器 时,可通过配置AbpAspNetCoreMvcOptions,使用ConventionalControllerSetting的ApplicationServiceTypes选项来过滤集成服务(或非集成服务):
PreConfigure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(
typeof(MyApplicationModule).Assembly,
conventionalControllerSetting =>
{
conventionalControllerSetting.ApplicationServiceTypes =
ApplicationServiceTypes.IntegrationServices;
});
});
提示:可多次调用options.ConventionalControllers.Create,以便为常规应用服务和集成服务配置不同选项。
关于自动API控制器系统的更多信息,请参阅 自动 API 控制器文档 。
抠丁客



