grpc和consul结合实现分布式rpc调用

GRPC

主要介绍了grpc在使用示例和原理,以及如何与consul结合

gRPC 是什么?

gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得我们能够更容易地创建分布式应用和服务。

参考文档:gRPC Python Quickstart

开始前确保已经安装grpcio-tools和grpcio这两个包

定义一个GRPC有如下三个步骤:

  1. 定义一个消息类型
  2. 编译该proto文件
  3. 编写服务端代码
  4. 编写客户端代码

我们以实现一个echo的grpc为例。

定义一个消息类型

首先定义通信双方(即客户端和服务端)交互的消息格式(protobuf消息的格式),然后定义该echo服务
如下:

syntax = "proto3";  // 声明使用 proto3 语法

//  定义客户端请求的protobuf格式,如下所示,包含一个字符串字段q
message Req {
    string q = 1;
}

//  定义服务端相应的protobuf格式,如下所示,包含一个字符串字段a
message Resp {
    string a = 1;
}

//  定义echo服务,如下所示,该服务包含一个名称为"echo"的rpc
service Echoer{
    rpc echo (Req) returns (Resp) {}
}

使用以下命令编译:

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

生成两个py文件

  • Echoer_pb2.py 此文件包含生成的 request(Req) 和 response(Resp) 类。
  • Echoer_pb2_grpc.py 此文件包含生成的 客户端(EchoerStub)和服务端(EchoerServicer)的类

创建服务端代码

创建和运行 Echoer 服务可以分为两个部分:

  • 实现我们服务定义的生成的服务接口:做我们的服务的实际的“工作”的函数。
  • 运行一个 gRPC 服务器,监听来自客户端的请求并传输服务的响应。

在当前目录,创建文件 Echoer_server.py,实现一个新的函数:

from concurrent import futures
import time

import grpc

import Echoer_pb2
import Echoer_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class Echoer(Echoer_pb2_grpc.EchoerServicer):
	# 工作函数
    def SayHello(self, request, context):
        return Echoer_pb2.Resp(a="echo")


def serve():
    # gRPC 服务器
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    Echoer_pb2_grpc.add_EchoerServicer_to_server(Echoer(), server)
    server.add_insecure_port('[::]:50051')
    server.start()  # start() 不会阻塞,如果运行时你的代码没有其它的事情可做,你可能需要循环等待。
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()

创建客户端代码

在当前目录,打开文件 Echoer_client.py,实现一个新的函数:

from __future__ import print_function

import grpc

import Echoer_pb2
import Echoer_pb2_grpc


def run():
    channel = grpc.insecure_channel('localhost:50051') # 创建信道
    stub = Echoer_pb2_grpc.EchoerStub(channel) # 通过信道获取凭据,即Stub
    response = stub.echo(Echoer_pb2.Req(q='echo')) # 调用rpc,获取响应
    print("Echoer client received: " + response.a)

if __name__ == '__main__':
    run()

运行代码

首先运行服务端代码

python Echoer_server.py

复制代码
然后运行客户端代码

python Echoer_client.py
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值