GRPC
grpc是谷歌的rpc框架,通过一个小小的demo,理解一下其工作原理。构建一个java语言调度python语言组成的服务的这样一个demo,对grpc进行充分理解。
首先对于rpc其实之前有过学习,如下图所示:
服务端中的每个服务包含许多的方法,通过一个对外的IP以及端口对外提供服务,客户端即服务调用者在本地开放多个动态代理,在本地需要调度远程服务的时候,仅仅需要调度动态代理提供的服务,看起来貌似就是本地调用一样。。。
总得来说就是,服务端整合出一个服务模块对外提供服务,然后客户端通过动态代理的方式实现服务调用。一个服务一个动态代理,然后每个服务中可能存在不同的方法,因此服务中的方法通过不同的方法名进行区分。
接下来,分析一下,grpc的实现。
具体的实现参考:
服务以及服务中的方法的参数以及返回值的封装
在grpc中,存在一个.proto文件,运行这个文件会在服务端以及客户端生成一些文件,而这些文件就是对服务、服务中的方法以及方法中的各个参数的封装。
syntax = "proto3";
package com.jjw.grpc;
#服务名称,一个服务中包括多个方法,明确方法的参数类型以及返回值
service MsgService {
rpc GetMsg (MsgRequest) returns (MsgResponse){}
rpc two_add(addRequest) returns(addResponse){}
}
#magRequest是对GetMsg方法的参数的封装,
message MsgRequest {
#参数仅有一个String的name,并且这个参数是第一个位置
string name = 1;
}
message MsgResponse {
string msg = 1;
}
message addRequest{
#存在有两个参数,分别是int类型的a以及int类型的b,并且a是第一个参数,b是第二个参数
int32 a=1;
int32 b=2;
}
message addResponse{
int32 result=1;
}
之后运行这个文件就会生成两个文件,分别是msg_pd2以及msg_pb2_grpc,这两个文件分别封装了服务中各个方法以及方法中各个参数。以及一些通信调度的封装。
服务端
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
#定义一个服务,这个服务就是msg_pb2_MsgServiceServicer这个服务
class MsgServicer(msg_pb2_grpc.MsgServiceServicer):
#实现服务中的一个方法
def GetMsg(self, request, context):
#拿到请求的参数request
print("Received name: %s" % request.name)
#将结果封装到这个方法的返回参数中
return msg_pb2.MsgResponse(msg='Hello, %s!' % request.name)
def two_add(self,request,context):
print("服务端开始计算:"+str(request.a)+"+"+str(request.b)