钉钉官方Stream模式介绍
以下是钉钉开放平台官网对于Stream模式的介绍说明,其原理主要就是使用了基于WS的反向连接技术来注册回调,对比传统的开放平台公网回调以实现基于内访外NAT下所谓的“五零”即不需要开放公网域名 or IP、不需要开通外访内防火墙策略等,详细参考👇
open.dingtalk.com/document/re…
Stream模式原理(内容来自钉钉开放平台)
在 Stream 模式下,开发者的应用程序通过集成 SDK 的方式与钉钉开放平台建立一条 WebSocket 连接,建立连接过程中开放平台将对连接进行鉴权。当有卡片回调发生时,开放平台将通过 WebSocket 连接将数据通知到开发者的应用程序。开发者的应用程序可以接收到这些数据并进行相应处理,从而实现与钉钉开放平台的实时通信,参考下图所示
Stream模式优势(内容来自钉钉开放平台)
在钉钉开放平台向应用程序发送请求的场景中,大部分都是采用 Webhook (注册公网 HTTPS 服务)的方式,包括卡片回调,使用 Webhook 方式开发过程中会遇到较多的问题,包括
-
申请公网域名和TLS证书
-
申请公网IP并部署接入网关
-
部署应用防火墙并配置白名单
-
独立处理请求的鉴权,以及加解密处理
-
搭建内网穿透环境进行本地开发调试
针对以上问题,Stream 模式将为开发者提供"五零"接入体验,将1~2周的接入开发周期降低到5分钟,包括
-
零公网IP
不需要依赖公网IP或域名,也不需要暴露公网IP,减少了公网暴露服务的安全风险并降低了开发门槛。
-
零加解密/签名/TLS证书管理
使用应用身份对连接进行鉴权,通过反向连接的方式与钉钉开放平台建立TLS加密连接,提供了快速、安全的通信体验。
-
零防火墙白名单
Stream 模式下开发者无需向公网开放提供任何服务端口,无需部署防火墙和配置白名单。
-
零网关部署
通过反向连接的方式建立通道,开发者只需保证运行环境具备公网访问能力即可,无需部署网关。
-
零内网穿透
开发者无需在本地搭建内网穿透工具,通过 Stream 模式在本地开发环境中即可接收卡片回调。
官方demo案例 debug 调试研究
官方 demo 地址:github.com/open-dingta…
下载后配置钉钉开放平台应用凭证(appKey appSecret)后可直接运行
直接从日志看,只能看到建立WS连接的结果日志,尝试 debug 探究底层每一步流程
start websocket connection, uri=wss://wss-open-connection.dingtalk.com:443/connect
connection is established, connectionId=0700f61d-548b-11ef-a6c8-aad0bc984849
详细 debug 跟随
请求打开连接
com.dingtalk.open.app.api.OpenDingTalkStreamClient#start

执行打开连接任务
com.dingtalk.open.app.stream.network.core.DefaultSessionPool.ConnectionTask

获取WS连接点 Endpoint
com.dingtalk.open.app.api.OpenDingTalkStreamClient#openConnection

建立WS连接
com.dingtalk.open.app.stream.network.ws.WebsocketTransportConnector#connect

com.dingtalk.open.app.stream.network.core.DefaultSessionPool.ConnectionTask

建立连接,connectionId=e582087b-0ea4-11ef-89bf-aa5e3c11bd53,标记本次连接
总结
所谓“Stream模式 反向连接” 就是分为2步:👇
- 1、客户端主动请求钉钉服务端获取 endpoint 和 ticket
- 2、客户端得到 endpoint 和 ticket 后再去根据 endpoint 和 ticket WS建连