Description

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

Nginx gRPC Module

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

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

Service Mesh - gRPC 本地联调远程服务的更多相关文章

  1. 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代

    Linkerd 提供了许多功能,如:自动 mTLS.自动代理注入.分布式追踪.故障注入.高可用性.HTTP/2 和 gRPC 代理.负载均衡.多集群通信.重试和超时.遥测和监控.流量拆分(金丝雀.蓝/ ...

  2. 唯品会的Service Mesh三年进化史

    每种架构风格,都会因各公司面临的情况不同而有不同的实现路线,Service Mesh也不例外,比如江南白衣描述的唯品会的服务化体系开放服务平台OSP(Open Service Platform)走的S ...

  3. Service Mesh服务网格新生代--Istio(转)

    万字解读:Service Mesh服务网格新生代--Istio  官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...

  4. 【转帖】使用了 Service Mesh 后我还需要 API 网关吗?

    使用了 Service Mesh 后我还需要 API 网关吗? https://www.kubernetes.org.cn/6762.html api gateway和istio 是不一样的 追求不一 ...

  5. 解开Service Mesh的神秘面纱

    一.什么是Service Mesh? 下面是 Willian Morgan 对 Service Mesh 的解释: A Service Mesh is a dedicated infrastructu ...

  6. Service Mesh 介绍

    传统单体应用的局限性说明 传统单体应用代码体量庞大繁杂,不利于理解,也不利于团队合作开发,更不利于频繁更新和部署,增加服务宕机的风险. 耦合性高,功能代码块之前很容易造成强依赖,只要其中任何一个代码逻 ...

  7. Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序

    一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...

  8. 了解 Linkerd Service Mesh 架构

    从较高的层次上看,Linkerd 由一个控制平面(control plane) 和一个 数据平面(data plane) 组成. 控制平面是一组服务,提供对 Linkerd 整体的控制. 数据平面由在 ...

  9. 解读2017之Service Mesh:群雄逐鹿烽烟起

    https://mp.weixin.qq.com/s/ur3PmLZ6VjP5L5FatIYYmg 在过去的2016年和2017年,微服务技术得以迅猛普及,和容器技术一起成为这两年中最吸引眼球的技术热 ...

随机推荐

  1. linux特殊权限(acl)

    建立用户目录       创建目录/oldboy/tech./oldboy/edu,分别用于不同项目组添加组账号       添加组账号tech.edu,GID分别设置为1001.1002      ...

  2. zcat|subprocess.check_all|subprocess.Popen|gzip|readline()

    #!/usr/bin/python from subprocess import check_call import subprocess import gzip ''' $ zcat 160121_ ...

  3. 什么是CDN

    1.什么是cdn    cdn全称是内容分发网络.其目的是让用户能够更快速的得到请求的数据.简单来讲,cdn就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据.举个例子,现在服务器 ...

  4. python学习笔记(12)常用模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  5. [LC] 692. Top K Frequent Words

    Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...

  6. UMLet的使用与类图的设计

    本实验是为后续实验做准备的.在本书中,各个程序实例都要画类图,所以读者必须掌握用某种UML建模工具来画类图,本书选择 UMLet 作为 UML 的建模工具.实验目的本实验的主要目的如下. 理解类的基本 ...

  7. python-django框架-电商项目-项目部署_20191127

    python-django框架-电商项目-项目部署: uwsgi作为web服务器: 在pycharm中启动项目:使用python manage.py runserver 这个runserver是dja ...

  8. [LC] 92. Reverse Linked List II

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  9. 吴裕雄--天生自然HTML学习笔记:HTML <div> 和<span>

    HTML <div> 和<span> HTML 可以通过 <div> 和 <span>将元素组合起来. HTML 区块元素 大多数 HTML 元素被定义 ...

  10. 吴裕雄--天生自然HTML学习笔记:HTML 链接

    HTML 链接 HTML 使用超级链接与网络上的另一个文档相连.几乎可以在所有的网页中找到链接.点击链接可以从一张页面跳转到另一张页面. HTML 超链接(链接) HTML使用标签 <a> ...