WebSocket 和 gRPC 服务

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
性能测试 PTS,5000VUM额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中发现有些时候想要把自己的 WebSocket 或  gRPC 部署到 Knative 中还是会有各种不顺利的地方,尽管最后排查发现大多都是自己的程序问题或者是配置错误导致的。为了方便大家做验证,这里就分别给出一个 WebSocket 的例子和一个 gRPC 的例子。当我们需要在生产或者测试环境部署相关服务的时候可以使用本文给出的示例进行 Knative 服务的测试。

本文选自《Knative 云原生应用开发指南》
knative海报.png
更多云原生技术资讯可关注阿里巴巴云原生技术圈

WebSocket

如果自己手动的配置 Istio Gateway 支持 WebSocket 就需要开启 websocketUpgrade 功能。但使用 Knative Serving 部署其实就自带了这个能力。本示例的完整代码放在 https://github.com/knative-sample/websocket-chat/tree/b1.0 ,这是一个基于 WebSocket 实现的群聊的例子。使用浏览器连接到部署的服务中就可以看到一个接收信息的窗口和发送信息的窗口。当你发出一条信息以后所有连接进来的用户都能收到你的消息。所以你可以使用两个浏览器窗口分别连接到服务中,一个窗口发送消息一个窗口接收消息,以此来验证 WebSocket 服务是否正常。

本示例是在 gorilla/websocket  基础之上进行了一些优化:

  • 代码中添加了 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

代码 clone 下来以后执行 kubectl apply -f service.yaml 把服务部署到 Knative 中,然后直接访问服务地址即可使用。
查看 ksvc 列表,并获取访问域名

└─# kubectl get ksvc
NAME                            URL                                                                LATESTCREATED                         LATESTREADY                           READY   REASON
websocket-chat                  http://websocket-chat.default.knative.kuberun.com                  websocket-chat-tp4ph                  websocket-chat-tp4ph                  True

现在使用浏览器打开 http://websocket-chat.default.knative.kuberun.com 即可看到群聊窗口

31.png

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

gRPC

gRPC 不能通过浏览器直接访问,需要通过 client 端和 server 端进行交互。本示例的完整代码放在 https://github.com/knative-sample/grpc-ping-go/tree/b1.0 ,本示例会给一个可以直接使用的镜像,测试 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

代码 clone 下来以后执行 kubectl apply -f service.yaml 把服务部署到 Knative 中。
获取 ksvc 列表和访问域名:

└─# kubectl get ksvc
NAME                            URL                                                                LATESTCREATED                         LATESTREADY                           READY     REASON
grpc-ping                       http://grpc-ping.default.knative.kuberun.com                       grpc-ping-plzrv                       grpc-ping-plzrv                       True

现在我们已经知道 gRPC  server 的地址是 grpc-ping.default.knative.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.knative.kuberun.com:80" -insecure
2019/11/06 13:45:46 Ping got hello - pong
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.43385349 +0800 CST m=+52.762218971
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433885075 +0800 CST m=+52.762250507
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433894386 +0800 CST m=+52.762259840
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433902205 +0800 CST m=+52.762267652
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433909964 +0800 CST m=+52.762275418
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433926773 +0800 CST m=+52.762292207
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.43393548 +0800 CST m=+52.762300916
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433940721 +0800 CST m=+52.762306150
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433954408 +0800 CST m=+52.762319841
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433959768 +0800 CST m=+52.762325212
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433964951 +0800 CST m=+52.762330381
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433973361 +0800 CST m=+52.762338796
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433986818 +0800 CST m=+52.762352250
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.433994339 +0800 CST m=+52.762359790
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.434001938 +0800 CST m=+52.762367370
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.434016244 +0800 CST m=+52.762381708
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.434024768 +0800 CST m=+52.762390227
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.434037418 +0800 CST m=+52.762402862
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.434045691 +0800 CST m=+52.762411130
2019/11/06 13:45:46 Got pong 2019-11-06 13:45:46.434053459 +0800 CST m=+52.762418894

小结

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

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

参考资料

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”v

相关文章
|
JavaScript 前端开发 测试技术
教你启动一个最简单的 websocket 服务
启动一个 websocket 服务,有很多方式,我们可以使用 PHP,可以使用 Node.js,也可以使用 Golang 等语言。今天我们主要介绍如何利用 Node.js 启动一个最简单的 websocket 服务,总共分为三个步骤。
2962 0
教你启动一个最简单的 websocket 服务
|
4月前
|
XML JSON Go
Swoole与Go系列教程之WebSocket服务的应用
在 WebSocket 协议出现之前,Web 应用为了能过获取到实时的数据都是通过不断轮询服务端的接口。轮询的效率、延时很低,并且很耗费资源。
1059 2
Swoole与Go系列教程之WebSocket服务的应用
|
3月前
|
前端开发 Go 开发者
用 Go + WebSocket 快速实现一个 chat 服务
用 Go + WebSocket 快速实现一个 chat 服务
|
6月前
|
定位技术 开发者 UED
基于位置的服务中,WebSocket有哪些用途?
【5月更文挑战第3天】基于位置的服务中,WebSocket有哪些用途?
73 6
|
前端开发
从零玩转Websocket实时通讯服务之前后端分离版本
从零玩转Websocket实时通讯服务之前后端分离版本
160 0
|
Linux PHP Windows
|
Shell
websocketd开启websocket服务
websocketd开启websocket服务
140 0
websocketd开启websocket服务
|
移动开发 网络协议 Java
Java实现WebSocket服务
Java可以使用Tomcat提供的WebSocket库接口实现WebSocket服务,代码编写也非常的简单。现在的H5联网游戏基本上都是使用WebSocket协议,基于长连接,服务器可以主动推送消息,而不是传统的网页采用客户端轮询的方式获取服务器的消息。下面给出简单使用Tomcat的WebSocket服务的基本代码结构。
1065 0
Java实现WebSocket服务
|
缓存 运维 小程序
搭建websocket消息推送服务,必须要考虑的几个问题
近年各行业对websocket的需求越来越大,对websocket的要求也越来越高。从早期对websocket的应用仅限于少部分功能和IM等特殊场景,逐步发展为追求支持高并发,百万、千万级每秒通讯的高可用websocket服务。本文将为你讲解搭建websocket消息推送服务必须要考虑的几个问题。