大数据的特点主要包括哪些?
500
2024-04-26
rpc:开源高性能框架g:Google的缩写grpc:可以在任何环境中运行rpc框架
gRPC 协议是一个高性能、通用的开源RPC框架,其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。本文作者深入研究了 gRPC 协议,对协议本身作出解构。
gRPC 是基于 HTTP/2 协议的,要深刻理解 gRPC,理解下 HTTP/2 是必要的,这里先简单介绍一下 HTTP/2 相关的知识,然后再介绍下 gRPC 是如何基于 HTTP/2 构建的。
gRPC(gRPC Remote Procedure Call)是一种高性能、开源和通用的远程过程调用(RPC)框架,它基于Protocol Buffers(protoBuf)序列化协议并使用HTTP/2作为传输协议。
gRPC的原理可以从以下几个方面进行说明:
1. RPC基本原理:RPC通常基于客户端-服务器架构,它允许客户端应用程序像调用本地程序一样调用远程方法,而无需了解底层的网络细节。RPC通常包含四个组件:客户端调用对象、客户端存根、服务器存根和服务器执行对象。客户端调用对象向客户端存根发出调用请求,客户端存根将请求编码后通过网络传输给服务器存根,服务器存根将请求解码后转发到相应的服务器执行对象,然后执行结果被服务器执行对象返回给服务器存根,服务器存根将结果编码后通过网络传输给客户端存根,客户端存根将结果解码后返回给客户端调用对象。
2. Protocol Buffers协议:gRPC使用Protocol Buffers作为标准序列化协议,protocol buffers是Google开发的一种比XML和JSON更高效、更小巧、更简单的数据序列化协议,它能够将结构化数据进行序列化和反序列化,并且可以在不同的语言平台之间进行通讯。
3. HTTP/2协议:gRPC使用HTTP/2作为传输协议,HTTP/2具有多路复用、二进制分帧、头部压缩、流量控制等特性,这使gRPC具有高效、低延迟、节省带宽等优势。
4. 代码生成器:gRPC提供了一种简单的方式来定义服务和消息,用户可以使用.proto文件来定义服务和消息,然后使用grpc-tools代码生成器生成客户端和服务器端代码。代码生成器可以为多种编程语言生成对应的代码,不同编程语言对应不同的gRPC软件包,如C++、Java、Python等。
总之,gRPC的原理就是将Protocol Buffers序列化协议和HTTP/2传输协议结合起来,利用RPC基本原理,通过代码生成器生成对应的客户端和服务器端代码,最终实现高效、低延迟、跨语言的远程过程调用。
在当今大数据时代,数据量的增长极大地推动了分布式系统的发展。而grpc作为一种高性能、跨语言的远程过程调用(RPC)框架,正逐渐成为大数据处理中的热门选择。
在处理大数据量时,grpc具有以下优势:
然而,grpc在处理大数据量时也面临一些挑战:
总的来说,grpc在处理大数据量时具有明显的优势,但也需面对一些挑战。在应用场景中,需要根据具体需求权衡利弊,选择适合的方案。
感谢阅读这篇文章,希望能帮助您更好地了解grpc在处理大数据量时的优劣,为技术选型提供参考。
GRPC(gRPC Remote Procedure Calls,简称gRPC) 是谷歌开源的一款高性能、开源和通用的远程过程调用框架。它基于HTTP/2协议进行通信,使用Protocol Buffers作为接口描述语言,支持多种编程语言,包括Java。在本指南中,我们将探索如何在Java中使用gRPC进行开发。
gRPC与传统的RESTful API相比具有许多优势。首先,gRPC使用二进制协议进行通信,相对于文本协议的RESTful API,在性能上有着明显的优势。其次,gRPC支持自动化客户端代码生成,使得开发更加便捷。另外,gRPC还支持多种负载类型,如流式数据传输,使得在一些场景下更加灵活。
在Java中使用gRPC进行开发首先需要定义服务接口和消息类型。这些定义可以使用Protocol Buffers进行,定义好之后可以通过编译工具生成Java代码。接着可以实现服务接口并启动gRPC服务器,然后编写客户端代码来调用服务接口。
以下是一个简单的示例代码,演示了如何在Java中创建一个简单的gRPC服务和客户端:
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
在该示例中,定义了一个Greeter服务,包含一个SayHello方法,接收一个HelloRequest参数并返回一个HelloResponse参数。HelloRequest包含一个name字段,HelloResponse包含一个message字段。
要在Java项目中使用gRPC,首先需要在项目的build.gradle或pom.xml中添加gRPC的依赖。接着可以根据定义的.proto文件生成Java代码,在IntelliJ IDEA等IDE中可以安装gRPC插件来实现自动生成代码。最后可以根据生成的代码实现服务接口和客户端调用逻辑。
gRPC是一款强大的远程过程调用框架,可以帮助开发者构建高性能的分布式系统。在Java中使用gRPC可以让我们更加高效地构建服务端和客户端应用程序。通过本指南的学习,希望您能掌握如何在Java中入门使用gRPC,为您的项目开发带来便利和效率。
gRPC是一种高性能、开源的远程过程调用(RPC)框架,最初由谷歌开发。它使用基于HTTP/2的协议进行通信,提供了诸多优点,例如跨语言、高效、标准化、自动化工具生成等。本文将介绍如何在Java中使用gRPC进行开发,并探讨一些最佳实践。
gRPC是一种现代的、高性能的RPC框架,它基于HTTP/2协议,使用Protocol Buffers进行数据序列化。gRPC支持多种语言,包括Java、C++、Python等,使得不同语言之间的服务通信变得更加简单和高效。
在选择RPC框架时,gRPC具有以下优点:
要在Java中使用gRPC,您需要遵循以下步骤:
以下是一个简单的示例代码,演示了如何在Java中使用gRPC进行远程调用:
syntax = "proto3"; package helloworld; service Greeter { rpc SayHello (HelloRequest) returns (HelloResponse) {} } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; }在使用gRPC进行Java开发时,您可以考虑以下最佳实践:
通过本文的介绍,您应该对如何在Java中使用gRPC进行开发有了更深入的了解。gRPC作为一种高性能、跨语言的RPC框架,在微服务架构中发挥着重要作用。希望您能够通过本文掌握gRPC的基本原理和使用方法,并在实际项目中加以应用。
gRPC优缺点
优点
protobuf二进制消息,性能好/效率高(空间和时间效率都很不错)
proto文件生成目标代码,简单易用
序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种方式)
支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
支持多种语言(可以把proto文件看做IDL文件)
Netty等一些框架集成
缺点:
GRPC尚未提供连接池,需要自行实现
尚未提供“服务发现”、“负载均衡”机制
因为基于HTTP2,绝大部多数HTTP Server、Nginx都尚不支持,即Nginx不能将GRPC请求作为HTTP请求来负载均衡,而是作为普通的TCP请求。(nginx1.9版本已支持)
Protobuf二进制可读性差(貌似提供了Text_Fromat功能)
简单一点,HTTP是协议,RPC是概念!RPC可以基于HTTP协议(feign)、TCP协议(netty)、RMI协议(soap)和web服务(XML-RPC)框架实现。在传输过程中,由于序列化方法的不同,也出现了一些框架和协议,如Dubbo中的Dubbo协议、grpc protobuf序列化协议等。实际上,它们都是基于远程调用的概念。什么是远程呼叫?
关键是RPC是远程调用。远程调用是客户端通过上述协议向服务器发送接口、参数、参数类型、方法、返回值、返回值类型等(称为方法签名),通知服务器要调用的接口方法。这个过程就是RPC的实现过程!HTTP和RPC是两码事
!在性能方面,HTTP本身是基于TCP协议的,属于应用层协议,所以HTTP协议本身在实现过程中会占用大量的资源(内存、带宽等)。在性能方面,它肯定不如直接通过TCP实现的RPC协议快。不管HTTP有多优化,它绝对没有TCP那么快!
另一方面,TCP依赖于字节码。目前常用的是将客户端调用的接口信息以序列化的方式发送到服务器端。序列化框架包括许多内容(Hession、protobuf、kryo等)。Kryo具有最高的序列化性能,protobuf具有序列化后最小的字节码)。
序列化后的字节码越小,占用的带宽越小,序列化时间越长,线程IO延迟越短,线程IO延迟越小。因此,在具体的应用层,有很多技术可以讨论。您可以根据自己的硬件能力选择相应的技术
gRPC必须使用 HTTP/2 传输数据,支持明文和TLS加密数据,支持流数据的交互。充分利用 HTTP/2 连接的多路复用和流式特性。
技术选型
1、最早计划采用Netty来做,但由于gRPC的proto模板不是我们定义的,所以解析成本很高,另外还要读取请求Header中的数据,开发难度较大,所以这个便作为了备选方案。
2、另一种改变思路,往反向代理框架方向寻找,重新回到主流的Nginx这条线,但是nginx采用C语言开发,如果是基于常规的负载均衡策略转发请求,倒是没什么大的问题。但是,我们内部有依赖任务资源关系,也间接决定着要依赖外部的存储系统。
Nginx适合处理静态内容,做一个静态web服务器,但我们又看重其高性能,最后我们选型 Openresty
OpenResty? 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
户端 Stub(GreeterBlockingStub) 调用 sayHello(request),发起 RPC 调用;
通过 DnsNameResolver 进行域名解析,获取服务端的地址信息(列表),随后使用默认的 LoadBalancer 策略,选择一个具体的 gRPC 服务端实例;
如果与路由选中的服务端之间没有可用的连接,则创建 NettyClientTransport 和 NettyClientHandler,发起 HTTP/2 连接;
对请求消息使用 PB(Protobuf)做序列化,通过 HTTP/2 Stream 发送给 gRPC 服务端;
接收到服务端响应之后,使用 PB(Protobuf)做反序列化;
回调 GrpcFuture 的 set(Response) 方法,唤醒阻塞的客户端调用线程,获取 RPC 响应。