自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ingress企業(yè)實(shí)戰(zhàn):實(shí)現(xiàn)GRPC與WebSocket服務(wù)訪問(wèn)

開(kāi)發(fā) 架構(gòu)
gRPC支持多種編程語(yǔ)言,包括但不限于C++, Java, Python, Go, Node.js, Ruby, C#,等。這意味著您可以使用不同的編程語(yǔ)言開(kāi)發(fā)服務(wù)端和客戶端,它們?nèi)匀豢梢韵嗷ネㄐ拧?/div>

什么是gRPC?

gRPC(gRPC Remote Procedure Call)是一種開(kāi)源的遠(yuǎn)程過(guò)程調(diào)用(RPC)框架,由Google開(kāi)發(fā)并于2015年發(fā)布。它使用HTTP/2協(xié)議進(jìn)行通信,旨在簡(jiǎn)化跨網(wǎng)絡(luò)的服務(wù)通信和跨語(yǔ)言的服務(wù)調(diào)用。以下是 gRPC 的一些關(guān)鍵特點(diǎn)和概念:

  1. IDL(Interface Definition Language): gRPC 使用IDL來(lái)定義服務(wù)接口和消息格式。它使用Protocol Buffers(通常簡(jiǎn)稱為ProtoBuf)作為默認(rèn)的IDL工具。通過(guò)IDL,您可以明確定義服務(wù)的方法和參數(shù),然后使用gRPC工具生成相應(yīng)的客戶端和服務(wù)器代碼。
  2. 多語(yǔ)言支持: gRPC支持多種編程語(yǔ)言,包括但不限于C++, Java, Python, Go, Node.js, Ruby, C#,等。這意味著您可以使用不同的編程語(yǔ)言開(kāi)發(fā)服務(wù)端和客戶端,它們?nèi)匀豢梢韵嗷ネㄐ拧?/li>
  3. HTTP/2: gRPC使用HTTP/2作為底層傳輸協(xié)議,這帶來(lái)了性能上的一些好處,如多路復(fù)用、頭部壓縮、流控制等。這有助于提高通信效率,特別是在高延遲或低帶寬網(wǎng)絡(luò)上。
  4. 雙向流: gRPC允許客戶端和服務(wù)器之間建立雙向流,這意味著它支持雙向通信。這對(duì)于流式數(shù)據(jù)傳輸和實(shí)時(shí)應(yīng)用程序非常有用。
  5. 中間件支持: gRPC提供了一種插件式的中間件機(jī)制,使您可以在請(qǐng)求和響應(yīng)處理過(guò)程中添加攔截器和處理器,以實(shí)現(xiàn)諸如身份驗(yàn)證、授權(quán)、日志記錄等功能。
  6. 支持多種序列化格式: 盡管gRPC默認(rèn)使用Protocol Buffers作為序列化格式,但它也支持其他序列化格式,如JSON。
  7. 服務(wù)發(fā)現(xiàn): gRPC還提供了服務(wù)發(fā)現(xiàn)功能,使服務(wù)能夠注冊(cè)和發(fā)現(xiàn)其他服務(wù)的位置和狀態(tài)。這對(duì)于微服務(wù)架構(gòu)非常有用。

申請(qǐng)SSL證書(shū)

生成CA證書(shū):

# 生成CA根證書(shū)私鑰:為保證安全,生成一個(gè)4096位的私鑰,并使用aes方式加密
$ openssl genrsa -aes256 -out kubesre-ca.key 4096
Enter PEM pass phrase:   # 密碼:12345678
Verifying - Enter PEM pass phrase:

# 通過(guò)CA根私鑰簽發(fā)CA根證書(shū)
$ openssl req -new -x509 -days 3650 -sha256 -extensions v3_ca -key kubesre-ca.key -out kubesre-ca.cer -subj "/C=CN/ST=shanghai/L=shanghai/O=kubesre/OU=kubesre/CN=*.kubesre.com"
Enter pass phrase for kubesre-ca.key: # 密碼:12345678

生成服務(wù)端證書(shū):

# 生成服務(wù)端證書(shū)私鑰
$ openssl genrsa -out kubesre-server.key 2048

# 生成簽發(fā)請(qǐng)求csr
$openssl req -new -key kubesre-server.key -out kubesre-server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=kubesre/OU=kubesre/CN=demo.kubesre.com"

# 用CA證書(shū)簽發(fā)服務(wù)端證書(shū)
$ openssl x509 -req  -days 3650 -sha256 -CA kubesre-ca.cer -CAkey kubesre-ca.key -in kubesre-server.csr -out kubesre-server.cer
Certificate request self-signature ok
subject=C = CN, ST = shanghai, L = shanghai, O = kubesre, OU = kubesre, CN = demo.kubesre.com
Enter pass phrase for kubesre-ca.key: # 密碼:12345678

$ ll
total 40
-rw-r--r--@ 1 chuanzhang  staff   2.0K  8 13 15:24 kubesre-ca.cer
-rw-------@ 1 chuanzhang  staff   3.4K  8 13 15:22 kubesre-ca.key
-rw-r--r--@ 1 chuanzhang  staff   1.6K  8 13 15:31 kubesre-server.cer
-rw-r--r--@ 1 chuanzhang  staff   1.0K  8 13 15:28 kubesre-server.csr
-rw-------@ 1 chuanzhang  staff   1.7K  8 13 15:27 kubesre-server.key

創(chuàng)建證書(shū)Secret(證書(shū)基于Kubernetes Secret進(jìn)行存儲(chǔ)):

$ kubectl create secret tls  kubesre-tls --key kubesre-server.key --cert kubesre-server.cer
secret/kubesre-tls created
$ kubectl get secret
NAME          TYPE                DATA   AGE
kubesre-tls   kubernetes.io/tls   2      18s

gRPC示例應(yīng)用部署

部署示例版本:

$ cat demo.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-service
spec:
  replicas: 1
  selector:
    matchLabels:
      run: grpc-service
  template:
    metadata:
      labels:
        run: grpc-service
    spec:
      containers:
      - image: registry.cn-shanghai.aliyuncs.com/kubesre01/grpc-server:latest
        imagePullPolicy: Always
        name: grpc-service
        ports:
        - containerPort: 50051
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: grpc-service
spec:
  ports:
  - port: 50051
    protocol: TCP
    targetPort: 50051
  selector:
    run: grpc-service

# 執(zhí)行創(chuàng)建操作
$ kubectl apply -f demo.yml
deployment.apps/grpc-service unchanged
service/grpc-service created

# 查看創(chuàng)建狀態(tài)
kubectl get pods,svc
NAME                                READY   STATUS    RESTARTS   AGE
pod/grpc-service-56f784fcb5-n72hd   1/1     Running   0          81s

NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
service/grpc-service   ClusterIP   10.96.239.197   <none>        50051/TCP   73s
service/kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP     11d

# 出現(xiàn)以上情況說(shuō)明一切就緒

創(chuàng)建Ingress gRPC路由規(guī)則

$ cat demo-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grpc-ingress
  annotations:
    # 通過(guò)注解指定GRPC協(xié)議
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
  ingressClassName: nginx
  # 指定證書(shū)
  tls:
  - hosts:
    - demo.kubesre.com
    secretName: kubesre-tls
  rules:
  # 制定域名
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: grpc-service
            port:
              number: 50051
kubectl apply -f demo-ingress.yml
ingress.networking.k8s.io/grpc-ingress created

驗(yàn)證:

$ grpcurl -insecure -authority demo.kubesre.com 127.0.0.1:443 list
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter

# 出現(xiàn)如下情況,說(shuō)明驗(yàn)證成功了,流量成功路由到了后端服務(wù)了!

什么是WebSocket

WebSocket是一種計(jì)算機(jī)通信協(xié)議,它提供了一種在客戶端和服務(wù)器之間建立持久性連接的方式,允許雙向?qū)崟r(shí)數(shù)據(jù)傳輸。WebSocket的主要目的是解決HTTP協(xié)議的一些限制,如請(qǐng)求-響應(yīng)模式和高延遲。以下是WebSocket的一些關(guān)鍵特點(diǎn)和用途:

  1. 雙向通信:WebSocket允許服務(wù)器和客戶端之間進(jìn)行雙向通信,而不像HTTP那樣需要每次都發(fā)起新的請(qǐng)求。
  2. 持久連接:WebSocket連接是持久性的,一旦建立連接,它可以保持打開(kāi)狀態(tài),以便隨時(shí)發(fā)送或接收數(shù)據(jù),而不必重新建立連接。
  3. 實(shí)時(shí)性:由于WebSocket提供了低延遲的通信方式,它特別適合實(shí)時(shí)應(yīng)用程序,如在線聊天、在線游戲和實(shí)時(shí)數(shù)據(jù)更新。
  4. 輕量級(jí):WebSocket協(xié)議相對(duì)較輕量,因此減少了通信開(kāi)銷和延遲。
  5. 跨域通信:WebSocket支持跨域通信,這意味著可以在不同域名下的客戶端和服務(wù)器之間建立連接。
  6. 安全性:WebSocket可以通過(guò)加密來(lái)確保通信的安全性,類似于HTTPS協(xié)議

WebSocket通常用于實(shí)現(xiàn)各種實(shí)時(shí)Web應(yīng)用程序,例如在線聊天、協(xié)作工具、在線游戲、股票市場(chǎng)報(bào)價(jià)、實(shí)時(shí)監(jiān)控和通知系統(tǒng)等。它在那些需要實(shí)時(shí)數(shù)據(jù)傳輸和即時(shí)響應(yīng)的場(chǎng)景中非常有用,因?yàn)樗梢越档屯ㄐ叛舆t,提供更好的用戶體驗(yàn)。WebSocket通信建立在TCP協(xié)議之上,通常使用端口80(HTTP)或443(HTTPS)來(lái)傳輸數(shù)據(jù)。

WebSocket示例應(yīng)用部署

部署示例版本:

# 執(zhí)行創(chuàng)建操作
$ kubectl apply -f ws.yml
deployment.apps/demo-ws created
service/demo-ws-svc created

# 查看創(chuàng)建狀態(tài)
kubectl get pod,svc
NAME                               READY   STATUS    RESTARTS   AGE
pod/demo-ws-79bd8fbdc7-hml6q       1/1     Running   0          2m2s

NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
service/demo-ws-svc    ClusterIP   10.96.255.28   <none>        8080/TCP    2m2s
service/kubernetes     ClusterIP   10.96.0.1      <none>        443/TCP     82m

# 出現(xiàn)以上情況說(shuō)明一切就緒

創(chuàng)建Ingress WebSocket

Kubernetes Ingress Controller默認(rèn)已支持WebSocket無(wú)需額外配置,并可以通過(guò)如下注解做些額外優(yōu)化配置:

nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
$ demo-ws-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ws-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-ws-svc
            port:
              number: 8090

# 創(chuàng)建WebSocket Ingress資源對(duì)象
$ kubectl apply -f demo-ws-ingress.yml
ingress.networking.k8s.io/demo-ws-ingress created

# 查看狀態(tài)
$ kubectl get ingress
NAME              CLASS   HOSTS              ADDRESS   PORTS   AGE
demo-ws-ingress   nginx   demo.kubesre.com             80      2m6s

Kubernetes Ingress Controller若默認(rèn)不支持WebSocket可能是Ingress老版本,則可以通過(guò)如下方式進(jìn)行配置(作為補(bǔ)充知識(shí)):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ws-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/configuration-snippet: |
       proxy_set_header Upgrade "websocket";
       proxy_set_header Connection "Upgrade";
spec:
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-ws-svc
            port:
              number: 8090

NGINX Ingress Controller (Nginx官方),可以通過(guò)如下方式進(jìn)行配置(作為補(bǔ)充知識(shí)):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ws-ingress
  annotations:
    nginx.org/websocket-services: "demo-ws-svc" # 具體的服務(wù)名
spec:
  ingressClassName: nginx
  rules:
  - host: demo.kubesre.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-ws-svc
            port:
              number: 8090

驗(yàn)證:通過(guò)ApiPost工具進(jìn)行測(cè)試驗(yàn)證成功,Ws可以連接成功并可以成功收發(fā)消息!

圖片圖片

總結(jié)

本文介紹了gPRC與WebSocket后端協(xié)議Ingress配置方法,并通過(guò)實(shí)際案例的方式講解,下一章將講解Ingress更多企業(yè)級(jí)實(shí)戰(zhàn),請(qǐng)敬請(qǐng)期待!

責(zé)任編輯:武曉燕 來(lái)源: 云原生運(yùn)維圈
相關(guān)推薦

2023-08-21 11:09:38

IngressNginxApache

2009-02-10 10:58:59

2024-09-04 08:09:51

2021-09-30 07:03:12

gRPC服務(wù)Grpcurl

2022-09-09 20:55:38

LinkerdKubernetes

2023-06-10 23:01:41

GrpcProtobuf數(shù)據(jù)

2025-04-08 08:50:37

SpringCamel系統(tǒng)

2017-07-11 13:58:10

WebSocket

2021-09-26 10:20:06

開(kāi)發(fā)Golang代碼

2022-03-29 10:36:32

技術(shù)架構(gòu)微服務(wù)

2022-07-26 14:53:10

WebSocket網(wǎng)絡(luò)通信協(xié)議

2011-08-04 11:55:20

遠(yuǎn)程訪問(wèn)

2023-03-03 08:19:35

KubernetesgRPC

2024-11-18 17:04:03

Vue3C#

2021-01-28 10:10:51

微服務(wù)后端SpringCloud

2024-06-12 08:46:19

2023-03-02 07:20:10

GRPC服務(wù)健康檢查協(xié)議

2023-11-08 07:50:41

KubernetesIngress

2011-05-13 10:28:50

2011-09-05 14:31:20

路由器限速
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)