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调用之前注册的服务名/方法名的办法,并且传入参数进去。

相关推荐
小园子的小菜6 天前
Netty 核心组件 Channel、ChannelHandler 与简易 RPC 架构实战详解
网络协议·rpc·架构
聪明蛋子哟8 天前
高扩展性AI应用架构指南:融合RAG检索、Agent编排与OpenAPI/RPC工具网关的设计模式
人工智能·rpc·架构
小此方9 天前
C++ 工程组件与基础设施(三)详解RPC服务的概念与安装,图片介绍Brpc服务器和客户端的搭建过程
服务器·c++·rpc
笨鸟先飞的橘猫10 天前
混合流量导致 RPC 消息队列堆积
rpc·线上问题查证
阿正的梦工坊11 天前
深入理解 JSON-RPC 2.0:轻量级远程调用协议详解
rpc·json
进化中的刀盾兽13 天前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc
骑着蜗牛撵大象32716 天前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly
我不会起名字32217 天前
gRPC 拦截器写错:metadata 透传与超时注入的 3 个坑
微服务·go·grpc·拦截器
syagain_zsx18 天前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
mister_guo18 天前
HTTP 和 RPC:从一次干饭说清它们的区别
网络协议·http·rpc