微服务离不开gRPC。现在大多数企业都会使用微服务作为他们的软件架构。在这种架构的背景下,微服务框架和协议广泛流行,RPC也随之流行起来。grpc是一个基于RPC的框架,具有高性能和广泛的应用。grpc由Google开发和维护,支持几乎所有主流编程语言。无论你使用Java、Python、Go、Ruby等,都可以用它来实现远程服务。ProtocolBuffersgrpc默认使用protocolbuffers作为序列化传输格式。通常,传输的数据类型存储在扩展名为.proto的普通文本文件中。请求和响应数据都必须满足此处定义的数据要求。.例如,在进行用户验证时,往往需要传入登录用户信息,服务器返回token值和对应的proto文件描述。如果请求或响应的数据量太大,一次获取不到,可以通过流信息不断的传输。这时候在类前面加上stream关键字。//login.protoserviceUser{//登录rpcLogin(LoginReqeust)returns(LoginReply){}//streamrpcGetImage(LoginRequest)return(streamLoginReply){}}//登录请求数据消息LoginReqeust{stringusername=1;字符串密码=2;}//登录响应数据消息LoginReply{stringtoken=1;字符串味精=2;}proto文件生成gPRC代码以Python为例,需要先安装Python相关的包。pipinstallgrpciopipinstallgrpcio-tools对应生成Python代码的命令。注意-I表示proto文件所在的子目录:python-mgrpc_tools.protoc--python_out=。--grpc_python_out=。-Iprotoslogin.proto输入命令后,目录下会多出两个文件,一个叫login_pb2.py,上报请求和响应相关的数据格式,另一个叫login_pb2_grpc.py,其中包括客户端和响应类。生成的login_pb2.grpc.py中的代码...创建gRPC服务创建接口需要上面生成的UserServicer类。importlogin_pb2_grpcimportlogin_pb2classUser(login_pb2_grpc.UserServicer):defLogin(self,request,context):returnlogin_pb2.LoginReply(msg=f"hello,{request.username}",token="Itismytoken")运行服务:importgrpcfromconcurrentimportfuturesdefserve():server=grpc.server(futures.ThreadPoolExecutor(max_workers=10))login_pb2_grpc.add_UserServicer_to_server(User(),server)server.add_insecure_port('[::]:50051')server.start()server.wait_for_termination()serve()创建gRPC客户端一个例子:importgrpcdefrun():withgrpc.insecure_channel('localhost:50051')aschannel:stub=login_pb2_grpc.UserStub(channel)响应=斯图b.Login(login_pb2.LoginRequest(username='you',passwd="123"))print("Clientreceived:"+response.msg)protocolbuffer转成json客户端得到响应结果后,可以通过class属性获取字段:response.msgresponse.token有时候我们会把它转成json格式,方便获取整个response。这时候可以使用protobuf库,先安装:pipinstallprotobuf然后使用转成json格式的方法。.从google.protobuf.json_formatimportMessageToJsonimportjsondefrun():withgrpc.insecure_channel('localhost:50051')作为通道:stub=login_pb2_grpc.UserStub(channel)response=stub.Login(login_pb2.LoginRequest(username='你',passwd="123"))print(json.loads(MessageToJson(response)))
