天天看點

WebSocket 和 gRPC 服務

本文選自 《Knative 雲原生應用開發指南》

更多雲原生技術資訊可關注 阿裡巴巴雲原生技術圈

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

即可看到群聊視窗

WebSocket 和 gRPC 服務

打開兩個視窗,在其中一個視窗發送一條消息,另外一個視窗通過 WebSocket 也收到了這條消息。

gRPC

gRPC 不能通過浏覽器直接通路,需要通過 client 端和 server 端進行互動。本示例的完整代碼放在

https://github.com/knative-sample/grpc-ping-go/tree/b1.0

,本示例會給一個可以直接使用的鏡像,測試 gRPC 服務。

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           

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 遠端調用的過程

參考資料

  • WebSocket 示例代碼
  • gRPC 示例代碼
阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”v