如何在 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-15ports:- name: http1containerPort: 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-15ports:- name: h2ccontainerPort: 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等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术公众号。”
如何在 Knative 中部署 WebSocket 和 gRPC 服务?相关推荐
- 如何在 OpenResty 中使用 websocket
如何在 OpenResty 中使用 websocket https://hambut.com/2016/10/13/how-to-use-websocket-in-openresty/ 前言 作为一个 ...
- 布置到linux的文件,免费的Office套件,如何在Linux中部署OnlyOffice桌面文档编辑器...
原标题:免费的Office套件,如何在Linux中部署OnlyOffice桌面文档编辑器 如果您是Ubuntu用户(或者一般的Linux用户),那么您很可能将LibreOffice作为默认的offic ...
- linux删除sde服务,在Oracle数据库中部署多个SDE服务
在Oracle数据库中部署多个SDE服务 一.一个Oracle部署多个SDE服务(采用问题的方式提供答案) 问题: 目的: 在机器上安装了oracle实例,默认会产生一个数据库实例(SID为 Orcl ...
- mysql显示表已存在_「Docker系列」 如何在Docker中部署MySQL数据库?
Docker为部署和测试应用程序和数据库提供了许多优势,这些应用程序和数据库是应用程序不可或缺的一部分,因此很值得学习如何在Docker容器中部署和运行数据库. 本文中,我们会重点关注如下重点: 为M ...
- Knative 实战:如何在 Knative 中配置自定义域名及路由规则
作者 | 元毅 阿里云智能事业群高级开发工程师 当前 Knative 中默认支持是基于域名的转发,可以通过域名模板配置后缀,但目前对于用户来说并不能指定全域名设置.另外一个问题就是基于 Path 和 ...
- 如何在 IIS 中部署 WCF
在 IIS 中部署 WCF ,最重要的 是 Web.config 文件的配置 . 首先, 正常安装 IIS 2,注册 ServiceModelReg.exe -i 3, WCF 的发布 , 需要 拷 ...
- 如何在sharepoint2010中配置Google Anlytics 分析服务
简介 Google Analytics(分析)不仅可以帮助您衡量销售与转化情况,而且能为您提供新鲜的深入信息,帮助您了解访问者如何使用您的网站,他们如何到达您的网站,以及您可以如何吸引他们不断回访. ...
- eclipse上项目如何在resin中部署
2019独角兽企业重金招聘Python工程师标准>>> 记得之前刚到公司上班的时候要安装resin,但是之前用的是tomcat啊,所以不知道怎么安,项目要怎么部署运行呢?于是上百度搜 ...
- 如何在Vue中使用websocket?
什么是WebSocket : WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范. W ...
最新文章
- SAP ABAP 因系统维护使ABAP语法不再被支持导致使用很久的程序报错问题之分析
- C++和MATLAB混合编程-DLL篇
- TCP如何能正常关闭连接?
- ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
- php 数组 1 开始,php数组使用1
- mysql 静态表 是不是 myisam_mysql的静态表和动态表的区别,MyISAM和InnoDB的区别
- php 1个中文几个字节,PHP函数第15款:gbk中文截取,1个中文字节为2个英文字节 cn_substr...
- Android FrameWork浅识
- 【图像增强】基于matlab模糊集图像增强【含Matlab源码 394期】
- Pandas数据类型-DataFrame之创建和访问
- 你还为数学建模模型代码实现而烦恼吗?一文带你实践30多种常用模型python代码
- HaaS EDU K1设备资源总体介绍
- Foundation框架之字符串和日期
- 百度地图标记点加点击事件和鼠标移入事件并添加数据
- 计算机一直在启动界面进不去怎么办,Win7系统开机一直停留在“Windows正在启动”界面怎么办...
- 如何利用Visio来绘制斜线!
- JAVA中获取文件MD5值的四种方法
- HDU - 6555 The Fool(思维)
- web前端开发中需要掌握的技术:
- iphone微信长按二维码识别不了