项目

集成服务

集成服务概念的提出,旨在区分专为模块间(或微服务间)通信构建的 应用服务 与面向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.ExposeIntegrationServicestrue

Configure<AbpAspNetCoreMvcOptions>(options =>
{
    options.ExposeIntegrationServices = true;
});

当构建可复用应用模块时,隐藏集成服务非常实用——这些模块可能被用于单体应用或微服务系统。在单体应用中,由于模块间可能通过进程内通信,集成服务无需对外暴露。相反,如果您构建微服务解决方案并将该模块作为服务使用,则适合暴露集成服务,以便其他微服务可在私有网络(或Kubernetes集群)内部远程调用。此时需注意避免意外将集成服务暴露到私有网络之外。配置API网关以阻止从外部网络访问带integration-api前缀的URL将是一个较好的选择。

启用/禁用审计日志

集成服务默认禁用审计日志,但可通过在模块类的ConfigureServices方法中配置AbpAuditingOptions 选项类 来启用:

Configure<AbpAuditingOptions>(options =>
{
    options.IsEnabledForIntegrationService = true;
});

其他选项与详细信息请参阅 审计日志文档

过滤自动API控制器

在创建 自动API控制器 时,可通过配置AbpAspNetCoreMvcOptions,使用ConventionalControllerSettingApplicationServiceTypes选项来过滤集成服务(或非集成服务):

PreConfigure<AbpAspNetCoreMvcOptions>(options =>
{
    options.ConventionalControllers.Create(
        typeof(MyApplicationModule).Assembly,
        conventionalControllerSetting =>
        {
            conventionalControllerSetting.ApplicationServiceTypes = 
                ApplicationServiceTypes.IntegrationServices;
        });
});

提示:可多次调用options.ConventionalControllers.Create,以便为常规应用服务和集成服务配置不同选项。

关于自动API控制器系统的更多信息,请参阅 自动 API 控制器文档

相关阅读

在本文档中