gRPC 框架 简单使用(python版)

一、gRPC 简介

概述

gRPC是搭建分布式应用接口和客户端的框架。在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,可以更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务器相同的方法。

在这里插入图片描述

gRPC 客户端和服务器可以在各种环境中运行和相互通信——从 Google 内部的服务器到您自己的桌面——并且可以用任何 gRPC 支持的语言编写。例如,可以使用 Go、Python 或 Ruby 中的客户端轻松地调用在 Java 中创建 gRPC 服务器。



协议缓冲区

协议缓冲区, 是谷歌开源的结构化数据结构。

协议缓冲区中的数据和服务定义,可以参考:协议缓冲区

例如,在 proto 文件中定义 gRPC 服务,将 RPC 方法参数和返回类型指定为协议缓冲区消息:

// 定义服务
service Greeter {
	// 发送消息
	rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 包含用户名的请求消息
message HelloRequest {
	string name = 1;
}

// 包含问候的响应信息
message HelloReply {
	string message = 1;
}

使用在proto中定义的服务和数据结构,可以使用gRPC的插件来生成对应的grpc文件。



二、gRPC 的 Hello World

gRPC可以使用多种语言编写,下面使用python来实现一个简单的gRPC服务端和客服端。

一般来说写gRPC服务,需要三个文件:

  • .proto文件:用于生成gRPC服务文件。
  • server文件:定义 gRPC 服务端。
  • client文件:定义 gRPC 客户端,调用服务端接口。

基本环境如下:

  • python 3.10.2

在这里插入图片描述



协议缓冲区

定义协议缓冲区,新建一个hello.proto文件,写入以下内容:

syntax = "proto3";

package hello;

message User {
	string id = 1;
	string name = 2;
}

message Reply {
	string message = 1;
}

service UserInfo {
	rpc Info (User) returns (Reply) {}
}

这个文件首先定义了两个数据结构,一个是用户的详细信息User,一个是用户信息格式化输出。

需要注意的是当一个message中定义多个变量时,赋值的编号不能相同,如User中的id和name分别是1和2。

然后定义了一个简单的服务UserInfo,将User传入,最后返回Reply(注意是returns,加了s)

最后使用gRPC的工具包,生成gRPC服务类:

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./hello.proto

它会生成两个文件hello_pb2.pyhello_pb2_grpc.py.

大致可以理解为:_pb2中定义了数据结构。_pb2_grpc中定义了相关的方法。

具体的含义可以去看:生成代码参考



gRPC 服务端

如下,定义 gRPC 服务端hello_server.py,并堵塞监测本地50051端口,等待接收数据:

from concurrent import futures
import logging

import grpc
import hello_pb2
import hello_pb2_grpc

class UserInfo(hello_pb2_grpc.UserInfoServicer):
	def Info(self, request, context):
		return hello_pb2.Reply(message='id: %s; name: %s' % (request.id, request.name))

def serve():
	server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
	hello_pb2_grpc.add_UserInfoServicer_to_server(UserInfo(), server)
	server.add_insecure_port('[::]:50051')
	server.start()
	server.wait_for_termination()

if __name__ == '__main__':
	logging.basicConfig()
	serve()



gRPC 客户端

如下,定义 gRPC 客户端hello_client.py,通过接收参数,向本地50051端口,传输用户信息:

from __future__ import print_function

import logging, sys

import grpc
import hello_pb2
import hello_pb2_grpc


def run():
	with grpc.insecure_channel('localhost:50051') as channel:
		stup = hello_pb2_grpc.UserInfoStub(channel)
		response = stup.Info(hello_pb2.User(id=sys.argv[1],name=sys.argv[2]))
	print("用户信息: " + response.message)

if __name__ == '__main__':
	logging.basicConfig()
	run()



启动 gRPC

启动gRPC服务端 :

python hello_server.py

在另一个终端窗口中,启动gRPC客户端:

python hello_client.py 1 zhangsan

最后查看效果:

在这里插入图片描述





更多的用法可以参考:

gRPC 官方python教程

gRPC 官方API

协议缓冲区官方文档(需要魔法)

### gRPC框架设计原则与架构 gRPC是一种高性能、开源的远程过程调用(Remote Procedure Call, RPC框架,旨在实现服务间的高效通信。该框架支持多种编程语言,并提供强大的功能来简化分布式系统的开发。 #### 协议缓冲区(Protocol Buffers) 作为默认的数据交换格式,协议缓冲区是Google的一种轻量级序列化结构体数据格式[^2]。它允许定义消息和服务接口,在不同平台上自动生成客户端和服务器存根代码。通过这种方式,开发者可以专注于业务逻辑而不是底层网络细节。 #### 客户端-服务器模型 在gRPC中,客户端应用程序能够像调用本地对象一样直接调用另一台机器上的远程进程中的函数,使得构建分布式的微服务体系更加容易。当一个gRPC客户端想要访问由另一个gRPC服务器提供的资源时,会发送HTTP/2请求到目标地址并附带所需的操作参数;而接收方则解析这些信息执行相应的处理操作后再返回响应给发起者[^4]。 #### 流式传输特性 除了基本的一次性请求回复模式外,gRPC还特别强调流式API的支持——即双向连续的消息传递机制。这不仅限于简单的单向或多路复用连接,还包括全双工流形式,其中双方都可以独立地随时发送任意数量的信息包直到完成整个交互流程为止。 ```python import grpc class MyServiceServicer(grpc.MyServiceServicer): async def StreamMethod(self, request_iterator, context): async for message in request_iterator: yield process_message(message) def serve(): server = grpc.aio.server() add_MyServiceServicer_to_server(MyServiceServicer(), server) ... ``` #### 多运行时环境兼容性 随着多运行时微服务架构的发展趋势日益明显,gRPC也逐渐成为这一领域的重要组成部分之一。这种新型体系结构允许多种不同的技术栈共存于同一个应用内部,从而提高了灵活性以及可维护性的同时降低了耦合度[^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力生活的黄先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值