
# ModelArts的WebSocket在线服务全流程开发
#### 背景说明
WebSocket是一种网络传输协议，可在单个TCP连接上进行全双工通信，位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455，后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。
WebSocket使得客户端和服务器之间的数据交换变得更加简单，允许服务端主动向客户端推送数据。在WebSocket API中，浏览器和服务器只需要完成一次握手，两者之间就可以建立持久性的连接，并进行双向数据传输。
#### 前提条件
- 用户需有一定的Java开发经验，熟悉jar打包流程。
- 用户需了解WebSocket协议的基本概念及调用方法。
- 用户需熟悉Docker制作镜像的方法。
 
#### 约束与限制
- WebSocket协议只支持部署在线服务。
- 只支持自定义镜像导入模型部署的在线服务。
 
#### 准备工作
ModelArts使用WebSocket完成推理需要用户自己准备自定义镜像，该自定义镜像需要在单机环境下能够提供完整的WebSocket服务，如完成WebSocket的握手，client向server发送数据，server向client发送数据等。模型的推理过程在自定义镜像中完成，如下载模型，加载模型，执行预处理，完成推理，拼装响应体等。
#### 操作步骤
WebSocket在线服务开发操作步骤如下：
- [上传镜像至容器镜像服务]
- [使用镜像创建模型]
- [使用模型部署在线服务]
- [WebSocket在线服务调用]
 
 #### 上传镜像至容器镜像服务
将准备好的本地镜像上传到容器镜像服务（SWR）。
 #### 使用镜像创建模型
1. 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)，进入" 模型管理"页面，单击"创建"，跳转至创建模型页面。
2. 完成模型配置，部分配置如下：
   - 元模型来源：选择"从容器镜像中选择"。
   
   - 容器镜像所在的路径：选择[上传镜像至容器镜像服务]上传的路径。
   
   - 容器调用接口：根据实际情况配置容器调用接口。
   
   - 健康检查：保持默认。如果镜像中配置了健康检查则按实际情况配置健康检查。
     图1模型配置参数   
     ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001498136904.png "点击放大") 
    
3. 单击"立即创建"，进入模型列表页，等模型状态变为"正常"，表示模型创建成功。
 
 #### 使用模型部署在线服务
1. 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)，进入"模型部署 \>在线服务"页面，单击"部署"，跳转至在线服务部署页面。
2. 完成服务的配置，部分配置如下：
   - 选择模型及版本：选择[使用镜像创建模型]创建完成的模型及版本
   
   - 升级为WebSocket：打开开关
     图2升级为WebSocket   
     ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001584736058.png "点击放大") 
    
3. 单击"下一步"，确认配置后"提交"，完成在线服务的部署。返回在线服务列表页，查看服务状态变为"运行中"，表示服务部署成功。
 
 #### 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/bestpractice-modelarts/figure/zh-cn_image_0000001986022829.png)，选择"File\>New"，弹出新建对话框，选择"WebSocket Request"（当前为beta版本）功能：
      图3选择WebSocket Request功能   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001986182713.png "点击放大") 
   
   2. 在新建的窗口中填入WebSocket连接信息： 左上角选择Raw，不要选择Socket.IO（一种WebSocket实现，要求客户端跟服务端都要基于Socket.IO），地址栏中填入从服务详情页"调用指南"页签中获取"API接口调用公网地址"后面的地址。如果自定义镜像中有更细粒度的地址，则在地址后面追加该URL。如果有queryString，那么在params栏中添加参数。在header中添加认证信息（不同认证方式有不同header，跟https的推理服务相同）。选择单击右上的connect按钮，建立WebSocket连接。
      图4获取API接口调用公网地址   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001952663438.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
      - 如果信息正确，右下角连接状态处会显示：CONNECTED；
      
      - 如果无法建立连接，如果是401状态码，检查认证信息；
      
      - 如果显示WRONG_VERSION_NUMBER等关键字，检查自定义镜像的端口和ws跟wss的配置是否正确。
       
      连接成功后结果如下：
      图5连接成功   
      ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001986022833.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-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工具卡住。
   图6发送数据   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000001952663434.png "点击放大")
   
   
 
