智能软件平台 XMagital 中间件接入规范
1. 概述
业务中间件处在业务功能与基础服务之间,保证业务功能与基础服务的正常交互,使得应用与应用解耦。
支持服务分布式运行,去中心化的设计,在功能上保证业务与数据的解耦以及功能服务可扩展。
- 提供了统一的服务访问入口,屏蔽了其他应用与认证鉴权服务的频繁交互
- 支持基于HTTP协议的GraphQL和RESTful、WebSocket数据交互规范
- 支持发布订阅和点对点模式
- 提供可复用的消息推送组件和缓存组件
- 支撑审计日志的采集
整体采用去中心化的设计思想,分布式运行,屏蔽了底层实现细节,使具体应用能够更加简单的进行业务功能的开发,如下图所示。
1.1 预期读者
本文档的预期读者包括: XMagital 开发人员、第三方应用开发人员。
1.2 总体框架
在技术实现上中间件架构需要支持服务分布式运行,去中心化的设计,在功能上保证业务与数据的解耦以及功能服务可扩展。
总体框架如下:
平台基于Node.js的Moleculer框架实现了一个快速、多功能的现代微服务框架,提供了许多构建和管理微服务的特性,能帮助我们建立高效的、可靠的可伸缩服务。
当同节点内的两个服务之间发生调用时,性能与本地调用相当;当跨节点访问时,将使用远程连接进行请求传输。
1.3 术语、定义和缩略语
1.3.1 术语
以下术语和定义适用于本文件。
- 第三方
接入的平台中的其他系统模块,为平台内置应用或第三方应用;
- 命名空间 Namespace
命名空间是一种在多个用户(通过资源配额)之间划分集群资源的方法
- 服务
一个service就是一个能对外提供接口调用的运行程序,它是某个复杂的应用程序的一部分。 服务是独立的, 自包含的,即使某个服务停止工作或者崩溃了,其它的服务也不会受到影响。
- 节点
节点是一个在本地或外部网络上运行的简单进程。单个节点实例可以提供一个或多个服务。
- 本地服务
在单个节点上运行的两个(或多个) 服务被视为当地服务。 他们共享硬件资源并以本地方式相互通讯,无网络延迟(也不需要使用transporter)。
- 远程服务
跨越多个节点分配的服务被认为是远程的。 在这种情况下,通过transporter进行通信。
- 服务管理者
Service Broker是Moleculer的核心。 它负责各(本地和远程)服务之间的管理和通信。 每个节点至少需要有一个 Service Broker 实例。
- 传输层\传输器
Transporter用于在服务间交换信息。 它传送事件、请求和响应。
- 网关
API 网关将接入中间件的所有服务暴露给最终用户。 网关是一个运行 (HTTP, WebSockets 等) 服务器的 Moleculer 常规服务。它处理收到的请求,将请求转换为服务调用,然后返回适当的响应。
1.3.2 缩略语
缩略语 | 英文 | 中文含义 |
---|---|---|
API | Application Programming Interface | 应用程序接口 |
JWT | Json Web Token | 将用户登录态以及数据用加密的json格式存储在客户端,服务端可以完全依靠这个字符串认定用户身份。 |
SSO | Single Sign-On | 平台内置单点登录模块;单点登录,一次登录后可免登陆访问其他的可信平台 |
B端 | 浏览器应用,web网页应用程序 | |
JWT | JSON Web Token | 一个开放标准(RFC 7519),定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息 |
1.3 调用说明
- 服务调用
服务通过中间件进行调用时,主要有以下三种方式进行:网关调用方式、SDK 调用、代理调用方式。
接入中间件的应用
- 互相调用
通过 SDK 接入到中间件中的服务,支持各个服务内部,直接对中间件内其他节点服务的 API 进行调用。
通过代理服务接入到集群中的服务,支持通过调用代理服务提供的 Restful/GraphQL 接口完成对其他服务的调用。
- 调用中间件内置服务
日志服务(审计日志)调用
中间件中提供了日志能力,提供一个较为简单的日志接入方式,在应用通过中间件记录日志或审计日志时,调用中间件提供的简化过参数的接口,随后日志服务将整合相关人员和权限、操作等等信息进行汇总,提供给DB服务进行完整的日志操作记录,具体流程如下:
(1) 外部应用通过网关(Restful/GraphQL)调用审计日志服务API。
(2) 通过中间件SDK接入的服务,可直接调用审计日志服务API。
(3) 通过代理服务接入中间件的服务,可通过代理服务调用审计日志服务API。
(4) 日志服务其他模块(审计日志除外),均为中间件内部服务,不对外提供应用。
DB日志存储服务:提供完整的日志接口,供中间件进行存储、查询。
日志支撑服务:提供简化日志服务存储接口,进行数据整合,完成日志整理,调用DB日志存储、查询(透传)。
- 消息通知推送
中间件提供了通过中间件进行消息分组管理和消息发送通道扩展的能力,在服务调用中间件进行消息发送后,中间件将消息传递到消息服务进行消息发送,消息发送时将根据消息的分组情况转入不同的通道进行消费发送,提供站内信及邮件发送能力及其他通道发送能力扩展能力,以便进行消息发送通道的扩展。
(1) 外部应用通过网关(Restful/GraphQL)调用消息推送服务API。
(2) 通过SDK接入中间件的服务,可直接调用消息推送服务API。
(3) 通过代理服务接入中间件的服务,可通过代理服务调用消息推送服务API。
- 未接入中间件的应用
调用接入中间件的应用
(1) 外部应用,可通过中间件提供的网关,调用中间件内所有服务。
(2) 中间件网关支持Restful、GraphQL和WebSockets协议。
调用未接入中间件的应用
不在中间件接入规范约定的范畴,请与对应业务系统协商调用方式,或统一接入中间件后再通过接入中间件的应用方式调用。
(1) 调用网关接口
通过网关调用接入中间件的服务的接口功能,一般用作网页页面等的请求来源,请求地址及案例参见9.1.3章节
(2) 接入方式-SDK接入(主选)
SDK接入
Node.js服务接入
在项目中,引入中间件SDK:hsm-mw-microservice。
根据环境中中间件的相关配置,修改hsm-mw.config.json中配置,以权限服务为例修改为hsm-mw.auth.config.json,详细配置内容及配置项见附录hsm-mw.config.json章节。
启动项目,验证中间件连接情况,参见本文接入验证章节内容进行验证。
编写调用其他运行于中间件中的代码,完成功能调用。
call(actionName, params, opts)
JAVA服务接入
在项目中,引入中间件SDK:hsm-mw-microservice-java。
Maven引入如下,其他类型引入,请在私库中检索引入。
<properties>
<hsm.mw.microservice.version>.9.2</ hsm.mw.microservice.version>
</properties>
<dependencies>
<dependency>
<groupId>com.hsm.mw</groupId>
<artifactId> hsm-mw-microservice-java</artifactId>
<version>${hsm.mw.microservice.version}</version>
</dependency>
</dependencies>
-
按照框架要求的格式开发对应的接口和服务,配置文件修改同node.js接入。代码示例见附录JAVA SDK 代码章节或Demo项目。
-
启动项目,验证中间件连接情况,参见本文接入验证章节内容进行验证。
-
编写调用其他运行于中间件中的代码,完成功能调用。
-
启动
中间件以应用内组件方式启动,无需特殊处理。
- 接入验证
- 通过网关服务页面验证
接入中间件的服务,可以通过中间件的界面查看服务是否成功接入,如果在服务列表中存在,则表示服务接入成功。服务界面如下图所示。
(1) 通过中间件服务命令行交互窗口验证
服务接入到中间件后,也可以使用命令查看服务列表。
services 或者 call $Nodes.services,如果返回的列表中有对应服务,则表示服务接入成功。如下图所示:
(2) 通过网关调用服务验证
服务接入到中间件后,可以使用命令行调用服务的动作,如果调用成功,则表示服务接入成功,调用greeter服务的hello方法,使用命令 call greeter.hello。如下图所示:
接入方式-代理接入(备选)
代理接入
- 代理服务配置
1)拉取中间件服务安装包到服务所在服务器。
2)根据环境中中间件的相关配置,修改hsm-mw.config.json.demo中配置,此配置文件为一个节点内存在多个配置,需要以服务名称命名,以权限服务为例修改为hsm-mw.auth.config.json,详细配置内容及配置项见附录hsm-mw.config.json章节。
当一个节点下加载多个服务时,将服务配置复制后修改,中间件服务将自动加载相应配置文件。
├─config
├─proxy
│ hsm-mw.db-hisdata.config.json
│ hsm-mw.db-rtdata.config.json
└─service
3)启动项目,验证中间件连接情况,参见本文接入验证章节内容进行验证。
4)编写调用其他运行于中间件中的代码,完成功能调用调试。
-
GraphQL接口接入
-
打开代理服务的配置文件。
-
配置要集成的GraphQL接口地址,通过中间件集成GraphQL自省发现进行接口注册、调用。
-
启动代理服务,验证代理服务工作状态。
-
通过代理服务调用接口进行验证。
接入配置文件说明(待定)。
-
Restful接口接入
-
打开代理服务的配置文件
-
配置代理服务配置文件中相应配置项,添加被代理服务要被代理的Restful接口。
-
启动代理服务,验证代理服务工作状态。
-
通过代理服务调用接口进行验证。
接入配置文件说明(待定)。
-
WebSocket接口接入
-
打开代理服务的配置文件。
-
配置要集成的WebSocket接口地址,通过中间件集成后进行接口注册、调用。
-
启动代理服务,验证代理服务工作状态。
-
通过代理服务调用接口进行验证。
接入配置文件说明(待定)。
-
异步事件通知
-
打开代理服务的配置文件。
-
配置要集成的异步事件回调接口地址,通过中间件集成后进行事件通知。
-
启动代理服务,验证代理服务工作状态。
-
通过代理服务调用接口进行验证。
接入配置文件说明见附录异步事件订阅配置章节。
启动
【强制】代理服务与被代理的服务,作为两个服务独立部署启动,需要部署在同一主机,以尽量减少传输损耗。
中间件以可执行文件的形式进行部署,支持Linux(Windows、MAC)操作系统,可以根据环境修改配置文件构建对应的可执行文件。
配置文件内容见附录代理服务配置文件章节。
接入验证
同SDK接入方式的接入验证,参见相应章节内容。
接入规则
以下列举应用之间调用时场景,以是否接入了中间件为划分,具体参照如下:
1) 服务接入
接入流程
应用在接入前,需在权限服务的应用管理中进行应用注册,一个应用可以注册多个服务,注册后可获取到计入口令及服务名称,后续接入后由中间件进行API自动注册,经权限管理授权后可授权用户使用。
服务命名规则
说明 | 单机部署/分布式部署,中间件集群中要求节点名称唯一 | |
---|---|---|
命名规范 | SDK接入 | 节点名称:服务器主机名-启动时间 |
服务名称:应用编码-服务编码 | ||
代理服务接入 | 代理节点名称:proxy-服务器主机名-启动时间 | |
代理服务名称:proxy-系统编码-模块编码 | ||
代理服务端口:默认8080,支持通过配置文件修改 | ||
被代理服务名称:由被代理服务指定 |
说明:
- 子系统编码:为子系统的唯一标识,全局唯一。
- 节点名称:节点名称由中间件服务自动维护,用户无需关注。
- 服务名称:在应用管理中进行注册,每个服务可进行独立注册管理。
- 代理节点名称:是通过中间件代理服务将被代理的服务注册到中间件中节点的唯一标识,代理节点名称由配置文件驱动,规则包含代理服务前缀proxy-,后面为子系统编码和IP地址,最后面为进程号。
- 代理服务名称:代理节点中代理服务的唯一标识。
- 代理服务端口默认: 127.0.0.1:8080,特殊情况根据配置驱动修改。
- 被代理服务名称:由被代理服务指定,由数字、字母、中横线或下划线组成,首字母不能为数字,名称长度不超过32字符。
服务路由规则
Restful、WebSocket
接入中间件的服务,通过网关访问服务时的请求路由必须满足格式如下:
-
http://{ip}:{port}/{网关名称}/{服务名称}/{接口地址}
-
ip:中间件网关服务的ip
-
port:中间件网关服务的端口
-
网关名称:默认为api
-
服务名称:要调用的服务名称,同上方规则描述中服务名称。
-
接口地址:要调用的服务的接口名称,地址全路径。
以调用实时数据服务db-rtdata的接口/v1/rtdata/readTagValues为例,如下所示:
Post http://localhost:3000/api/db-rtdata/v1/rtdata/readTagValues
body:{tags:”100:AI001.AV”}
- GraphQL
接入中间件的GraphQL服务,通过网关访问服务时的请求路由必须满足格式如下:
http://ip:port/网关名称/服务名称/graphql
以调用information信息服务为例,如下所示:
http://localhost:3000/api/information/graphql
- 代理服务端口用规则
中间件架构的实现中会默认占用一些端口,另外包含了网络传输的一些固定端口外,其他都可以使用。
【推荐】默认8080端口。
-
请求限制
- 服务限制
多实例部署,服务应为“无状态的限制”,不支持有状态服务部署多实例。
- 接入中间件的服务为多实例部署时,中间件支持多实例之间的自动负载均衡,但不保证供多实例服务后台数据的一致性。
- 通过中间件代理接入的主从服务模式下,中间件代理服务只调用主从模式的client,由client负责调用可用的服务和进行主从调度。双活
- 通过中间件代理接入的双活、多活服务模式,同多实例部署的“无状态”服务。
- 访问/请求频率限制
单服务下中间件网关支持的访问/请求频率约为200 TPS、400 RPS(1个请求调2个其他服务接口)(待定),中间件提供限流配置,用以限制请求率的配置。
配置项见附录请求限制章节。
- 内容大小限制
中间件提供报文大小传输设置,根据实际情况限制报文大小,默认单个请求包body限制为1M(性能测试基线)。
配置项见附录请求限制章节。
- 文件传输规则
中间件仅提供对HTTP协议的文件上传下载支持,支持文件断点续传(具体实现方式请参见DB文件服务断点续传相关功能描述)。
-
性能说明
- 性能指标(待定)
基准:
- OS: Ubuntu 22.04 x64
- Node: 8.11.0
- v8: 6.2.414.50
- CPU: Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz × 8
- 内存: 16 GB
- 网卡: 千兆
- **权限规则:**1万用户1千角色(鉴权需15ms) ,10万用户1万角色(鉴权需100ms)
SDK接入:
-
普通接口经中间件转发时
- 同节点内本地调用延迟小于20 - 120ms
(中间件5-20 ms(1M-2M)+ 鉴权15-100ms)
- 不同节点远程调用延迟小于25 - 125ms
(中间件10-30 ms(1M-2M)+ 鉴权15-100ms)
- 大数据量接口经中间件转发延迟小于总请求时间的1/3(中间件+鉴权)
- 代理请求并发量≤100
代理接入:
-
普通接口经中间件转发时
- 同节点内本地调用延迟小于26 - 141ms
(中间件11-41 ms(1M-2M)+ 鉴权15-100ms)
- 不同节点远程调用延迟小于36 - 151ms
(中间件21-51 ms(1M-2M)+ 鉴权15-100ms)
- 大数据量接口经中间件转发延迟小于总请求时间的1/3(序列化+鉴权)
- 代理请求并发量≤100
- 中间件代理服务重启恢复不超过2分钟
-
接口规范
-
中间件(代理)服务提供接口
- 获取服务列表
-
- 接口功能
从平台中间件中获取服务列表,查询服务的基本信息。
- 接口地址
URL | {Server}/mw/services |
---|---|
http请求方式 | get |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
name | String | 否 | 服务名称 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
name | String | 是 | 服务名称 |
fullName | String | 是 | 服务名称(全) |
available | String | 是 | 服务状态 |
local | String | 是 | 是否本地服务 |
Nodes | Arrays | 是 | 所在节点 |
settings | Object | 是 | 服务的配置信息 |
version | String | 是 | 服务版本 |
- 示例介绍
- 获取动作列表
- 接口功能
从平台中间件中获取服务的动作列表,含请求路径和参数信息。
- 接口地址
URL | {Server}/mw/actions |
---|---|
http请求方式 | get |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
service | String | 是 | 服务名称 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
name | String | 是 | 工作名称 |
available | boolean | 是 | true 或者false |
action | Arrays | 是 | 动作定义 |
params | Object | 是 | 对象参数 |
cache | Object | 是 | 缓存配置 |
fields | String | 是 | 属性名称 |
type | String | 是 | 属性类型,比如string、object |
- 示例介绍
- 获取事件列表
- 接口功能
从平台中间件中获取服务的可订阅事件列表。
- 接口地址
URL | {Server}/mw/events |
---|---|
http请求方式 | get |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
service | String | 是 | 服务名称 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
name | String | 是 | 事件ID |
group | String | 是 | 事件组,服务名称 |
available | String | 是 | 是否可用 |
event | String | 是 | 事件 |
- 示例介绍
- 同步调用
- 接口功能
从平台中间件中调用其他服务的动作,等同于远程调用一个服务的接口。
- 接口地址
URL | {Server}/mw/call |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
service | String | 是 | 应用名称 |
action | String | 是 | 动作 |
method | String | 否 | 默认Get |
header | String | 是 | 请求头 |
param | String | 是 | url请求参数 |
body | String | 是 | body体请求参数 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 返回码 |
mssage | String | 是 | 返回消息 |
result | Object | 是 | 返回数据 |
- 示例介绍
- 异步事件通知确认
- 接口功能
应用通过此接口进行确认事件的消费处理状态,确认后实践将被标记为相应标记。
- 接口地址
URL | {Server}/mw/event/confirm |
---|---|
http请求方式 | get |
- 参数
- 请求参数说明
aans | 类型 | 必填 | 描述 |
---|---|---|---|
event | String | 是 | 事件名称 |
eventId | String | 是 | 事件ID |
success | Boolean | 否 | 是否成功,默认是 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 返回码 |
mssage | String | 是 | 返回消息 |
- 示例介绍
- 异步事件查询
- 接口功能
应用用于接收通过中间件订阅的其他服务的事件,如接收人员删除事件、设备上线事件等。
- 接口地址
URL | {Server}/mw/event |
---|---|
http请求方式 | get |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
eventId | String | 否 | 事件ID |
success | Boolean | 否 | 是否成功 |
group | String | 否 | 消息分组 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 返回码,200成功,其他失败 |
message | String | 否 | 返回消息 |
data | object | 否 | 数据 |
success | Boolean | 是 | 是否成功 |
eventId | String | 是 | 事件ID |
- 示例介绍
- 日志记录
- 接口功能
用于将应用发生的日志事件进行记录。
- 接口地址
URL | {Server}/mw/v1/event/write |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
属性名称 | 类型 | 必填 | 说明 |
---|---|---|---|
message | Object | 是 | 事件写入对象 |
- 请求示例
-
执行结果
-
返回值参数说明
属性名称 | 类型 | 必填 | 说明 |
---|---|---|---|
message | String | 是 | 执行描述(新增成功/失败) |
status | Int | 是 | 状态 |
timestamp | Long | 是 | 时间戳 |
- 示例介绍
- 日志查询
- 接口功能
从历史库查询满足条件的事件。
- 接口地址
URL | {Server}/mw/v1 /event/find |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
属性名称 | 类型 | 必填 | 说明 |
---|---|---|---|
eventId | String | 是 | 事件ID |
beginTime | String | 是 | 起始时刻 |
endTime | String | 否 | 结束时刻 |
columns | String[] | 否 | 查询字段,不传或为空则默认查询所有字段 |
- 请求示例
-
执行结果
-
返回值参数说明
属性名称 | 类型 | 必填 | 说明 |
---|---|---|---|
message | String | 是 | 执行描述(查询成功/失败) |
status | Int | 是 | 状态 |
timestamp | Long | 是 | 时间戳 |
results | Object[] | 是 | 查询结果 |
- 示例介绍
- 审计日志记录
- 接口功能
将发生审计事件推送到服务进行存储。
- 接口地址
URL | {Server}/mw/v1/audit/write |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
属性名称 | 类型 | 必填 | 说明 |
---|---|---|---|
optType | Int | 是 | 操作 |
resultType | Int | 是 | 结果类型 |
content | string | 是 | 操作内容 |
sourceNode | string | 是 | 源节点 |
namespace | string | 是 | 名空间 |
severity | string | 是 | 严重程度 |
- 请求示例
-
执行结果
-
返回值参数说明
属性名称 | 类型 | 说明 |
---|---|---|
message | String | 执行描述(查询成功/失败) |
status | Int | 状态 |
timestamp | Long | 时间戳 |
results | Object[] | 查询结果 |
- 示例介绍
- 审计日志查询
- 接口功能
从历史库查询满足条件的审计事件。
- 接口地址
URL | {Server}/mw/v1/audit/find |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
属性名称 | 类型 | 必填 | 说明 |
---|---|---|---|
startTime | Long | 是 | 开始时间,毫秒时间戳,如果startTime大于endTime表示降序查询 |
endTime | Long | 是 | 结束时间,毫秒时间戳 |
maxSize | Int | 最大返回条数,默认为10条 | |
continuationPoint | string | 翻页续传点 | |
prevQuery | string | 是否为上一页查询,默认为false,上一页查询时为true | |
fields | String[] | 查询结果返回的事件字段,,不传默认5.1.3章节中的字段 | |
filter | Filter | 查询结果返回的事件字段,,不传默认5.1.3章节中的字段 | |
filter.op | String | 子过滤器之间的逻辑运算符,支持and,or,默认为and | |
filter.expr | FilterExpr[] | 条件表达式集合,每个表达式之间是and关系,该参数和filter.subFilter不能同时为空。 | |
filter.expr.field | String | 条件表达式字段,如id | |
filter.expr.operator | String | 表达式操作符,支持如下操作符: [“Equal”、,“NotEqual”, “Between”,“NotBetween”,“Like”, “GreaterThan”,“GreaterThanOrEqual”, “LessThan”,“LessThanOrEqual”,“InList”, “NotInList”,“Match”,“MatchPhrase”、 “Exists”,“NotExists” 说明:m**essage**字段应使用**MatchPhrase**进行模糊查询。 | |
filter.expr.value | Object[] | 字段的值 | |
filter.subFilter | Filter[] | 子过滤器。 |
- 请求示例
-
执行结果
-
返回值参数说明
类型 | 说明 | |
---|---|---|
code | int | 状态码。 |
message | string | 提示信息。 |
result | Object | 结果对象 |
- 示例介绍
- 消息通知发送
- 接口功能
应用调用中间件消息通知服务,进行消息发送,如站内信、邮件等。
- 接口地址
URL | {Server}/mw/notice/send |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
sender | String | 是 | 发送主体 |
title | String | 是 | 消息头 |
mssage | String | 是 | 消息 |
attachments | String | 否 | 附件,DB文件服务中文件的ID数组,英文逗号分隔 |
params | String | 否 | JSON格式标准的参数,与模板配合使用 |
template | String | 否 | 模板ID |
channel | String | 否 | 发送通道,如不传默认模板配置的通道,传入使用覆盖通道。 site:站内信 sms:手机短信 mail:邮件 wechat:微信 dingtalk:钉钉 |
users | String | 否 | 用户,多个用英文逗号分隔,与用户组二选一必输 |
groups | String | 否 | 用户组,多个用英文逗号分隔,与用户二选一必输 |
reply | bool | 否 | 需要回执,默认false,回执功能需使用模板,传入模板ID |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 否 | 返回码 |
mssage | String | 否 | 返回消息 |
- 示例介绍
-
被代理服务提供
- 服务健康检查接口
- 接口功能
中间件通过服务健康监测接口确认服务是否处于正常状态,中间件将会在服务运行期间定期调用此接口。
- 接口地址
URL | {Server}/mw/server/health |
---|---|
http请求方式 | get |
- 参数
- 请求参数说明
无
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 返回码 |
mssage | String | 是 | 返回消息 |
- 示例介绍
- 异步事件通知
- 接口功能
应用用于接收通过中间件订阅的其他服务的事件,如接收人员删除事件、设备上线事件等。
- 接口地址
URL | {Server}/mw/event/notification |
---|---|
http请求方式 | post |
- 参数
- 请求参数说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
event | String | 是 | 事件名称 |
eventId | String | 是 | 事件ID |
data | object | 是 | 数据 |
- 返回值参数说明
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
code | String | 是 | 返回码,200成功,其他失败 |
mssage | String | 是 | 返回消息 |
- 示例介绍
-
安全说明
-
接入安全
中间件对需要接入中间件的服务提供接入认证,以保证接入中间件的服务是安全可控的,不对传输通道进行加密。
应用在接入前需通过平台生成可信密钥,将密钥文件放置在指定目录,或通过中间件配置文件指定,在中间件服务启动时,将完成服务接入校验。
- 访问安全
- 服务及接口访问安全
中间件集群内部,可直接访问集群中所有服务及服务中的API。
通过网关访问中间件集群中的服务,需通过中间件权限验证模块,拥有相关权限的用户方可访问对应服务中的API。
API权限配置及操作过程,请参见《智能软件平台 XMagital 认证授权&单点登录接入规范》中API管理、授权相关章节。
-
数据访问安全
-
中间件集群内部,可直接访问集群中所有服务及服务中的数据。
-
通过网关访问中间件集群中的服务,需通过中间件权限验证模块,拥有相关权限的用户方可访问对应服务中的数据。
-
加解密算法
-
应用层加解密
-
中间件去中心化应用注册发现互信证书或其它校验措施。
-
MW消息离线存储或导出数据文件存储时可选择是否解密。
-
MW消息推送时消息体加解密。
-
传输层加解密
-
浏览器与中间件网关之间加解密,基于HTTP协议。
-
浏览器与中间件网关之间加解密,基于WebSocket协议。
-
传输层加密支持网关服务,使用如 nginx和traefik实现。
-
附录
- hsm-mw.config.json
以权限为例,更名为hsm-mw.auth.config.json,中间件服务启动后将自动加载相应目录下的配置。
{
code: "mw-ahtu",
name: "中间件-权限服务",
settings: {
// 此处写配置内容
// routes、rateLimit、cacher等
}
}
下方将详细说明{}内的配置项内容
- 请求限制
{
rateLimit: {
// How long to keep record of requests in memory (in milliseconds).
// Defaults to 60000 (1 min)
window: 60 \* 1000,
// Max number of requests during window. Defaults to 30
limit: 30,
// Set rate limit headers to response. Defaults to false
headers: true,
// Function used to generate keys. Defaults to:
key: (req) => {
return req.headers\["x-forwarded-for"\] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
},
}
}
{
routes: [{
path: "/API",
// Use bodyparser modules
bodyParsers: {
json: { limit: "2MB" },
urlencoded: { extended: true, limit: "2MB" }
}
}]
}
- 缓存配置
内存缓存方式
{
cacher: {
type: "Memory",
options: {
ttl: 30 // Set Time-to-live to 30sec. Disabled: 0 or null
clone: true // Deep-clone the returned value
}
}
}
Redis缓存方式
{
cacher: {
type: "Redis",
options: {
// Prefix for keys
prefix: "MOL",
// set Time-to-live to 30sec.
ttl: 30,
// Turns Redis client monitoring on.
monitor: false
// Redis settings
redis: {
host: "redis-Server",
port: 6379,
password: "1234",
db: 0
}
}
}
}
- 异步事件订阅配置
{
events: {
// Subscribe to \`user.created\` event
"user.created",
// Subscribe to all \`user\` events, e.g. "user.created", or "user.removed"
"user.\*"
}
}
- 代理服务配置文件
代理配置, 以基础服务的实时数据服务为例,重名名为hsm-mw.db-rtdata.config.json,
{
code: "db-rtdata",
name: "数据\-模块名称",
settings: {
restAPIs: "",
websocketAPIs: [
" "
],
GraphQL: "",
//其他配置同中间件服务配置
}
}
- JAVA SDK 代码(待定)
启动类Application启动类添加ServiceBroker
@Bean(initMethod = "start", destroyMethod = "stop")
public ServiceBroker getServiceBroker() {
ServiceBrokerConfig config = new ServiceBrokerConfig();
config.setNodeID("demo1");
config.setTransporter(new NatsTransporter("nats://localhost:4222"));
config.setStrategyFactory(new CpuUsageStrategyFactory());
config.setCacher(new MemoryCacher());
return new ServiceBroker(config);
}
@Bean
public SpringRegistrator getSpringRegistrator() {
return new SpringRegistrator();
}
在service中注入ServiceBroker,使用broker的call方法调用已经注册的action,在demo代码中有引用示例。