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

相关推荐
笨鸟先飞的橘猫17 小时前
skynet——RPC 超时机制优化方案
游戏·rpc·skynet
9624562 天前
Go EVM 链上数据平台实践:从 RPC Demo 到可演进架构
rpc·架构·golang
我不会起名字3223 天前
负载均衡选错:轮询在长连接下的偏斜问题
微服务·负载均衡·grpc·长连接
打工仔折腾 AI3 天前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
小楼昨夜又东风1264 天前
一文理清K8s PVC挂载完整流程
容器·rpc·kubernetes
青柠之夏cc4 天前
Laravel服务容器底层原理揭秘
javascript·rpc·laravel
墨神谕8 天前
RPC框架与HTTP REST的区别
网络协议·http·rpc
殷色玫瑰10 天前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc
进化中的刀盾兽10 天前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
进化中的刀盾兽11 天前
从零实现 C++ Json-Rpc(八):补齐 detail.hpp——JSON 封装与请求 ID 生成
c++·rpc