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

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
- http://nginx.org/en/docs/http/ngx_http_grpc_module.html
- https://www.nginx.com/blog/nginx-1-13-10-grpc/
Service Mesh - gRPC 本地联调远程服务的更多相关文章
- 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代
Linkerd 提供了许多功能,如:自动 mTLS.自动代理注入.分布式追踪.故障注入.高可用性.HTTP/2 和 gRPC 代理.负载均衡.多集群通信.重试和超时.遥测和监控.流量拆分(金丝雀.蓝/ ...
- 唯品会的Service Mesh三年进化史
每种架构风格,都会因各公司面临的情况不同而有不同的实现路线,Service Mesh也不例外,比如江南白衣描述的唯品会的服务化体系开放服务平台OSP(Open Service Platform)走的S ...
- Service Mesh服务网格新生代--Istio(转)
万字解读:Service Mesh服务网格新生代--Istio 官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...
- 【转帖】使用了 Service Mesh 后我还需要 API 网关吗?
使用了 Service Mesh 后我还需要 API 网关吗? https://www.kubernetes.org.cn/6762.html api gateway和istio 是不一样的 追求不一 ...
- 解开Service Mesh的神秘面纱
一.什么是Service Mesh? 下面是 Willian Morgan 对 Service Mesh 的解释: A Service Mesh is a dedicated infrastructu ...
- Service Mesh 介绍
传统单体应用的局限性说明 传统单体应用代码体量庞大繁杂,不利于理解,也不利于团队合作开发,更不利于频繁更新和部署,增加服务宕机的风险. 耦合性高,功能代码块之前很容易造成强依赖,只要其中任何一个代码逻 ...
- Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序
一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...
- 了解 Linkerd Service Mesh 架构
从较高的层次上看,Linkerd 由一个控制平面(control plane) 和一个 数据平面(data plane) 组成. 控制平面是一组服务,提供对 Linkerd 整体的控制. 数据平面由在 ...
- 解读2017之Service Mesh:群雄逐鹿烽烟起
https://mp.weixin.qq.com/s/ur3PmLZ6VjP5L5FatIYYmg 在过去的2016年和2017年,微服务技术得以迅猛普及,和容器技术一起成为这两年中最吸引眼球的技术热 ...
随机推荐
- day16-封装(私有静态属性、私有属性、私有方法、类方法、静态方法)
# 一: class P: __age = 30 #私有静态属性 def __init__(self,name): self.__name = name #私有属性:属性名前面加上双下划线是私有属性. ...
- 吴裕雄--天生自然python学习笔记:抓取网络公开数据
当前,有许多政府或企事业单位会在网上为公众提供相关的公开数据.以 http://api.help.bj.cn/api/均 .cn/api /网站为例,打开这个链接,大家可以看到多种可供调用的数据 . ...
- Java生成随机图片验证码
前台html代码 [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 <div style="margin-top: 50px;&quo ...
- mysql数据库-进阶-长期维护
############### 视图 ############## """ 1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有 ...
- django框架进阶-cookie和session-长期维护
############### python基础回顾:装饰器 ################ # 装饰器非常重要,1是写代码的时候,2是面试的时候,没有python开发不问装饰器的, # ...
- 三、RabbitMQ安装
安装前准备 Linux版本信息: 发行版本:CentOS Linux release 7.5.1804 (Core) 内核版本:Linux version 3.10.0-862.el7.x86_64 ...
- leetcode第38题:报数
这是一道简单题,但是我做了很久,主要难度在读题和理解题上. 思路:给定一个数字,返回这个数字报数数列.我们可以通过从1开始,不断扩展到n的数列.数列的值为前一个数列的count+num,所以我们不断叠 ...
- svn安装使用1(转载)
SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...
- Windows Server 2012 R2 强制卸载域控制器
本次实验要演示的是强制卸载域控制器并且在其他域控制器上删除不需要的服务器对象,这种情况在现实的生产使用环境中经常使用,每个企业每年都会有增减域控制器的时候,而且在减少了域控制器之后,原本的域还会继续使 ...
- Tomcat源码解析-启动过程分析之主干流程
Tomcat启动入口就在脚本startup.sh中,具体脚本可以看tomcat的源码,这个启动脚本主要用来判断环境,找到catalina.sh脚本路径,将启动参数传递给catalina.sh执行.ca ...