gRPC微服务搭建(学习阶段1:极简服务端&客户端)

gRPC 是由 Google 开源的一款高性能、跨语言的远程过程调用(RPC)框架,因为它是目前主流的框架,因此博主准备开始学习这个框架,并且基于此框架构建一套微服务

安装必须的第三方库:

py 复制代码
pip install grpcio

文章目录

gRPC的程序分为两个部分,一个是服务端,一个是客户端,这里博主整理了一个简单的示例程序,方便学习:

服务端代码

py 复制代码
import json
from concurrent import futures
import grpc


# 客户端的请求
def say_hello(request, _context):
    return {"message": f"Hello, {request['name']}!"}


# ================== 开始服务端的配置 ======================
# 创建 gRPC 服务,并使用线程池处理客户端请求。
server = grpc.server(futures.ThreadPoolExecutor(max_workers=2))

# 注册 SayHello 方法,同时指定请求和响应的 JSON 转换方式。
handler = grpc.unary_unary_rpc_method_handler(
    say_hello,
    request_deserializer=lambda data: json.loads(data.decode("utf-8")),
    response_serializer=lambda response: json.dumps(response).encode("utf-8"),
)

# 注册服务名称和方法名称,客户端必须使用相同的名称调用。
server.add_generic_rpc_handlers(
    (grpc.method_handlers_generic_handler("hello.Greeter", {"SayHello": handler}),)
)

# 启动 gRPC 服务,监听 50051 端口。
server.add_insecure_port("[::]:50051")
server.start()
print("gRPC 服务已启动:127.0.0.1:50051")

# 阻塞直到主动退出
server.wait_for_termination()

这里就定义了一个简单的gRPC的服务:

  1. 它启动2个线程
  2. 注册了一个"hello.Greeter"的服务名,这个服务下有个"SayHello"的方法(唯有方法名对外暴露),如果客户端调用这个方法,那么它被指引的执行函数是后面的handler

客户端代码

对应的客户端代码:

py 复制代码
import json
import grpc

# 连接地址必须和 server.py 中的端口一致。
with grpc.insecure_channel("127.0.0.1:50051") as channel:
    # 指定要调用的服务方法:/服务名/方法名。
    say_hello = channel.unary_unary(
        "/hello.Greeter/SayHello",
        # 发送请求前:Python 字典转换为 JSON 字节。
        request_serializer=lambda data: json.dumps(data).encode("utf-8"),
        # 收到响应后:JSON 字节转换为 Python 字典。
        response_deserializer=lambda data: json.loads(data.decode("utf-8")),
    )

    # 发送名称,并获取服务端返回的问候消息。
    response = say_hello({"name": "World"})
    print(response["message"])

这个客户端便是使用grcp调用之前注册的服务名/方法名的办法,并且传入参数进去。

相关推荐
念何架构之路18 小时前
go-grpc使用
rpc·golang
曼巴UE58 天前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5
EatFan9 天前
gRPC 为什么比 HTTP+JSON 快?详细讲解gRPC
后端·微服务·grpc
代码小学僧9 天前
从 0 到 1,记录我的第一个出海 SaaS 独立开发项目
前端·rpc·音视频开发
步行cgn14 天前
Spring 注入内部 Bean 详解
java·spring·rpc
z_mazin20 天前
逆向一种私有二进制序列化格式:从零到字节级解析器
网络·python·网络协议·算法·rpc
++==23 天前
RPC:grpc的使用与安装、server和client的使用示例、lsb_relese、自定制协议(LVC)+protobuf的RPC调用框架的实现
网络·网络协议·rpc
Misnearch24 天前
gRPC详解
grpc
码匠许师傅24 天前
【设计模式精讲】21.迭代器模式(Iterator)
c++·设计模式·rpc·迭代器模式·软件工程·uml