
# 使用WebSocket协议的方式访问在线服务
#### 背景说明
WebSocket是一种网络传输协议，可在单个TCP连接上进行全双工通信，位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455，后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。
WebSocket使得客户端和服务器之间的数据交换变得更加简单，允许服务端主动向客户端推送数据。在WebSocket API中，浏览器和服务器只需要完成一次握手，两者之间就可以建立持久性的连接，并进行双向数据传输。适用于实时通信、在线游戏等需要双向实时通信的场景。
WebSocket适用于需要在ModelArts平台上部署在线服务的场景，特别是当需要使用自定义镜像导入AI模型时。需要注意的是，WebSocket仅支持在线服务，并且在ModelArts平台上使用时，协议会被转换为WSS，支持单向认证。
使用WebSocket协议访问在线服务有以下特点：
- 持久连接：WebSocket在客户端和服务器之间建立持久连接，无需像HTTP那样频繁建立和断开连接，减少了连接建立的开销。
- 双向数据传输：支持双向通信，允许服务器主动向客户端推送数据，而不仅是响应客户端请求。
- 减少延迟和带宽消耗：由于连接保持打开状态，数据可以实时传输，减少了延迟，并且减少了不必要的HTTP请求，节省了带宽。
 
#### 前提条件
- 在线服务部署时需选择"升级为WebSocket"。
- 在线服务中的模型导入选择的镜像需支持WebSocket协议。
 
#### 约束与限制
- WebSocket协议只支持部署在线服务。
- 只支持自定义镜像导入模型部署的在线服务。
- 调用API访问在线服务时，对预测请求体大小和预测时间有限制：
  - 请求体的大小不超过12MB，超过后请求会被拦截。
  
  - 因APIG（API网关）限制，平台每次请求预测的时间不超过40秒。
   
 
#### WebSocket在线服务调用
WebSocket协议本身不提供额外的认证方式。不管自定义镜像里面是ws还是wss，经过ModelArts平台出去的WebSocket协议都是wss的。同时wss只支持客户端对服务端的单向认证，不支持服务端对客户端的双向认证。
可以使用ModelArts提供的以下认证方式：
- [token认证](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0023.html)
- [AK/SK](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0024.html)
- [APP认证](https://support.huaweicloud.com/usermanual-standard-modelarts/inference-modelarts-0025.html)
WebSocket服务调用步骤如下（以图形界面的软件Postman进行预测，token认证为例）：
1. [WebSocket连接的建立]
2. [WebSocket客户端和服务端双向传输数据]

1. WebSocket连接的建立
   
   1. 打开Postman（需选择8.5 以上版本，以10.12.0为例）工具，单击左上角![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000001986022829.png)，选择"File\>New"，弹出新建对话框，选择"WebSocket Request"（当前为beta版本）功能：
      图1选择WebSocket Request功能   
      ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000001986182713.png "点击放大") 
   
   2. 在新建的窗口中填入WebSocket连接信息： 左上角选择Raw，不要选择Socket.IO（一种WebSocket实现，要求客户端跟服务端都要基于Socket.IO），地址栏中填入从服务详情页"调用指南"页签中获取"API接口调用公网地址"后面的地址。如果自定义镜像中有更细粒度的地址，则在地址后面追加该URL。如果有queryString，那么在params栏中添加参数。在header中添加认证信息（不同认证方式有不同header，跟https的推理服务相同）。选择单击右上的connect按钮，建立WebSocket连接。
      图2获取API接口调用公网地址   
      ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000001952663438.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/note_3.0-zh-cn.png)
      - 如果信息正确，右下角连接状态处会显示：CONNECTED；
      
      - 如果无法建立连接，如果是401状态码，检查认证信息；
      
      - 如果显示WRONG_VERSION_NUMBER等关键字，检查自定义镜像的端口和ws跟wss的配置是否正确。
       
      连接成功后结果如下：
      图3连接成功   
      ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000001986022833.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-standard-modelarts/public_sys-resources/notice_3.0-zh-cn.png)
      优先验证自定义镜像提供的WebSocket服务的情况，不同的工具实现的WebSocket服务会有不同，可能出现连接建立后维持不住，可能出现请求一次后连接就中断需要重新连接的情况，ModelArts平台只保证，未上ModelArts前自定义镜像的WebSocket的形态跟上了ModelArts平台后的WebSocket形态相同（除了地址跟认证方式不同）。
      
   
   
   
   
2. WebSocket客户端和服务端双向传输数据
   
   连接建立后，WebSocket使用TCP完成全双工通信。WebSocket的客户端可以往服务端发送数据，客户端有不同的实现，同一种语言也存在不同的lib包的实现，这里不考虑实现的不同种类。
   客户端发送的内容在协议的角度不限定格式，Postman支持Text/Json/XML/HTML/Binary，以text为例，在输入框中输入要发送的文本，单击右侧中部的Send按钮即可将请求发往服务端，当文本内容过长，可能会导致postman工具卡住。
   图4发送数据   
   ![](https://support.huaweicloud.com/usermanual-standard-modelarts/figure/zh-cn_image_0000001952663434.png "点击放大")
   
   
 
