grpc初体验(python)

源码地址

rpc杂谈

  1. 第一次接触到rpc(远程过程调用,可以让多种不同的编程语言之间顺利通信)是在大学毕业后工作的时候,当时感觉很牛逼这个框架,但事实证明它确实很牛逼,所以后来我决定,一定要把它整明白(虽然现在才懂了一半,但我会死磕到底的)。
  2. 就目前我接触到的rpc框架有zeroc-ice、grpc(是谷歌的一个远程过程调用框架),其中zeroc-ice是通过slice语言将定义好的ice借口编译成对应语言可以调用的借口,grpc与zeroc-ice则不一样,它用的是用protocol buffer 编译器在进行编译。
  3. 今天初次体验了下grpc,感觉还不错

grpc初体验(在开发者头条上看到它的)

  • GRPC尚未提供连接池
  • 尚未提供“服务发现”、“负载均衡”机制
  • 因为基于HTTP2,绝大部多数HTTP Server、Nginx都尚不支持,即Nginx不能将GRPC请求作为HTTP请求来负载均衡,而是作为普通的TCP请求。(nginx将会在1.9版本支持)
  1. 安装grpc
pip install grpcio
# 或者
pip install grpcio
# 在 El Capitan OSX 系统下可能会看到以下报错
$ OSError: [Errno 1] Operation not permitted: '/tmp/pip-qwTLbI-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
# 可以使用以下命令
python -m pip install grpcio --ignore-installed
  1. 安装 gRPC tools
Python gPRC tools 包含 protocol buffer 编译器和用于从 .proto 文件生成服务端和客户端代码的插件

pip install grpcio-tools

python实现一个简单的grpc调用

  1. 先声明借口文件(有点类似zeroc-ice中的xxx.ice文件,里面都是一堆接口)
// 文件名 hello.proto
//指定编译时用proto3来进行编译
syntax = "proto3";

//这个hello就是编译后文件xxx_pb2.py,xxx_hello_pb2_grpc.py;xxx也就是此处的hello
package hello;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  //这里的SayHello可以理解为后面我们的服务端要重写的函数,也就是我们所谓的远程调用的接口
  //最后客户端来调用这个接口
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

用python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto来进行编译

生成了两个文件:

  • hello_pb2.py 此文件包含生成的 request(HelloRequest) 和 response(HelloReply) 类。

  • hello_pb2_grpc.py 此文件包含生成的 客户端(GreeterStub)和服务端(GreeterServicer)的类。

  • 当用protocol buffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。

  1. 实现server端
import time
from concurrent import futures

import grpc

import hello_pb2
import hello_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 12


class Greeter(hello_pb2_grpc.GreeterServicer):
    # 实现GreeterServicer中的远程接口
    def SayHello(self, request, context):
        return hello_pb2.HelloReply(message='Hello abc, %s!' % request.name)


def serve():
    # gRPC 服务器
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), 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()
  1. 实现客户端
from __future__ import print_function

import grpc

import hello_pb2
import hello_pb2_grpc


def run():

    channel = grpc.insecure_channel('localhost:50051')
    #调用客户端类
    stub = hello_pb2_grpc.GreeterStub(channel)
    # 调用远程接口
    response = stub.SayHello(hello_pb2.HelloRequest(name='goodspeed'))
    print("Greeter client received: " + response.message)


if __name__ == '__main__':
    run()

  1. 开启服务端,让客户端来调用

你可能感兴趣的:(rpc大法,python)