
# 使用WebSocket协议的方式访问在线服务
#### 背景说明
在实时通信和在线游戏中，传统的HTTP协议由于需要频繁建立和断开连接，导致延迟高和带宽消耗大。WebSocket是一种网络传输协议，使得客户端和服务器之间的数据交换变得更加简单，允许服务端主动向客户端推送数据。在WebSocket API中，浏览器和服务器只需要完成一次握手，两者之间就可以建立持久性的连接，并进行双向数据传输。适用于实时通信、在线游戏等需要双向实时通信的场景。
WebSocket适用于需要在ModelArts平台上部署在线服务的场景。需要注意的是，WebSocket仅支持在线服务，并且在ModelArts平台上使用时，协议会被转换为WSS，支持单向认证。
使用WebSocket协议访问在线服务有以下特点：
- 持久连接：WebSocket在客户端和服务器之间建立持久连接，无需像HTTP那样频繁建立和断开连接，减少了连接建立的开销。
- 双向数据传输：支持双向通信，允许服务器主动向客户端推送数据，而不仅是响应客户端请求。
- 减少延迟和带宽消耗：由于连接保持打开状态，数据可以实时传输，减少了延迟，并且减少了不必要的HTTP请求，节省了带宽。
 
#### 前提条件
- [配置服务信息](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0016.html#ZH-CN_TOPIC_0000002555517990__section14135916115214)时，在网络配置中服务协议需选择"WSS"或"WS"。
- 在线服务中的模型导入选择的镜像需支持WebSocket协议。
 
#### 约束与限制
- WebSocket协议只支持部署在线服务。
- 若服务端返回的单条消息超过 64KB，系统将自动按协议规范将其分割为多个数据帧传输（单帧有效载荷不超过 64KB）。
- 调用API访问在线服务时，对预测请求体大小和预测时间有限制：
  - 请求体的大小不超过服务运行配置中的请求大小限制，超过后请求会被拦截。
  
  - 平台每次请求预测的时间不超过服务运行配置中的请求超时时间（发生数据传输时将重新计算超时时间）。
   
 
#### 获取认证信息、预测文件的本地路径、在线服务的调用地址
- **认证信息**
  WebSocket协议本身不提供额外的认证方式。WSS只支持客户端对服务端的单向认证，不支持服务端对客户端的双向认证。
  根据服务部署时选择的认证方式获取认证信息。无认证方式无需获取认证信息。
  - [Token认证](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0007.html#ZH-CN_TOPIC_0000002543191169__section185861327115517)
  
  - [API KEY认证](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0008.html#ZH-CN_TOPIC_0000002511711226__zh-cn_topic_0165025308_section134041911727)
  
  - [无认证](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0006.html)
  
  
  本章节以API KEY认证为例，需要获取API KEY内容：在调用服务前，需要**[创建API KEY](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0008.html#ZH-CN_TOPIC_0000002511711226__li89844188516)** 且**该API KEY[已绑定待访问的在线服务](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0008.html#ZH-CN_TOPIC_0000002511711226__li166441811135317)。**打开创建API KEY后自动下载的csv文件，打开文件后可看到api_key字段就是具体的API KEY内容。
  
- **预测文件的本地路径**
  预测文件的本地路径既可使用绝对路径（如Windows格式"D:/test.png"，Linux格式"/opt/data/test.png"），也可以使用相对路径（如"./test.png"）。
  
- **在线服务的调用地址**
  在线服务的调用地址和输入参数信息，可以在控制台的"模型推理 \> 在线推理"，单击指定在线服务，在服务"基本信息"页签的"调用信息"获取。
  "调用URL"即在线服务的调用地址。当模型配置文件中apis定义了路径，调用地址后需拼接自定义路径。如："{在线服务的调用地址}/v1/chat/completions"。
  
  
  
 
#### 认证在线服务
WebSocket协议本身不提供额外的认证方式。WSS只支持客户端对服务端的单向认证，不支持服务端对客户端的双向认证。
根据服务部署时选择的认证方式调用在线服务：
- [通过IAM Token认证的方式访问在线服务](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0007.html)
- [通过无认证方式访问在线服务](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0006.html)
- [通过API KEY认证访问在线服务](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0008.html)
 
#### 建立WebSocket连接
1. 打开Postman工具（需选择8.5 以上版本，以10.12.0为例），单击左上角![](https://support.huaweicloud.com/inference-modelarts/figure/zh-cn_image_0000002511551286.png)，选择"File\>New"，弹出新建对话框，选择"WebSocket Request"（当前为beta版本）功能：
   图1选择WebSocket Request功能   
   ![](https://support.huaweicloud.com/inference-modelarts/figure/zh-cn_image_0000002511711272.png) 
2. 在新建的窗口中填入WebSocket连接信息： 左上角选择Raw，不要选择Socket.IO（一种WebSocket实现，要求客户端跟服务端都要基于Socket.IO），地址栏中填入从服务详情页"服务"页签中获取"调用信息-调用URL"的地址。
   如果自定义镜像中有更细粒度的地址，则在地址后面追加更细粒度的URL。如果有queryString，那么在params栏中添加queryString参数。
   在header中添加认证信息，不同认证方式有不同header，跟https的推理服务相同。以API KEY认证为例：Headers页签的Key值填写为"Authorization"，Value值为"Bearer"加空格加API KEY的内容。
   
3. 选择单击右上的connect按钮，建立WebSocket连接。
   - 如果信息正确，右下角连接状态处会显示：CONNECTED。
   
   - 如果无法建立连接，是401状态码，检查认证信息。
   
   - 如果显示WRONG_VERSION_NUMBER等关键字，检查自定义镜像的端口和ws跟wss的配置是否正确。
   
   
   连接成功后结果如下：
   图2连接成功   
   ![](https://support.huaweicloud.com/inference-modelarts/figure/zh-cn_image_0000002588773774.png)
   ![](https://support.huaweicloud.com/inference-modelarts/public_sys-resources/notice_3.0-zh-cn.png)
   优先验证自定义镜像提供的WebSocket服务的情况。不同的工具实现的WebSocket服务会有不同，可能出现连接建立后维持不住，可能出现请求一次后连接就中断需要重新连接的情况。ModelArts平台只保证，未上ModelArts前自定义镜像的WebSocket的形态，和上了ModelArts平台后的WebSocket形态相同（除了地址跟认证方式不同）。
   
 
#### WebSocket客户端和服务端双向传输数据
连接建立后，WebSocket使用TCP完成全双工通信。WebSocket的客户端可以往服务端发送数据，客户端有不同的实现，同一种语言也存在不同的lib包的实现，这里不考虑实现的不同种类。
客户端发送的内容在协议的角度不限定格式，Postman支持Text/Json/XML/HTML/Binary，以text为例，在输入框中输入要发送的文本，单击右侧中部的"Send"按钮即可将请求发往服务端，结果会在"Response"下的对话框里显示。
图3发送数据   
![](https://support.huaweicloud.com/inference-modelarts/figure/zh-cn_image_0000002543271233.png)
