如何使用Higress实现GRPC与WebSocket服务访问

2023年 10月 18日 29.3k 0

什么是gRPC

gRPC(gRPC Remote Procedure Call)是一种开源的远程过程调用(RPC)框架,由Google开发并于2015年发布。它使用HTTP/2协议进行通信,旨在简化跨网络的服务通信和跨语言的服务调用。以下是 gRPC 的一些关键特点和概念:

  • IDL(Interface Definition Language): gRPC 使用IDL来定义服务接口和消息格式。它使用Protocol Buffers(通常简称为ProtoBuf)作为默认的IDL工具。通过IDL,您可以明确定义服务的方法和参数,然后使用gRPC工具生成相应的客户端和服务器代码。
  • 多语言支持: gRPC支持多种编程语言,包括但不限于C++, Java, Python, Go, Node.js, Ruby, C#,等。这意味着您可以使用不同的编程语言开发服务端和客户端,它们仍然可以相互通信。
  • HTTP/2: gRPC使用HTTP/2作为底层传输协议,这带来了性能上的一些好处,如多路复用、头部压缩、流控制等。这有助于提高通信效率,特别是在高延迟或低带宽网络上。
  • 双向流: gRPC允许客户端和服务器之间建立双向流,这意味着它支持双向通信。这对于流式数据传输和实时应用程序非常有用。
  • 中间件支持: gRPC提供了一种插件式的中间件机制,使您可以在请求和响应处理过程中添加拦截器和处理器,以实现诸如身份验证、授权、日志记录等功能。
  • 支持多种序列化格式: 尽管gRPC默认使用Protocol Buffers作为序列化格式,但它也支持其他序列化格式,如JSON。
  • 服务发现: gRPC还提供了服务发现功能,使服务能够注册和发现其他服务的位置和状态。这对于微服务架构非常有用。
  • 申请SSL证书

    申请CA证书:

    # 生成CA根证书私钥:为保证安全,生成一个4096位的私钥,并使用aes方式加密
    openssl genrsa -aes256 -out kubesre-ca.key 4096
    Enter PEM pass phrase:   # 密码:12345678
    Verifying - Enter PEM pass phrase:
    
    # 通过CA根私钥签发CA根证书
    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

    生成服务端证书:

    # 生成服务端证书私钥
    openssl genrsa -out kubesre-server.key 2048
    
    # 生成签发请求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证书签发服务端证书
    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

    配置证书:

    图片

    点击确定后,可以通过证书管理页面看到已创建的证书:

    图片

    gRPC示例应用部署

    部署示例版本:

    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
    
    # 执行创建操作
    kubectl apply -f demo.yml
    deployment.apps/grpc-service unchanged
    service/grpc-service created
    
    # 查看创建状态
    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           50051/TCP   73s
    service/kubernetes     ClusterIP   10.96.0.1               443/TCP     11d
    
    # 出现以上情况说明一切就绪

    配置Higress路由规则

    在域名管理中创建域名(一定要配置为HTTPS协议):

    图片

    在路由配置中创建路由:

    图片

    目标服务选择:

    图片

    配置注解支持gRPC协议:

    $ kubectl edit ingress -n higress-system demo
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        higress.io/destination: grpc-service.default.svc.cluster.local:50051
        higress.io/ignore-path-case: "false"
        # 通过注解指定GRPC协议
        nginx.ingress.kubernetes.io/backend-protocol: GRPC
      creationTimestamp: "2023-10-17T02:13:50Z"
      generation: 2
      labels:
        higress.io/domain_demo.kubesre.com: "true"
        higress.io/resource-definer: higress
      name: demo
      namespace: higress-system
      resourceVersion: "57816"
      uid: 5ee0a7eb-8e8f-4b8f-ba8a-8b538fb573ce
    spec:
      ingressClassName: higress
      rules:
      - host: demo.kubesre.com
        http:
          paths:
          - backend:
              resource:
                apiGroup: networking.higress.io
                kind: McpBridge
                name: default
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - demo.kubesre.com
        secretName: kubesre-tls

    验证:

    $ grpcurl -insecure -authority demo.kubesre.com 127.0.0.1:443 list
    grpc.reflection.v1alpha.ServerReflection
    helloworld.Greeter
    
    # 出现如下情况,说明验证成功了,流量成功路由到了后端服务了!

    什么是WebSocket

    WebSocket是一种计算机通信协议,它提供了一种在客户端和服务器之间建立持久性连接的方式,允许双向实时数据传输。WebSocket的主要目的是解决HTTP协议的一些限制,如请求-响应模式和高延迟。以下是WebSocket的一些关键特点和用途:

  • 双向通信:WebSocket允许服务器和客户端之间进行双向通信,而不像HTTP那样需要每次都发起新的请求。
  • 持久连接:WebSocket连接是持久性的,一旦建立连接,它可以保持打开状态,以便随时发送或接收数据,而不必重新建立连接。
  • 实时性:由于WebSocket提供了低延迟的通信方式,它特别适合实时应用程序,如在线聊天、在线游戏和实时数据更新。
  • 轻量级:WebSocket协议相对较轻量,因此减少了通信开销和延迟。
  • 跨域通信:WebSocket支持跨域通信,这意味着可以在不同域名下的客户端和服务器之间建立连接。
  • 安全性:WebSocket可以通过加密来确保通信的安全性,类似于HTTPS协议
  • WebSocket通常用于实现各种实时Web应用程序,例如在线聊天、协作工具、在线游戏、股票市场报价、实时监控和通知系统等。它在那些需要实时数据传输和即时响应的场景中非常有用,因为它可以降低通信延迟,提供更好的用户体验。WebSocket通信建立在TCP协议之上,通常使用端口80(HTTP)或443(HTTPS)来传输数据。

    WebSocket示例应用部署

    部署示例版本:

    $ cat ws.yml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo-ws
      labels:
        app: demo-ws
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo-ws
      template:
        metadata:
          labels:
            app: demo-ws
        spec:
          containers:
          - name: demo-ws
            imagePullPolicy: Always
            image: registry.cn-shanghai.aliyuncs.com/kubesre01/demo-ws
            ports:
            - containerPort: 8090
    --- 
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-ws-svc
    spec:
      type: ClusterIP
      selector:
        app: demo-ws
      ports:
        - port: 8090
          targetPort: 8090
          
    # 执行创建操作
    $ kubectl apply -f ws.yml
    deployment.apps/demo-ws created
    service/demo-ws-svc created
    
    # 查看创建状态
    $ 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           8080/TCP    2m2s
    service/kubernetes     ClusterIP   10.96.0.1              443/TCP     82m
    
    # 出现以上情况说明一切就绪
    
    copiedcat ws.yml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo-ws
      labels:
        app: demo-ws
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo-ws
      template:
        metadata:
          labels:
            app: demo-ws
        spec:
          containers:
          - name: demo-ws
            imagePullPolicy: Always
            image: registry.cn-shanghai.aliyuncs.com/kubesre01/demo-ws
            ports:
            - containerPort: 8090
    --- 
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-ws-svc
    spec:
      type: ClusterIP
      selector:
        app: demo-ws
      ports:
        - port: 8090
          targetPort: 8090
          
    # 执行创建操作
    $ kubectl apply -f ws.yml
    deployment.apps/demo-ws created
    service/demo-ws-svc created
    
    # 查看创建状态
    $ 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           8080/TCP    2m2s
    service/kubernetes     ClusterIP   10.96.0.1              443/TCP     82m
    
    # 出现以上情况说明一切就绪

    配置Higress域名

    图片

    配置Higress路由规则

    Higress默认已支持WebSocket无需额外配置,并可以通过如下注解做些额外优化配置:

    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"

    创建路由:

    图片

    验证:通过ApiPost工具进行测试验证成功,Ws可以连接成功并可以成功收发消息!

    图片

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论