grpc框架 java,grpc框架可以做什么
Grpc原理以及调用grpc框架grpc建立连接、寻址、序列化和反序列化grpc特性的过程。grpc和restful动手环境准备原型文件、服务器文件、客户端文件。
Grpc原理
GRPC是Google推出的一个高性能、开源、通用的RPC框架。它是基于HTTP/2设计的,面向服务器和移动。
rpc框架的全称是Remote Procedure Call,即远程调用服务器的方法,将服务器端的请求变成本地的方法调用。它屏蔽了底层传输模式(TCP/UDP)、序列化模式(XML/Json/binary)和通信细节。它可以看作是数据传输、序列化和通信的一层封装。服务调用者可以像本地接口一样调用远程服务,而不关心底层的通信细节和调用过程。
具体流程如下:
Rpc框架分为3类:
多语言PRC框架,如Google和Thrift的gRPC阿帕奇(脸书)相对成熟。
支持特定语言的RPC框架,比如Motan新浪微博的;
支持服务治理等面向服务特性的分布式服务框架底层内核仍然是RPC框架,比如阿里的Dubbo。
其实实现远程调用就是把远程调用方法的接口放在本地,用户可以通过访问本地接口来访问远程调用方法。流程如下:
Grpc在这个过程中使用http/2协议建立连接。与http1.x相比,其特点是采用了新的二进制格式、复用和头压缩。所有这些特点都有利于提高传输效率。
寻址是由调用者提供要调用的方法、对方的网络地址和端口。当然,这些细节会在gRPC框架内进行映射:只要通过gRPC调用本地方法,就会自动向对方请求,这个过程是透明的。
网络传输的序列化和反序列化都是二进制流的形式。因为本地序列化方法和远程反序列化方法都是对应的,所以安全性也有保证。即使有人截获了中间信息,也只能得到二进制数据。与http请求不同,这将考虑中间人攻击等问题。
为了提高序列化和反序列化的效率,gRPC采用protobuf格式,比普通的json和xml具有更高的压缩效率。
grpc 1的特点。支持多种语言
2.基于IDL文件定义服务,用proto3工具生成指定语言的数据结构。
3.基于HTTP/2设计,支持双向流、头压缩、复用、服务器端推送等特性,从而节省移动设备上的流量。
4.序列化支持PB和JSON。PB是一个独立于语言的高性能序列化框架,基于HTTP/2 PB,保证了RPC调用的高性能。
5.服务不是通过反射实现的,而是通过proto tool生成的代码实现的,性能更好。
Grpc和restful REST描述了网络中客户端和服务器之间的一种交互形式;休息本身就不实用。实用的是如何设计RESTful API。
REST全称资源表象状态转移:一般来说,网络中资源以某种形式的状态转移。
资源:资源,即数据,可以理解为url资源。
具象化:某种表现形式,如JSON、XML、JPEG等。
状态转移:状态改变。由HTTP动词实现。获取、发布、删除等。
Restful和grpc是服务器和客户端交互的常见方式。RESTful通常使用http JSON或XML格式传输信息,gRPC使用protobuf传输信息。proto将提供更严格的接口约束,更高的安全性,更适合高并发场景。但是grpc的可读性不如restful。
Restful通过公开服务接口来提供接口调用,但是使用grpc,其服务的接口会放在客户端。因为restful使用http,需要三次握手建立连接,所以效率会比restful快。
操作grpc是一个rpc框架,所以要实现数据通信、序列化和反序列化,需要生成proto文件自动完成序列化和反序列化代码。
环境#安装grpc工具pip安装grpcio-tools proto文件hello.proto文件代码如下:
语法= proto3//表示使用proto3版本语法Message Hello Request {//Message是proto3中最基本的结构类型,可以类比python中的类,定义Message类string name=1;//里面的字段也是一个} message hello response { string name 2=2,强制先说明字段类型;//是否返回status }service PageService {//开始定义可以本地调用的方法。在这里,服务可以理解为远端提供的服务。定义服务类//声明函数方法,也就是提供的服务。函数名为hello,参数为helloRequest。返回类型为helloresponserpc hello (hello请求)returns (hello响应){}}序列化和反序列化代码由grpc工具自动完成。
python-m grpc _ tools . protoco-I././protos-python _ out=.-grpc _ python _ out=./.protos/hello.proto然后写服务器端文件,需要实现hello _ pb _ grpc.py中服务类声明的功能。
服务器文件hello_server.py文件内容如下:
import grpc import hello _ Pb2 import hello _ Pb2 _ grp from并发导入futures # #用于初始化grpc.server对象。使用# #继承proto工具自动生成的代码中的servericer类。class server(hello _ Pb2 _ grpc . hello service):def hello(self,request,context): # #返回proto文件中定义的消息类,否则会造成响应消息序列化失败的问题。返回Hello _ Pb2。hello Response(name 2= welcome request . name)DefServer():# #初始化grpc.server对象,Deploy server=grpc . server(futures . thread pool executor(max _ workers=10))# #绑定生成的grpc。服务器对象hello _ Pb2 _ grpc . add _ hello service servicer _ to _ Server(Server())与实现服务器端函数的服务器实例Server) ##将监听套接字地址Server . add _ insert _ port([:]:50050 )绑定到服务##启动服务server.start() ##等待线程关闭Server . Wait _ for _ termination()if _ _ name _== _ _ main .
import grpc import hello _ Pb 2 ashlow _ _ Pb 2 import hello _ Pb2 _ grpc def run():#生成一个通道对象,Socket channel=grpc . insert _ channel( localhost:50050 )#用于连接远程服务器提供服务。存根位于客户端,客户端通过grpc存根获取service stub=hello _ Pb2 _ grpc . hello servicestub(channel)# #以请求service RES=stub . hello(hello _ _ Pb2 . hello request(name= hXV ))print(RES)if _ _ name _= _ _ main _ _
1.stub:它是一个存储远程服务接口的对象,需要用grpc进行初始化。通道对象,客户端使用该通道连接到grpc服务器。
2 .服务器:位于服务器端,服务器需要服务器端提供的类进行初始化,通过GRPC服务器而不是服务本身来公开服务。
3.注册函数:注册函数,向服务器提供服务函数的服务器注册grpc.server对象。
Proto文件通常定义消息和服务的类别,然后使用grpc工具自动生成代码。
GRPC的客户端(stub)和服务器通过Netty通道相互通信,Protobuf用于序列化和反序列化。每个请求都将被封装到HTTP2流中。在整个生命周期中,客户端通道应该保持一个长连接,而不是每次都重新创建通道,并在响应后关闭通道(即短连接和交互式RPC)。目的是重用链接,提高交互效率。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。