`
大涛学长
  • 浏览: 109940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何在 Knative 中部署 WebSocket 和 gRPC 服务?

阅读更多
![y1](https://yqfile.alicdn.com/833c7ecf05588f257bcf7071d0f7b0d3b7aa298e.png)

作者 | 冬岛  阿里云容器平台工程师

> **导读:**虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中会发现,有时想要把自己的 WebSocket 或 gRPC 部署到 Knative 中,还是存在各种不顺利。虽然最后排查发现,大多是自己的程序问题或是配置错误导致的。本文分别给出了一个 WebSocket 和 gRPC 的例子,当需要在生产或者测试环境部署相关服务时,可以使用本文给出的示例进行 Knative 服务的测试。

WebSocket
---------

如果自己手动的配置 Istio Gateway 支持 WebSocket 就需要开启 `websocketUpgrade` 功能。但使用 Knative Serving 部署其实就自带了这个能力。本示例的完整代码放在 [https://github.com/knative-sample/websocket-chat](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Fknative-sample%2Fwebsocket-chat) ,这是一个基于 WebSocket 实现的群聊的例子。

使用浏览器连接到部署的服务中就可以看到一个接收信息的窗口和发送信息的窗口。当你发出一条信息以后所有连接进来的用户都能收到你的消息。所以你可以使用两个浏览器窗口分别连接到服务中,一个窗口发送消息一个窗口接收消息,以此来验证 WebSocket 服务是否正常。

本示例是在 [gorilla/websocket](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Fgorilla%2Fwebsocket%2Ftree%2Fmaster%2Fexamples%2Fchat)  基础之上进行了一些优化:

*   代码中添加了 vendor 依赖,你下载下来就可以直接使用
*   添加了 Dockerfile 和 Makefile 可以直接编译二进制和制作镜像
*   添加了 Knative Sevice 的 yaml 文件(`service.yaml`),你可以直接提交到 Knative 集群中使用
*   也可以直接使用编译好的镜像 `registry.cn-hangzhou.aliyuncs.com/knative-sample/websocket-chat:2019-10-15`

Knative Service 配置:

```
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: websocket-chat
spec:
  template:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/websocket-chat:2019-10-15
          ports:
            - name: http1
              containerPort: 8080
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

代码 clone 下来以后执行 `kubectl apply -f service.yaml` 把服务部署到 Knative 中,然后直接访问服务地址即可使用。

查看 ksvc 列表,并获取访问域名。

```
└─# kubectl get ksvc
NAME             URL                                                    LATESTCREATED          LATESTREADY            READY   REASON
websocket-chat   http://websocket-chat.default.serverless.kuberun.com   websocket-chat-7ghc9   websocket-chat-7ghc9   True
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

现在使用浏览器打开 [http://websocket-chat.default.serverless.kuberun.com](https://yq.aliyun.com/go/articleRenderRedirect?url=http%3A%2F%2Fwebsocket-chat.default.serverless.kuberun.com) 即可看到群聊窗口。

![y2](https://yqfile.alicdn.com/70a07136b0cdd521ba4e60345688b3516c3cd49e.png)

打开两个窗口,在其中一个窗口发送一条消息,另外一个窗口通过 WebSocket 也收到了这条消息。

gRPC
----

gRPC 不能通过浏览器直接访问,需要通过 client 端和 server 端进行交互。本示例的完整代码放在 [https://github.com/knative-sample/grpc-ping-go](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Fknative-sample%2Fgrpc-ping-go) ,本示例会给一个可以直接使用的镜像,测试 gRPC 服务。

Knative Service 配置:

```
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: grpc-ping
spec:
  template:
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/grpc-ping-go:2019-10-15
        ports:
          - name: h2c
            containerPort: 8080
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

代码 clone 下来以后执行 `kubectl apply -f service.yaml` 把服务部署到 Knative 中。

获取 ksvc 列表和访问域名:

```
└─# kubectl get ksvc
NAME             URL                                                    LATESTCREATED          LATESTREADY            READY     REASON
grpc-ping        http://grpc-ping.default.serverless.kuberun.com        grpc-ping-p2tft                               Unknown   RevisionMissing
websocket-chat   http://websocket-chat.default.serverless.kuberun.com   websocket-chat-6hgld   websocket-chat-6hgld   True
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

现在我们已经知道 gRPC  server 的地址是 grpc-ping.default.serverless.kuberun.com,端口是 80,那么我们可以发起测试请求:

```
└─# docker run --rm registry.cn-hangzhou.aliyuncs.com/knative-sample/grpc-ping-go:2019-10-15 /client -server_addr="grpc-ping.default.serverless.kuberun.com:80" -insecure
2019/10/16 11:35:07 Ping got hello - pong
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854794231 +0800 CST m=+73.061909052
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854827273 +0800 CST m=+73.061942072
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854835802 +0800 CST m=+73.061950606
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854842843 +0800 CST m=+73.061957643
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854849211 +0800 CST m=+73.061964012
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854855249 +0800 CST m=+73.061970049
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854861659 +0800 CST m=+73.061976460
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854875071 +0800 CST m=+73.061989873
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854905416 +0800 CST m=+73.062020221
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.85491183 +0800 CST m=+73.062026630
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.85492533 +0800 CST m=+73.062040133
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854932285 +0800 CST m=+73.062047083
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854946977 +0800 CST m=+73.062061782
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854953311 +0800 CST m=+73.062068112
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854966639 +0800 CST m=+73.062081440
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854973939 +0800 CST m=+73.062088739
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854985463 +0800 CST m=+73.062100268
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854993275 +0800 CST m=+73.062108073
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854999812 +0800 CST m=+73.062114613
2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.855012676 +0800 CST m=+73.062127479
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

小结
--

本文通过两个例子分别展示了 WebSocket 和 gRPC 的部署方法:

*   WebSocket 示例通过一个 chat 的方式展示发送和接受消息
*   gRPC 通过启动一个 client 的方式展示 gRPC 远程调用的过程

 

本文作者:冬岛,阿里云容器平台工程师

[原文链接](https://yq.aliyun.com/articles/721268?utm_content=g_1000082463)

本文为云栖社区原创内容,未经允许不得转载。
分享到:
评论

相关推荐

    grpc-websocket-proxy-example

    在现代Web应用中,gRPC和WebSocket是两种重要的通信协议,它们各自服务于不同的目的,但有时需要结合使用。在这个示例中,我们将探讨这两种技术以及它们如何协同工作。 gRPC是一种高性能、开源的通用RPC(远程过程...

    WebSocket C#服务端Demo+测试

    总的来说,这个项目为开发者提供了一个实用的起点,了解如何在C#环境中搭建WebSocket服务,以及如何使用HTML和JavaScript与之进行交互。对于希望构建实时、双向通信应用(如在线聊天、游戏或股票报价)的开发者来说...

    grpc-bus-websocket-proxy-client:通过WebSocket代理服务器从浏览器连接到任何GRPC服务

    GRPC-Bus WebSocket代理客户端该客户端库通过WebSocket代理服务器将浏览器JavaScript上下文连接到标准GRPC服务,并完全支持双向流传输(即,由或由) 安装npm install grpc-bus-websocket-client 您还需要安装并运行...

    WebsocketServer测试服务器

    在本项目中,使用的库包括asio-1.22.1和websocketpp-0.8.2。Asio是一个C++库,提供了异步I/O操作的支持,如网络通信、定时器等,它不依赖于Boost库,但可以与之兼容。WebSocketpp则是一个轻量级的WebSocket库,专为...

    微信小程序之WebSocket

    为什么需要websocket? 传统的实时交互的游戏,或服务器主动发送消息的行为(如推送服务),如果想做在微信上,可能你会使用轮询的方式进行,不过这太消耗资源,大量的请求也加重了服务器的负担,而且延迟问题比较...

    Node.js-部署到Now的流行WebSocket服务器示例

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。...通过学习和实践这个示例,开发者可以更好地理解和掌握WebSocket服务器的构建以及在云环境中部署的技巧。

    grpc-websocket-proxy:透明地升级grpc-gateway流终结点以使用websocket的代理

    grpc-websocket-proxy 使用此帮助程序包装grpc-gateway mux,以通过websocket公开流终结点。 在网络上,它使用消息的换行符分隔的json编码。 用法: mux := runtime.NewServeMux() opts := []grpc.DialOption{...

    在openwrt中使用websocket,基于makefile。

    在OpenWRT这样的轻量级操作系统中,WebSocket可以帮助实现设备的远程控制、实时数据传输等功能。 OpenWRT是一个基于Linux的嵌入式操作系统,广泛应用于无线路由器和其他类型的嵌入式设备。它的核心是 BusyBox 和 ...

    MFC websocket server | MFC websocket服务器

    4. **帧处理**:在MFC WebSocket服务器中,需要理解并实现WebSocket的帧格式,包括文本帧、二进制帧、关闭帧和ping/pong帧。这些帧用于在连接上发送和接收数据。 5. **事件驱动编程**:WebSocket服务器通常采用事件...

    vosk-server:基于Vosk和Kaldi库的WebSocket,gRPC和WebRTC语音识别服务器

    有四种支持四种主要通信协议的服务器-MQTT,GRPC,WebRTC和Websocket 该服务器可以在本地使用,以为智能家居,PBX(如freeswitch或星号)提供语音识别。 该服务器还可以作为后端运行,以在网络上进行流语音识别,...

    在android的webview中实现websocket通信

    在使用 android-websockets 项目时,开发者需要在 Eclipse 中新建一个 Android 项目,然后将 WebSocketFactory.java 和 WebSocket.java 文件打包成 jar 文件,并将其存放在项目的 libs 目录下。然后,开发者需要将 ...

    dotnet-websocketsharp是WebSocket协议客户端和服务器的C实现

    WebSocketSharp是一个开源库,专为.NET开发者提供了对WebSocket协议的支持,允许他们轻松地在C#环境中构建WebSocket客户端和服务器。这个库的名称虽然与标题中的"dotnet-websocketsharp"略有不同,但根据描述和提供...

    tomcat7.0.42 下部署websocket需要替换的包

    在Java中,你可以使用`javax.websocket`包提供的接口和类来创建WebSocket服务器端点和客户端。同时,你还需要确保客户端浏览器也支持WebSocket,因为不是所有浏览器都完全兼容WebSocket。 总的来说,通过替换这些...

    Tomcat WebSocket

    8. **集成与部署**:在Tomcat中,WebSocket应用需要正确配置,包括在web.xml中声明WebSocket服务,以及确保使用的WebSocket库(如这里的websocket-api.jar)已经包含在类路径中。 9. **应用示例**:WebSocket广泛...

    MFC websocket服务器和客户端

    WebSocket是一种在客户端和服务器之间建立持久性连接的协议,允许进行全双工通信,常用于实时应用如在线游戏、股票交易、聊天室等。将MFC与WebSocket结合,我们可以创建高性能、低延迟的桌面应用程序。 1. **...

    C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    总结来说,WebSocket Sharp 提供了一个强大且灵活的工具,用于在C#环境中实现WebSocket协议,无论是构建实时交互的Web应用,还是在Unity游戏开发中实现网络通信,都是一个值得考虑的选择。通过理解和掌握其基本用法...

    C# IIS webSocket 实例

    在这个"C# IIS WebSocket实例"中,我们将会探讨如何在C#环境中利用IIS来实现WebSocket服务。首先,我们需要理解WebSocket API的基础知识,这包括创建WebSocket连接、发送和接收数据以及管理连接状态。C#提供了System...

    c# winform快速建websocket服务器源码 wpf快速搭建websocket服务

    c# winform快速建websocket服务器源码 wpf快速搭建websocket服务 c#简单建立websocket服务 websocket快速搭建 随着互联网技术的飞速发展,实时交互和数据推送已成为众多应用的核心需求。传统的HTTP协议,基于请求-...

    C++ 实现WebSocket 服务器

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在两个方向上同时传输,极大地提高了实时性。在本项目中,我们使用C++来实现一个WebSocket服务器,借助了libuv库来...

    c++ websocket服务器和html客户端

    在这个"C++ WebSocket服务器和HTML客户端"项目中,我们有两个主要组成部分: 1. **WebSocket服务器**:使用C++编写,实现了WebSocket服务器端。C++是一种通用的、面向对象的编程语言,其强大的性能和底层控制能力使...

Global site tag (gtag.js) - Google Analytics