欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Service Mesh - gRPC 本地联调远程服务

程序员文章站 2022-03-21 16:27:01
Description Service Mesh 架构下,服务间调用会通过服务名(Service Name)互相调用,比如在 Kubernetes 、Docker Swarm 集群中,服务 IP 均由集群动态分配,外部网络无法直接访问到集群内部的服务。对于大型系统,微服务的数量较多,服务间的调用关系 ......

Service Mesh - gRPC 本地联调远程服务

description

service mesh 架构下,服务间调用会通过服务名(service name)互相调用,比如在 kubernetes 、docker swarm 集群中,服务 ip 均由集群动态分配,外部网络无法直接访问到集群内部的服务。对于大型系统,微服务的数量较多,服务间的调用关系也错综复杂,遇到问题时,本地启动整个服务集群去 debug,不仅需要本地电脑有很高的配置,而且操作起来也比较麻烦。比较优雅一点的做法是本地启动相应服务,grpc 调用都连接到远程集群。

Service Mesh - gRPC 本地联调远程服务

nginx grpc module

nginx 版本 1.13.10 之后支持 grpc 反向代理,这样我们就能通过在集群中部署 nginx 服务,来连通外部网络和集群内的服务。

Service Mesh - gRPC 本地联调远程服务

kubernetes demo

1、deploy grpc server in kubernetes cluster

  • 首先,在 kubernetes 集群中部署镜像为 python:3 的容器,为下面的代码提供运行环境
  • 然后,克隆项目 https://github.com/chinasilence/python-grpc,执行 pip install python-grpc 安装依赖
  • 接着,在 python-grpc 目录下执行 python server/server.py,观察日志,等待 grpc server 启动成功
  • 最后,创建 kubernetes service,暴露 grpc 服务
kind: service
apiversion: v1
metadata:
  name: server-a-service
  namespace: default
spec:
  ports:
    - port: 6565
      targetport: 6565
  selector:
    app: server-a

2、deploy nginx grpc proxy in kubernetes cluster

以下内容包含 nginx config、nginx deployment 和 nginx service,提供了 grpc 请求的转发能力:

apiversion: v1
kind: configmap
metadata:
  name: nginx-grpc-proxy-config
  namespace: default
data:
  grpc.conf: |
    server {
        listen 6565 http2;
        server_name server-a-service;
        location / {
            grpc_pass grpc://server-a-service.default:6565;
        }
    }
---
apiversion: apps/v1
kind: deployment
metadata:
  name: nginx-grpc-proxy-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchlabels:
      app: nginx-grpc-proxy
  template:
    metadata:
      labels:
        app: nginx-grpc-proxy
    spec:
      containers:
        - name: nginx-grpc-proxy
          image: nginx:1.17
          ports:
            - containerport: 6565
          volumemounts:
            - mountpath: /etc/nginx/conf.d/
              name: nginx-config
      volumes:
        - name: nginx-config
          configmap:
            name: nginx-grpc-proxy-config
---
kind: service
apiversion: v1
metadata:
  name: nginx-grpc-proxy-service
  namespace: default
spec:
  ports:
    - port: 6565
      targetport: 6565
      nodeport: 30000
  selector:
    app: nginx-grpc-proxy
  type: nodeport

3、test local client connect remote server

  • 添加 host 记录:<k8s 公网 ip> server-a-service
  • 本地克隆项目 https://github.com/chinasilence/python-grpc,执行 pip3 install python-grpc 安装依赖(需要 python3 的环境)
  • python-grpc 下修改文件 client/client.py
servers = [server('test', '127.0.0.1', 6565)]
# 变更为
servers = [server('test', 'server-a-service', 30000)]
  • 执行 python3 client/client.py 测试远程调用是否正常(示例中包含正常调用和异常调用)

questions

多个远程 grpc 服务如何配置 nginx?

nginx 配置文件中添加多个 server 记录:

    server {
        listen 6565 http2;
        server_name server-a-service;
        location / {
            grpc_pass grpc://server-a-service.default:6565;
        }
    }
    server {
        listen 6565 http2;
        server_name server-b-service;
        location / {
            grpc_pass grpc://server-b-service.default:6565;
        }
    }

本地 host 需要添加相应的记录:

<k8s 公网 ip> server-a-service
<k8s 公网 ip> server-b-service

documents