工业数据平台需要对外暴露数据和能力,API 是核心对外接口。一个设计良好的 API 体系不仅直接决定上层应用(MES、SCADA、AI 分析平台)的开发效率,也影响平台内部微服务之间的通信效率。工业场景对 API 的有特殊要求——实时性(某些数据订阅需要 100ms 以内的延迟)、带宽效率(高频时序数据的传输不能浪费带宽)、生态兼容性(需要同时支持老旧 SCADA 系统和新一代 AI 应用)。这些要求使得 API 类型的选型和设计决策比通用互联网场景更复杂。
API 类型与选型依据
工业场景的 API 需求可以归纳为四类:实时数据查询(拉取某段时间的时序数据)、实时数据订阅(持续推送设备状态变化)、设备控制指令(向 PLC 下发参数调整指令)、以及管理类操作(创建设备、配置规则、查询告警列表)。不同需求适合不同的 API 技术。
四种主流 API 类型的技术特性和适用场景:
API 类型 | 通信模式 | 实时性 | 带宽效率 | 生态兼容 | 典型场景 |
RESTful | 请求-响应 | 秒级(典型) | 低(JSON + HTTP 头开销) | 极高 | 管理操作、低频查询 |
gRPC | 请求-响应 + 流式 | 毫秒级 | 高(Protobuf 二进制) | 中(需生成代码) | 高频数据拉取、微服务通信 |
WebSocket | 全双工长连接 | 毫秒级 | 中(帧头开销小) | 高(浏览器原生支持) | 实时数据订阅、告警推送 |
GraphQL | 请求-响应(灵活查询) | 秒级 | 中(过度获取风险) | 高 | 灵活的数据查询(前端需求变化快) |
选型的核心依据有三个维度。第一是实时性要求:如果是秒级的管理操作或离线数据分析,RESTful 足够;如果需要毫秒级的高频数据拉取,gRPC 更合适;如果需要持续推送的实时订阅,WebSocket 或 gRPC Server Streaming 是首选。
第二是带宽和数据量:高频时序数据(每秒数千个点,持续数小时)如果用 RESTful + JSON 传输,带宽开销是 gRPC + Protobuf 的 2-3 倍。Protobuf 的序列化体积小、解析速度快,适合大规模时序数据的高效传输。RESTful 的优势在生态——几乎所有编程语言都有 HTTP 客户端,对接成本低。
第三是消费方的技术栈:传统 SCADA 系统可能只支持 HTTP RESTful 接口,新一代 AI 应用(用 Python/Go/Node.js)可以同时支持 gRPC 和 WebSocket。一个大型工业数据平台往往需要同时提供多种 API——对外部应用暴露 RESTful 和 WebSocket(生态兼容),内部微服务之间用 gRPC(高性能)。
RESTful 资源设计规范
RESTful API 是工业数据平台的门面,需要严格遵循 REST 架构风格,让消费方可以通过 URL 直接理解接口含义。资源设计需要覆盖四类核心实体:设备、测点、告警、工单。
设备资源的 URL 设计遵循"层级 + 集合/单体"模式:
GET /api/v1/devices # 列出所有设备
GET /api/v1/devices/{device_id} # 获取设备详情
GET /api/v1/devices/{device_id}/tags # 获取该设备的所有测点
GET /api/v1/devices?type=motor&status=online # 按类型和状态筛选
POST /api/v1/devices # 创建设备
PUT /api/v1/devices/{device_id} # 更新设备
DELETE /api/v1/devices/{device_id} # 删除设备
测点数据的查询接口需要支持时间范围和聚合参数——这是工业场景特有的需求,标准 RESTful 没有直接对应的设计模式。推荐用查询参数扩展:
GET /api/v1/devices/{device_id}/tags/{tag_id}/data
?start=2024-01-01T00:00:00Z
&end=2024-01-02T00:00:00Z
&interval=5s # 聚合间隔,返回降采样后的数据
&aggregations=avg,max,min # 需要的聚合类型
&limit=1000 # 最大返回点数
响应体用紧凑的数组格式减少传输量,同时保留自描述能力:
{
"device_id": "motor_001",
"tag_id": "temperature",
"unit": "°C",
"aggregation": {
"interval": "5s",
"functions": ["avg", "max", "min"]
},
"data": [
{"ts": 1704067200000, "avg": 78.5, "max": 82.1, "min": 75.2},
{"ts": 1704067205000, "avg": 79.2, "max": 83.0, "min": 76.1}
]
}
实时数据订阅
RESTful 的请求-响应模式不适合实时推送场景。工业数据平台的实时订阅有两条技术路线:WebSocket 和 gRPC Server Streaming。
WebSocket 是最通用的选择——浏览器原生支持,几乎所有语言都有成熟的客户端库。WebSocket 连接建立后,客户端发送订阅请求(指定订阅哪些设备的哪些测点),服务端在数据更新时主动推送。工业场景下 WebSocket 的稳定性是关键——车间网络可能不稳定,客户端需要自动重连机制,服务端需要记录每个订阅者的最后接收位置,重连后从断点补发数据。
gRPC Server Streaming 在带宽效率和类型安全上更优。Protobuf 消息体比 WebSocket 的 JSON 消息体小 40-60%,且有静态类型检查避免运行时类型错误。但 gRPC 的生态兼容性略差——某些老旧系统可能不支持 gRPC。实际落地中可以同时提供两种订阅接口:WebSocket 给浏览器和老旧系统,gRPC 给内部服务和新一代应用。
// gRPC 实时订阅接口定义
service DataSubscriptionService {
rpc Subscribe(SubscriptionRequest) returns (stream SubscriptionResponse);
}
message SubscriptionRequest {
repeated string device_ids = 1;
repeated string tag_ids = 2;
uint32 max_sample_interval_ms = 3;
}
message SubscriptionResponse {
string device_id = 1;
string tag_id = 2;
int64 timestamp = 3;
double value = 4;
uint32 quality = 5; // 数据质量码:0=正常, 1=异常, 2=无效
}
版本管理与兼容性
API 的版本管理需要两个层面的策略:资源级版本和请求级版本。
资源级版本通过 URL 路径区分:/api/v1/devices、/api/v2/devices。大版本变更(资源结构变化、字段移除、响应格式重排)才升级大版本号,小版本升级(新增字段、新增查询参数)通过响应体中的 api_version 字段标识。
兼容性策略的核心是"永不破坏"——对于已经发布的大版本,不能移除字段、不能改变字段类型、不能改变字段语义。可以添加新字段(消费方忽略不认识的字段),但不能删除旧字段(旧消费方仍然需要这些字段)。gRPC 的 Protobuf 版本管理有更严格的约束:字段编号是不可变标识,字段类型一旦设定不能变更,废弃字段用 reserved 标记。
认证授权
工业数据平台的 API 认证授权需要覆盖三类消费方:人类用户(通过 MES 前端登录)、服务账户(SCADA 系统、第三方 AI 平台)、以及内部微服务。
人类用户用 OAuth2 Authorization Code Flow——前端跳转到统一认证平台登录,拿到 Authorization Code 后交换 Access Token。Access Token 用 JWT 格式,包含用户 ID、角色、过期时间、权限范围。
服务账户用 OAuth2 Client Credentials Flow——提前分配 Client ID 和 Client Secret,服务方用这对凭证直接换取 Access Token。服务账户的权限范围需要精确配置——一个 SCADA 客户端只能访问授权范围内的设备测点,不能读取管理类数据。
内部微服务之间的通信通常用 mTLS(双向 TLS)+ 服务间 API Key 的组合——mTLS 验证服务身份,API Key 验证服务权限。内部通信的延迟敏感,不适合每次请求都做 OAuth2 Token 交换,所以 API Key 有较长的有效期(1-2 小时),减少 Token 交换频率。
API 文档与 SDK
好的 API 文档是降低消费方接入成本的关键。OpenAPI(Swagger)规范是工业界的事实标准——RESTful API 用 OpenAPI 3.0 描述,gRPC API 用 Protocol Buffer 文件(.proto)自带文档。
文档需要自动生成,避免手写文档与实际接口不一致。OpenAPI 规范可以从代码的注解或装饰器中自动提取(FastAPI、SpringDoc、gin-swagger 都支持),gRPC 的 proto 文件本身就是最好的接口文档。SDK 的自动生成同样重要——OpenAPI Generator 和 gRPC Tools 可以从规范文件自动生成各语言(Python、Go、Java、JavaScript)的客户端 SDK,让消费方无需手写 HTTP 请求代码。
结语
工业数据平台的 API 设计是一个系统工程——需要平衡 RESTful 的生态兼容性和 gRPC 的高性能,WebSocket 的实时性和 Protobuf 的带宽效率,同时满足认证授权、版本管理、自动文档等工程化需求。没有一种 API 类型能覆盖所有场景,正确的做法是建立一个分层的 API 体系:RESTful 对外暴露管理和低频查询,WebSocket 和 gRPC Streaming 提供实时数据订阅,内部微服务用 gRPC 保证高性能。这个体系的核心设计原则是"以消费方为中心"——不是站在平台的角度设计接口,而是站在 MES、SCADA、AI 应用等不同消费方的角度,让每个消费方都能以最低的接入成本获得自己需要的数据。API 体系的设计质量直接影响工业互联网中上层应用的开发效率和迭代速度,需要在平台建设早期就给予重视。

























