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一般具备健康检查能力,能自动摘除不健康的服务实例。 该方案主要问题:
-
单点问题,所有服务调用流量都经过LB,当服务数量和调用量大的时候,LB容易成为瓶颈,且一旦LB发生故障影响整个系统;
-
服务消费方、提供方之间增加了一级,有一定性能开销。
2、进程内LB(Balancing-aware Client)
针对第一个方案的不足,此方案将LB的功能集成到服务消费方进程里,也被称为软负载或者客户端负载方案。服务提供方启动时,首先将服务地址注册到服务注册表,同时定期报心跳到服务注册表以表明服务的存活状态,相当于健康检查,服务消费方要访问某个服务时,它通过内置的LB组件向服务注册表查询,同时缓存并定期刷新目标服务地址列表,然后以某种负载均衡策略选择一个目标服务地址,最后向目标服务发起请求。LB和服务发现能力被分散到每一个服务消费者的进程内部,同时服务消费方和服务提供方之间是直接调用,没有额外开销,性能比较好。该方案主要问题:
-
开发成本,该方案将服务调用方集成到客户端的进程里头,如果有多种不同的语言栈,就要配合开发多种不同的客户端,有一定的研发和维护成本;
-
另外生产环境中,后续如果要对客户库进行升级,势必要求服务调用方修改代码并重新发布,升级较复杂。
3、独立 LB 进程(External Load Balancing Service)
该方案是针对第二种方案的不足而提出的一种折中方案,原理和第二种方案基本类似。
不同之处是将LB和服务发现功能从进程内移出来,变成主机上的一个独立进程。主机上的一个或者多个服务要访问目标服务时,他们都通过同一主机上的独立LB进程做服务发现和负载均衡。该方案也是一种分布式方案没有单点问题,一个LB进程挂了只影响该主机上的服务调用方,服务调用方和LB之间是进程内调用性能好,同时该方案还简化了服务调用方,不需要为不同语言开发客户库,LB的升级不需要服务调用方改代码。
该方案主要问题:部署较复杂,环节多,出错调试排查问题不方便。
gRPC服务发现及负载均衡实现
gRPC开源组件官方并未直接提供服务注册与发现的功能实现,但其设计文档已提供实现的思路,并在不同语言的gRPC代码API中已提供了命名解析和负载均衡接口供扩展。
其基本实现原理:
-
服务启动后gRPC客户端向命名服务器发出名称解析请求,名称将解析为一个或多个IP地址,每个IP地址标示它是服务器地址还是负载均衡器地址,以及标示要使用那个客户端负载均衡策略或服务配置。
-
客户端实例化负载均衡策略,如果解析返回的地址是负载均衡器地址,则客户端将使用grpclb策略,否则客户端使用服务配置请求的负载均衡策略。
-
负载均衡策略为每个服务器地址创建一个子通道(channel)。
-
当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求,当可用服务器为空时客户端的请求将被阻塞。
根据gRPC官方提供的设计思路,基于进程内LB方案(即第2个案,阿里开源的服务框架 Dubbo 也是采用类似机制),结合分布式一致的组件(如Zookeeper、Consul、Etcd),可找到gRPC服务发现和负载均衡的可行解决方案。
相关推荐
4. **GRPC介绍**:GRPC是一种基于HTTP/2协议的高性能、开源的RPC框架,它使用Protocol Buffers作为接口定义语言,支持多种编程语言,提供了强类型、双向流和高效率的服务调用。 5. **Kafka-GRPC桥接**:在“Kafka-...
1. **gRPC介绍**:gRPC是一个跨平台的高性能框架,用于构建微服务架构。它提供了一种简单的方式来定义服务接口,允许客户端和服务器之间进行双向通信。gRPC的核心是基于HTTP/2,这使得请求和响应可以并行处理,提高...
6. **gRPC安全特性**:介绍gRPC的TLS加密和身份验证机制,以及如何配置SSL/TLS证书来确保通信安全。 7. **gRPC负载均衡**:探讨如何利用gRPC的负载均衡功能,优化服务的扩展性和可用性,包括客户端负载均衡和服务器...
本文将详细介绍如何在Visual Studio 2022(VS2022)环境下,利用MinGW编译GRPC库,包括Debug和Release版本,并生成对应的头文件以及protoc编译器。 首先,确保你已经安装了以下组件: 1. Visual Studio 2022:下载...
这本书深入浅出地介绍了gRPC的基础知识,通过真实的案例帮助读者理解这个高性能的进程间通信协议在微服务架构中的应用。gRPC不仅能够连接多语言服务,还提供了一个丰富的框架来定义服务合同和数据类型。书中包含用Go...
gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。 特点: ...
在本文中,我们将详细介绍如何使用Maven来搭建一个gRPC Java项目,并提供一个简单的示例。gRPC是一个高性能、开源的通用RPC框架,它利用Protocol Buffers作为接口定义语言。Maven是Java项目管理和构建的工具,对于...
本教程将详细介绍如何在C#环境中手动和自动创建GRPC服务,以及如何配合相关文档和示例(demo)进行实践。 一、GRPC基础 GRPC的核心概念是服务定义,它通过.proto文件来描述服务和消息类型。这些.proto文件可以被...
介绍 本项目为 Snowflake 算法在 gRPC 中的实现,server 采用 Golang 编写,示例 client 采用 PHP 编写(client/)。 使用方法(Server) 编译 macOS/Linux 执行 ./build.sh Windows 执行: ./build.bat 编译后的可...
描述中的链接指向了一篇 CSDN 博客文章,详细介绍了如何构建和使用 gRPC 示例。博客中可能包括了以下知识点: 1. **gRPC 基础**:首先,你需要了解 gRPC 的基本概念,如服务定义(.proto 文件)、协议缓冲区...
本文将围绕“GRPCdemo.zip”这个压缩包,详细介绍如何在iOS项目中集成GRPC以及其核心知识点。 首先,我们需要了解GRPC的基础概念。GRPC基于ProtoBuf(Protocol Buffers)定义服务接口,这是一种数据序列化协议,...
gRPC 是一个高性能、开源和通用的 RPC (远程过程调用) 框架,它基于...以上就是gRPC框架的基本介绍和相关知识点,通过这个“gRPC_1.34.zip”文件,开发者可以快速搭建和使用gRPC服务,实现高效、安全的分布式系统通信。
下面将详细介绍如何在Android项目中配置和使用gRPC。 1. **gRPC基本概念**: - **ProtoBuf (Protocol Buffers)**:Google的一种数据序列化协议,用于定义服务接口和数据结构,生成跨平台、跨语言的数据交换格式。 ...
本文将详细介绍 GRPC-Java 源码环境构建的步骤和过程,旨在帮助读者快速搭建 GRPC-Java 源码环境。 一、Clone GRPC-Java 源码 GRPC-Java 源码可以通过 Git 克隆的方式获取,命令如下: git clone ...
同时,官方文档会详细介绍如何配置、编译和运行gRPC应用。 总的来说,GRPC_win64_install.zip为Windows上的C++开发人员提供了一个便捷的起点,他们可以借此搭建gRPC环境,实现高性能的分布式应用通信。通过深入学习...
书中首先介绍了gRPC的基本概念,包括服务定义、服务器端和客户端的构建以及消息流的工作方式。它对比了传统的RPC、SOAP、REST等通信技术,阐述了gRPC的优势,如高效、安全、可扩展性,并提到了像Netflix、etcd和...
通过以上介绍,我们可以看到gRPC-go在Go语言中的重要地位,它简化了分布式系统的通信,提升了开发效率和系统的性能。对于开发者而言,理解和掌握gRPC-go的使用和原理,是提升项目质量和效率的关键。
在本教程中,我们将详细介绍如何在您的系统上安装gRPC环境,编译gRPC项目,配置gRPC与Oracle数据库的连接,并通过OCCI进行测试。 首先,让我们了解gRPC的工作原理。gRPC基于RPC(Remote Procedure Call)模型,允许...
9. **文档**:除了源代码,项目可能还包含 README 文件,介绍如何使用和贡献项目,以及 API 文档,解释各种接口和类的用法。 10. **社区支持**:开源项目通常有活跃的社区,用户可以在论坛或 GitHub 上提问、分享...