`
gaojingsong
  • 浏览: 1154653 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【gRPC 介绍】

阅读更多

RPC 框架原理

RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

RPC 框架的调用原理图如下所示:



 

 

 

业界主流的 RPC 框架整体上分为三类:

支持多语言的 RPC 框架,比较成熟的有 Google 的 gRPC、Apache(Facebook)的 Thrift。

只支持特定语言的 RPC 框架,例如新浪微博的 Motan。

支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是 RPC 框架。例如阿里的 Dubbo。

 

 

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

研究gRPC之前,需要先熟悉Protocol Buffers

Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。现阶段支持C++、JAVA、Python等三种编程语言。

 

 

gRPC服务发现&负载均衡

构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案:

1、集中式LB(Proxy Model)



 

在服务消费者和服务提供者之间有一个独立的LB,通常是专门的硬件设备如 F5,或者基于软件如 LVS,HAproxy等实现。LB上有所有服务的地址映射表,通常由运维配置注册,当服务消费方调用某个目标服务时,它向LB发起请求,由LB以某种策略,比如轮询(Round-Robin)做负载均衡后将请求转发到目标服务。LB一般具备健康检查能力,能自动摘除不健康的服务实例。 该方案主要问题:

  1. 单点问题,所有服务调用流量都经过LB,当服务数量和调用量大的时候,LB容易成为瓶颈,且一旦LB发生故障影响整个系统;

  2. 服务消费方、提供方之间增加了一级,有一定性能开销。

2、进程内LB(Balancing-aware Client)



 

针对第一个方案的不足,此方案将LB的功能集成到服务消费方进程里,也被称为软负载或者客户端负载方案。服务提供方启动时,首先将服务地址注册到服务注册表,同时定期报心跳到服务注册表以表明服务的存活状态,相当于健康检查,服务消费方要访问某个服务时,它通过内置的LB组件向服务注册表查询,同时缓存并定期刷新目标服务地址列表,然后以某种负载均衡策略选择一个目标服务地址,最后向目标服务发起请求。LB和服务发现能力被分散到每一个服务消费者的进程内部,同时服务消费方和服务提供方之间是直接调用,没有额外开销,性能比较好。该方案主要问题:

  1. 开发成本,该方案将服务调用方集成到客户端的进程里头,如果有多种不同的语言栈,就要配合开发多种不同的客户端,有一定的研发和维护成本;

  2. 另外生产环境中,后续如果要对客户库进行升级,势必要求服务调用方修改代码并重新发布,升级较复杂。

3、独立 LB 进程(External Load Balancing Service)



 

该方案是针对第二种方案的不足而提出的一种折中方案,原理和第二种方案基本类似。
不同之处是将LB和服务发现功能从进程内移出来,变成主机上的一个独立进程。主机上的一个或者多个服务要访问目标服务时,他们都通过同一主机上的独立LB进程做服务发现和负载均衡。该方案也是一种分布式方案没有单点问题,一个LB进程挂了只影响该主机上的服务调用方,服务调用方和LB之间是进程内调用性能好,同时该方案还简化了服务调用方,不需要为不同语言开发客户库,LB的升级不需要服务调用方改代码。 
该方案主要问题:部署较复杂,环节多,出错调试排查问题不方便。

gRPC服务发现及负载均衡实现

gRPC开源组件官方并未直接提供服务注册与发现的功能实现,但其设计文档已提供实现的思路,并在不同语言的gRPC代码API中已提供了命名解析和负载均衡接口供扩展。

其基本实现原理:

  1. 服务启动后gRPC客户端向命名服务器发出名称解析请求,名称将解析为一个或多个IP地址,每个IP地址标示它是服务器地址还是负载均衡器地址,以及标示要使用那个客户端负载均衡策略或服务配置。

  2. 客户端实例化负载均衡策略,如果解析返回的地址是负载均衡器地址,则客户端将使用grpclb策略,否则客户端使用服务配置请求的负载均衡策略。

  3. 负载均衡策略为每个服务器地址创建一个子通道(channel)。

  4. 当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求,当可用服务器为空时客户端的请求将被阻塞。

根据gRPC官方提供的设计思路,基于进程内LB方案(即第2个案,阿里开源的服务框架 Dubbo 也是采用类似机制),结合分布式一致的组件(如Zookeeper、Consul、Etcd),可找到gRPC服务发现和负载均衡的可行解决方案。

  • 大小: 45.1 KB
  • 大小: 33.8 KB
  • 大小: 43 KB
  • 大小: 37.1 KB
0
0
分享到:
评论

相关推荐

    snowflake-grpc:Snowflake gRPC服务器(Golang)和客户端(PHP)

    介绍 本项目为 Snowflake 算法在 gRPC 中的实现,server 采用 Golang 编写,示例 client 采用 PHP 编写(client/)。 使用方法(Server) 编译 macOS/Linux 执行 ./build.sh Windows 执行: ./build.bat 编译后的可...

    gRPC 之 .NET 6 中的使用介绍

    gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。 特点: ...

    C#语言使用gRPC、protobuf(Google Protocol Buffers)实现文件传输功能

     关于gRPC和Protobuf介绍,就不介绍了,网络上一搜一大把,随便一抓都是标准的官方,所以直接从使用说起。  gPRC源代码:https://github.com/grpc/grpc;  protobuf的代码仓库: github仓库地址:...

    gRPC详细入门教程,GolangPythonPHP多语言讲解.pdf

    阿⾥出品,也是⼀个微服务框架 gRPC的特性 的特性 看的介绍,有以下4点特性: 1. 使⽤Protocal Buffers这个强⼤的结构数据序列化⼯具 2. grpc可以跨语⾔使⽤ 3. 安装简单,扩展⽅便(⽤该框架每秒可达到百万个RPC) ...

    golang grpc demo

    基于golang 得 grpc demo,介绍,使用方法请参考博客,项目目录结构在docs目录下

    gRPC使用文档

    gRPC中文使用文档,详细介绍在java C++ python中gRPC的使用

    GRPC入门及简单使用介绍

    GRPC是由Google提供的一个高性能、通用性强的RPC开源框架,它主要面向移动应用开发。

    gRPC文档.rar

    gRPC中文文档,包含PDF、docx、HTML三中文件格式,文档详细介绍了如何使用gRPC

    node-v57-linux-x64-glibc/grpc_node.node

    当执行fabric-composer介绍文档中的./createPeerAdminCard.sh脚本后如果出现Cannot find module '/home/user/.nvm/versions/node/v8.11.3/lib/node_modules/composer-cli/node_modules/grpc/src/node/extension_...

    generator-jhipster-grpc:JHipster模块,增加了对gRPC的支持并生成gRPC CRUD服务

    介绍 这是一个模块,打算在JHipster应用程序中使用。 警告:正在开发中。 请参阅限制和待办事项清单 先决条件 由于这是一个模块,我们希望您已经安装了JHipster及其相关工具: 安装 要安装此模块: npm install -g...

    graphql-grpc-helidon:使用Helidon围绕GraphQL和gRPC进行实验

    本文介绍了用Java实现的GraphQL和gRPC。 对于相同的用例,我将向您展示如何公开和实现这些协议。 我使用一个简单的用例,而不只是一个表的用例...好吧,只有一个具有一对一关系的2个表。 为了撰写本文,我使用 ...

    Nginx配置代理gRPC的方法

    本文介绍如何配置Nginx的gRPC。 安装Nginx Nginx版本要求:1.13.10。 gRPC必须使用HTTP/2传输数据,支持明文和TLS加密数据,支持流数据的交互。这是为了充分利用 HTTP/2 连接的多路复用和流式特性。所以在安装部署...

    rfid-trf7970-grpc

    rfid-trf7970-grpc 介绍 该存储库提供了一个gRPC接口,可与TI的TRF7970 RFID模块进行交互。 它是用Rust编写的。 建造 确保已安装防锈装置。 rustup --version

    gRPC-nestjs-dart-example:一个使用nestJS作为后端和Dart作为客户端的gRPC示例

    WIP :gRPC NestJS和Dart示例 在后端使用NestJS(Typescript)和... gRPC将自己介绍为“ [...]高性能,开源通用RPC框架”,其优点是“ [...]高级流和连接功能,可帮助节省带宽,通过更少的TCP连接执行更多操作并节省

    grpc-python-go:通过gRPC的客户端服务器实现

    介绍 这是使用gRPC进行序列化和传输的客户端服务器实现。 gRPC基础 使用进行序列化。 这意味着您的数据结构被编码为字节并准备传输 使用 tcp协议进行传输,这保证了交付 服务 Go服务将收集指标(虚拟) Python服务...

    ASP.NET Core 3.0 gRPC拦截器的使用

    前面两篇文章给大家介绍了使用gRPC的入门以及双向流的使用,今天介绍的是gRPC中的拦截器。拦截器就像MVC的过滤器或者是ASP.NET Core middleware 一样,具有面向切面的思想,可以在调用服务的时候进行一些统一处理, ...

    grpc-cmake-template:gRPC的CMake模板

    介绍 该存储库是使用C ++项目的CMake模板。 以下是示例中使用的主要gRPC功能: 从客户端发出gRPC请求。 在grpc服务器上处理客户端请求 设定提出要求的期限。 使用运行状况检查监视gRPC服务器状态。 制作说明 注意:...

    grpc 在golang 介绍 (2)

    上一章我们简单介绍了一下grpc 概念方面的信息,这一章我们具体学习grpc 在golang的知识。 源码地址: https://github.com/grpc/grpc-go/tree/master/examples/route_guide 关于protocol buffers 的相关信息我们...

    Python使用gRPC传输协议教程

    gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android...

    图析ASP.NET Core引入gRPC服务模板

    gRPC的简单介绍 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。 有关 gRPC 基础知识的详细信息,请参阅 gRPC 文档页。 gRPC 的主要优点是: 现代高性能轻量级 RPC 框架。 协定优先 API 开发,默认使用...

Global site tag (gtag.js) - Google Analytics