gRPC入门小结
gRPC是什么
首先要知道RPC是什么:Remote Procedure Call的简称,翻译成中文就是远程过程调用。
RPC主要是为了解决以下俩个问题:
-
解决分布式系统中,服务之间的调用问题。
-
远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统,g有global的意思
在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,能够更加容易的创建分布式应用和服务。
常见的RPC框架有:
-
gRPC。谷歌出品
-
Thrift。Apache出品
-
Dubbo。阿里出品,也是一个微服务框架
gRPC的4点特性:
-
使用Protocal Buffers这个强大的结构数据序列化工具
-
grpc可以跨语言使用
-
安装简单,扩展方便(用该框架每秒可达到百万个RPC)
-
基于HTTP2协议
gRPC使用流程:
-
定义标准的proto文件
-
生成标准代码
-
服务端使用生成的代码提供服务
-
客户端使用生成的代码调用服务
protocol buffers是什么
谷歌开源的一种结构数据序列化的工具,比方说JSON、XML也是结构数据序列化的工具,不同的是,
-
Protocol Buffers序列化后的数据是不可读的,因为是二进制流
-
使用Protocol Buffer需要事先定义数据的格式(.proto 协议文件),还原一个序列化之后的数据需要使用到这个数据格式
-
Protocol Buffer 比 XML、JSON快很多,因为是基于二进制流,比字符串更省带宽,传输速度快
基于python的代码实践(健身房服务)
目录结构:
grpc_test
protos
gym.proto
lightweight
(generated_files)
client.py
server.py
gym.proto
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
syntax = "proto3"; //命名空间 package lightweight; //健身房 service Gym { rpc BodyBuilding (Person) returns (Reply) { } } //谁在健身 message Person { string name = 1; repeated string actions = 2; } //结果 message Reply { int32 code = 1; string msg = 2; }
python -m grpc_tools.protoc -I=./protos --python_out=./lightweight --grpc_python_out=./lightweight ./protos/gym.proto
server.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from concurrent import futures import logging import grpc # 支持新的包 import sys sys.path.append("lightweight") import lightweight.gym_pb2_grpc as gym_pb2_grpc import lightweight.gym_pb2 as gym_pb2 class Gym(gym_pb2_grpc.GymServicer): def BodyBuilding(self, request, context): print(f"{request.name}在健身, 动作: {list(request.actions)}") return gym_pb2.Reply(code=0, msg='ok') def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) gym_pb2_grpc.add_GymServicer_to_server(Gym(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': logging.basicConfig() serve()
client.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from __future__ import print_function import logging import grpc # 支持导入新的包 import sys sys.path.append("lightweight") import lightweight.gym_pb2_grpc as gym_pb2_grpc import lightweight.gym_pb2 as gym_pb2 def run(): with grpc.insecure_channel('localhost:50051') as channel: stub = gym_pb2_grpc.GymStub(channel) response = stub.BodyBuilding(gym_pb2.Person( name='chenqionghe', actions=['深蹲', '卧推', '硬拉'] )) print(f'code: {response.code}, msg:{response.msg}') if __name__ == '__main__': logging.basicConfig() run()
如何调试gRPC