如何在 Knative 中部署 WebSocket 和 gRPC 服务?
作者 | 冬岛 阿里云容器平台工程师
导读:虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中会发现,有时想要把自己的 WebSocket 或 gRPC 部署到 Knative 中,还是存在各种不顺利。虽然最后排查发现,大多是自己的程序问题或是配置错误导致的。本文分别给出了一个 WebSocket 和 gRPC 的例子,当需要在生产或者测试环境部署相关服务时,可以使用本文给出的示例进行 Knative 服务的测试。
WebSocket
如果自己手动的配置 Istio Gateway 支持 WebSocket 就需要开启
websocketUpgrade功能。但使用 Knative Serving 部署其实就自带了这个能力。本示例的完整代码放在 https://github.com/knative-sample/websocket-chat ,这是一个基于 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.serverless.kuberun.com websocket-chat-7ghc9 websocket-chat-7ghc9 True
现在使用浏览器打开 http://websocket-chat.default.serverless.kuberun.com 即可看到群聊窗口。
打开两个窗口,在其中一个窗口发送一条消息,另外一个窗口通过 WebSocket 也收到了这条消息。
gRPC
gRPC 不能通过浏览器直接访问,需要通过 client 端和 server 端进行交互。本示例的完整代码放在 https://github.com/knative-sample/grpc-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
代码 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
现在我们已经知道 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
小结
本文通过两个例子分别展示了 WebSocket 和 gRPC 的部署方法:
- WebSocket 示例通过一个 chat 的方式展示发送和接受消息
- gRPC 通过启动一个 client 的方式展示 gRPC 远程调用的过程
作者简介:
冬岛,阿里云容器平台工程师,负责阿里云容器平台 Knative 相关工作。
了解更多 ACK 详情:https://www.aliyun.com/product/kubernetes
欢迎加入 Knative 交流群
“ 阿里巴巴云原生微信公众号(ID:Alicloudnative)关注微服务、Serverless、容器、Service Mesh等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。”
- 两个springboot项目如何部署在同一个服务上,two spring boot applications deploy in same server
- 教程:如何用Axis2开发和部署Web服务
- 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
- nova compute服务如何部署一个instance
- 基于k8s部署的应用(服务)如何访问
- LoadRunner中如何监控Linux系统资源(在Linux中设置RPC服务)
- 如何在Linux下部署web程序(搭建vsftp服务,搭建sshd 服务器,jdk安装步骤,Tomcat安装步骤,MySQL安装步骤)
- 如何部署Samba服务
- IBM Bluemix-如何部署Java Web项目-如何添加MySQL服务
- 如何快速地在上千台服务器上部署一项服务
- 如何用k8s部署海外企业项目服务
- 如何部署 Docker Registry 服务
- 如何首次在 Exchange Server 2003 SP1 上部署 RPC over HTTP
- 如何调用他人的远程服务---RPC原理
- 如何在IPv4/IPv6环境下部署DNS服务
- ruby进行rpc服务的建立,并且设置端口号(XMLRPC 及 ruby的xmlrpc如何使用)
- 如何使用私有网络部署全球同服游戏服务
- 还不知道阿里云证书服务如何配置部署,你out了
- 如何在企业环境中使用 Windows 部署服务 部署 Windows XP(实验手册)
- 还不知道阿里云证书服务如何配置部署,你out了