跳到主要内容
版本:Next

外部集成

本文档引用的文件

目录

  1. 引言
  2. HTTP API 集成架构
  3. 类型安全的 RESTful 服务调用
  4. 工程级服务集成
  5. 认证与安全通信配置
  6. 超时与错误处理机制
  7. 集成测试策略
  8. 熔断与弹性设计建议
  9. 典型集成场景
  10. 总结

引言

本项目通过 IMyPluginNameExternalApi 接口与外部系统进行 HTTP API 集成,并通过 MyPluginNameProjectService 实现工程级服务协调。系统采用 WebApiClientCore 实现类型安全的 RESTful 调用,支持灵活的配置管理、状态同步和异步处理机制。本文档详细说明其集成能力、实现机制和最佳实践。

HTTP API 集成架构

图示来源

本节来源

类型安全的 RESTful 服务调用

系统使用 WebApiClientCore 实现类型安全的 HTTP 调用,通过接口定义自动生成客户端代码,避免手动构建请求和解析响应。

接口定义

IMyPluginNameExternalApi 接口定义了对外部服务的调用契约,使用属性标注 HTTP 方法和路径:

[HttpPost("api/v1/myPluginName/myEntityName")]
Task<MyEntityNameDto> CreateAsync([JsonContent] MyEntityNameCreateDto input);

该设计确保编译时类型检查,减少运行时错误。

依赖注入配置

CMSPluginEntry 中通过 AddHttpApi<T> 注册接口,实现自动注入:

context.Services.AddHttpApi<IMyPluginNameExternalApi>()
.ConfigureHttpApi(configuration.GetSection(nameof(IMyPluginNameExternalApi)));

配置从 appsettings.json 中读取,支持灵活的环境适配。

本节来源

工程级服务集成

MyPluginNameProjectService 作为工程级服务,负责协调本地数据与外部系统的状态同步,实现跨系统业务逻辑封装。

服务生命周期管理

该服务继承自 BaseProjectService,通过重写 StartAsyncStopAsync 方法管理生命周期:

  • 启动时:创建变量通道监听器,订阅关键变量变化
  • 停止时:释放资源并可触发后台作业进行清理

变量变更响应机制

通过 FlowVariableChannelListener 监听特定变量变化,当监控的变量值发生改变时触发事件:

_channelListener.TagChanged += OnTagValueChanged;

事件处理中采用异步任务避免阻塞主线程,确保系统响应性。

外部调用协调

在变量变化处理中,可协调本地持久化与外部 API 调用:

图示来源

本节来源

认证与安全通信配置

HTTPS/TLS 配置

虽然当前配置使用 HTTP,但系统支持 HTTPS 通信。建议在生产环境中使用 HTTPS:

{
"IMyPluginNameExternalApi": {
"HttpHost": "https://external-api.example.com/"
}
}

确保外部服务支持 TLS 1.2+,并在网络层配置证书验证。

认证机制

系统通过 AuthRequired 属性声明服务需要认证:

public override bool AuthRequired => true;

实际认证逻辑由平台基座处理,通常包括:

  • JWT 令牌验证
  • API Key 校验
  • OAuth2 授权

建议在 IMyPluginNameExternalApi 接口中添加认证头支持:

[Header("Authorization", "Bearer {token}")]

本节来源

超时与错误处理机制

超时设置

WebApiClientCore 支持配置请求超时,应在 appsettings.json 中定义:

{
"IMyPluginNameExternalApi": {
"HttpHost": "http://127.0.0.1:18000/",
"Timeout": "00:00:30"
}
}

或在代码中配置:

services.ConfigureHttpApi(config => {
config.Timeout = TimeSpan.FromSeconds(30);
});

错误处理

系统采用分层错误处理策略:

  1. 调用层:捕获异常并记录
  2. 业务层:根据错误类型决定重试或降级
  3. 监控层:记录异常用于告警
private async Task ExecuteExternalApiAsync()
{
try
{
await _serviceProvider.GetRequiredService<IMyPluginNameExternalApi>().CreateAsync(dto);
}
catch (Exception e)
{
_logger.LogException(e);
}
}

建议实现重试机制和熔断保护。

本节来源

集成测试策略

系统提供完整的测试基础设施,支持对集成逻辑进行验证。

测试架构

  • 单元测试:验证单个方法逻辑
  • 集成测试:验证服务间协作
  • 端到端测试:验证完整业务流程

测试基类

MyPluginNameApplicationTestBase 提供数据库上下文访问能力,支持在测试中验证数据持久化:

protected virtual void UsingDbContext(Action<CMSPluginDbContext> action)

测试建议

  1. 模拟外部 API:使用 Moq 或 WireMock 模拟外部服务
  2. 测试异常路径:验证网络超时、服务不可用等情况的处理
  3. 验证状态同步:确保本地数据与外部系统最终一致
  4. 性能测试:评估高并发下的系统表现

本节来源

熔断与弹性设计建议

虽然当前代码未直接集成 Polly,但建议添加熔断机制以提高系统弹性。

Polly 熔断策略建议

// 超时 + 重试 + 熔断
Policy
.Handle<HttpRequestException>()
.Or<TimeoutException>()
.CircuitBreakerAsync(
exceptionsAllowedBeforeBreaking: 3,
durationOfBreak: TimeSpan.FromSeconds(30)
);

// 指数退避重试
Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(
retryCount: 3,
sleepDurationProvider: retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
);

集成方式

  1. 装饰器模式:创建包装类实现熔断
  2. AOP 切面:通过拦截器注入弹性逻辑
  3. 服务代理:在 IMyPluginNameExternalApi 调用前添加策略

监控建议

  • 记录熔断状态变化
  • 设置告警阈值
  • 提供管理接口查看熔断器状态

本节来源

典型集成场景

与 ERP 系统集成

应用场景:生产订单变更时同步到 ERP 系统。

与 MES 系统集成

应用场景:实时同步设备运行数据到 MES。

与其他 CMS 模块集成

应用场景:跨模块内容协同编辑。

本节来源

总结

本项目通过 WebApiClientCore 实现了类型安全的外部系统集成,IMyPluginNameExternalApi 提供了清晰的 RESTful 调用接口,MyPluginNameProjectService 封装了复杂的跨系统业务逻辑。系统支持灵活的配置、完善的错误处理和可扩展的集成架构。建议进一步增强熔断机制、完善监控体系,并在生产环境中强制使用 HTTPS 通信,以确保集成的可靠性和安全性。