当前位置:首页 >休闲 >Ingress企业实战:实现GRPC与WebSocket服务访问 它们仍然可以相互通信

Ingress企业实战:实现GRPC与WebSocket服务访问 它们仍然可以相互通信

2024-06-28 10:57:29 [百科] 来源:避面尹邢网

Ingress企业实战:实现GRPC与WebSocket服务访问

作者:船长 开发 架构 gRPC支持多种编程语言,业实包括但不限于C++,战实 Java, Python, Go, Node.js, Ruby, C#,等。这意味着您可以使用不同的服务访问编程语言开发服务端和客户端,它们仍然可以相互通信。业实

什么是战实gRPC?

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

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

申请SSL证书

生成CA证书:

Ingress企业实战:实现GRPC与WebSocket服务访问 它们仍然可以相互通信

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

生成服务端证书:

Ingress企业实战:实现GRPC与WebSocket服务访问 它们仍然可以相互通信

# 生成服务端证书私钥$ 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.cerCertificate request self-signature oksubject=C = CN, ST = shanghai, L = shanghai, O = kubesre, OU = kubesre, CN = demo.kubesre.comEnter pass phrase for kubesre-ca.key: # 密码:12345678$ lltotal 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

创建证书Secret(证书基于Kubernetes Secret进行存储):

Ingress企业实战:实现GRPC与WebSocket服务访问 它们仍然可以相互通信

$ kubectl create secret tls  kubesre-tls --key kubesre-server.key --cert kubesre-server.cersecret/kubesre-tls created$ kubectl get secretNAME          TYPE                DATA   AGEkubesre-tls   kubernetes.io/tls   2      18s

gRPC示例应用部署

部署示例版本:

$ cat demo.ymlapiVersion: apps/v1kind: Deploymentmetadata:  name: grpc-servicespec:  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: v1kind: Servicemetadata:  name: grpc-servicespec:  ports:  - port: 50051    protocol: TCP    targetPort: 50051  selector:    run: grpc-service# 执行创建操作$ kubectl apply -f demo.ymldeployment.apps/grpc-service unchangedservice/grpc-service created# 查看创建状态kubectl get pods,svcNAME                                READY   STATUS    RESTARTS   AGEpod/grpc-service-56f784fcb5-n72hd   1/1     Running   0          81sNAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGEservice/grpc-service   ClusterIP   10.96.239.197   <none>        50051/TCP   73sservice/kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP     11d# 出现以上情况说明一切就绪

创建Ingress gRPC路由规则

$ cat demo-ingress.ymlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: grpc-ingress  annotations:    # 通过注解指定GRPC协议    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"spec:  ingressClassName: nginx  # 指定证书  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: 50051kubectl apply -f demo-ingress.ymlingress.networking.k8s.io/grpc-ingress created

验证:

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

什么是WebSocket

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

  1. 双向通信:WebSocket允许服务器和客户端之间进行双向通信,而不像HTTP那样需要每次都发起新的请求。
  2. 持久连接:WebSocket连接是持久性的,一旦建立连接,它可以保持打开状态,以便随时发送或接收数据,而不必重新建立连接。
  3. 实时性:由于WebSocket提供了低延迟的通信方式,它特别适合实时应用程序,如在线聊天、在线游戏和实时数据更新。
  4. 轻量级:WebSocket协议相对较轻量,因此减少了通信开销和延迟。
  5. 跨域通信:WebSocket支持跨域通信,这意味着可以在不同域名下的客户端和服务器之间建立连接。
  6. 安全性:WebSocket可以通过加密来确保通信的安全性,类似于HTTPS协议

WebSocket通常用于实现各种实时Web应用程序,例如在线聊天、协作工具、在线游戏、股票市场报价、实时监控和通知系统等。它在那些需要实时数据传输和即时响应的场景中非常有用,因为它可以降低通信延迟,提供更好的用户体验。WebSocket通信建立在TCP协议之上,通常使用端口80(HTTP)或443(HTTPS)来传输数据。

WebSocket示例应用部署

部署示例版本:

# 执行创建操作$ kubectl apply -f ws.ymldeployment.apps/demo-ws createdservice/demo-ws-svc created# 查看创建状态kubectl get pod,svcNAME                               READY   STATUS    RESTARTS   AGEpod/demo-ws-79bd8fbdc7-hml6q       1/1     Running   0          2m2sNAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGEservice/demo-ws-svc    ClusterIP   10.96.255.28   <none>        8080/TCP    2m2sservice/kubernetes     ClusterIP   10.96.0.1      <none>        443/TCP     82m# 出现以上情况说明一切就绪

创建Ingress WebSocket

Kubernetes Ingress Controller默认已支持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"
$ demo-ws-ingress.ymlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: demo-ws-ingressspec:  ingressClassName: nginx  rules:  - host: demo.kubesre.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: demo-ws-svc            port:              number: 8090# 创建WebSocket Ingress资源对象$ kubectl apply -f demo-ws-ingress.ymlingress.networking.k8s.io/demo-ws-ingress created# 查看状态$ kubectl get ingressNAME              CLASS   HOSTS              ADDRESS   PORTS   AGEdemo-ws-ingress   nginx   demo.kubesre.com             80      2m6s

Kubernetes Ingress Controller若默认不支持WebSocket可能是Ingress老版本,则可以通过如下方式进行配置(作为补充知识):

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  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官方),可以通过如下方式进行配置(作为补充知识):

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: demo-ws-ingress  annotations:    nginx.org/websocket-services: "demo-ws-svc" # 具体的服务名spec:  ingressClassName: nginx  rules:  - host: demo.kubesre.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: demo-ws-svc            port:              number: 8090

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

图片图片

总结

本文介绍了gPRC与WebSocket后端协议Ingress配置方法,并通过实际案例的方式讲解,下一章将讲解Ingress更多企业级实战,请敬请期待!

责任编辑:武晓燕 来源: 云原生运维圈 JavaC++Python

(责任编辑:热点)

    推荐文章
    热点阅读