gRPC快速入门记录

为什么使用grpc

1.protocl buffer一种高效的序列化结构。
2.支持http 2.0标准化协议。

http/2

1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的处理多个请求和响应,而且做到不相互影响。
2.允许客户端和服务端实现自己的数据流和连接流控制,这对我们传输大数据非常有帮助。

安装 grpc 与 protobuf 解释器

这里我们需要使用 protobuf 解释器 将 protobuf 语法的代码转化成对应语言的代码,以及使用 grpc 实现跨越性,所以我们需要先安装它们。
本教程中只会用到 python3 以及 golang ,所以我们只安装这两个语言的解释器就足够了

python3 安装 grpc 与 protobuf

安装 grpc 库

pip3 install grpcio

安装 grpc 工具 以及 protobuf 解释器

pip3 install grpcio-tools googleapis-common-protos

go 安装 grcp 与 protobuf

安装 grpc 库:

go get -u -v google.golang.org/grpc

然后从 https://github.com/protocolbuffers/protobuf/releases 下载 与你操作系统对应的 protobuf 解释器,这里选择的 linux64 进行下载
首先新建一个目录用来容纳下载安装包解压后的文件,并进入目录

mkdir protobuf && cd protobuf

下载 protobuf 解释器

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip

解压缩下载的文件

unzip protoc*.zip

删除刚才下载好的压缩包

rm protoc*.zip

移动 protobuf 目录到 ~/.local

mv ~/protobuf/ ~/.local/

将 protobuf 的可执行文件添加进系统变量

echo "PATH=\"\$HOME/.local/protobuf/bin:\$PATH\"" >> ~/.profile

安装 protobuf go 语言的插件

go get -u github.com/golang/protobuf/protoc-gen-go

将插件添加进系统变量

echo "PATH=\$PATH:\$GOPATH/bin" >> ~/.profile

然后使用 cd 命令回到用户根目录

cd

使用 grpc

创建本次使用的工程目录

创建工程目录并进入目录

mkdir $GOPATH/src/demo && cd $GOPATH/src/demo

编写 proto 文件

proto 文件为 protobuf 的扩展名,我们编写这个文件用于生成 python 与 go 都支持的代码。
这里我们再新建一个目录用来容纳 proto 文件以及 使用 protobuf 编译器转化过的代码
创建目录并进入目录

mkdir hello && cd hello

接下来开始编写 proto 文件,这里我们新建一个 名为 hello.proto 的文件并在里面写入以下内容

syntax = "proto3"; //指定语法为 protobuf3 语法,如果不写这句的话默认语法为 protobuf2
package hello; //指定包名,这句在本次演示中只对 go 生效,python 的 protobuf 解释器会忽略它

service Greeter { // 定义grpc 远程调用的方法
        rpc SayHello (HelloRequest) returns (HelloReply) {} // 接受 HelloRequest 返回 HelloReply,SayHello 需要自己在服务端实现
}

message HelloRequest { //定义一个消息类型
        string name = 1; //定义 name 字段为 string 类型 tag 为 1
}

message HelloReply {
        string message = 1;
}

完成后保存并退出编辑

生成对应语言的代码

编辑好 proto 文件后我们并不能直接使用它,还需要将它转化成对应语言的代码才能使用
生成 go 语言的代码

protoc hello.proto --go_out=plugins=grpc:.

生成 python 的代码

python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. hello.proto

然后我们回到 demo 工程目录,开始真正的 代码编写

cd ..

编写服务端

服务端端这里我采用的 go 语言进行编写
创建一个名为 server.go 的文件并写入以下内容

package main

import (
    "context"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    "log"
    "demo/hello"
    "net"
)

const (
    port = ":50051" // 监听端口
)

type server struct{}

func (s *server) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloReply, error) { // 服务端实现 proto 中定义的方法
    return &hello.HelloReply{Message: "Hello " + in.Name}, nil //拼接客户端发送过来的消息,并返回给客户端
}

func main() {
    lis, err := net.Listen("tcp", port) // 启动监听
    if err != nil {
            log.Fatalf("failed to listen: %v", err)        }

    s := grpc.NewServer()
    hello.RegisterGreeterServer(s, &server{})
    reflection.Register(s) // 在 grpc 上注册服务
    if err := s.Serve(lis); err != nil { //启动服务并处理错误
            log.Fatalf("failed to server: %v", err)        }
}

编写 客户端

客户端我采用的 python3 进行编写
创建一个名为 client.py 的文件写入以下内容

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import grpc # 导入 grpc 模块

import sys
sys.path.append('hello') # 将 hello 目录临时添加进环境变量,不然接下来的导入会失败

import hello_pb2 #导入我们刚才从 helloWorld.proto 生成的 python 代码
import hello_pb2_grpc


def run():
    with grpc.insecure_channel('localhost:50051') as channel: # 创建连接到服务端的通道
        stub = hello_pb2_grpc.GreeterStub(channel) #创建提供调用的存根
        response = stub.SayHello(hello_pb2.HelloRequest(name = 'niconiconi')) #调用 SayHello 方法 发送我们刚才在 proto 文件中定义的字段,返回我们在 proto 中定义的返回值
        print("Greeter client received: " + response.message) #打印返回值


if __name__ == '__main__':
    run()

运行 grpc 服务端与客户端

首先我们启动服务端

go run server.go

使用 CTRL + z 将 正在运行的服务端挂起在后台,然后使用 bg命令使挂起的 程序继续运行。
接下来运行我们编写的客户端

python3 client.py

不出意外的话你的屏幕上应该会打印

Greeter client received: Hello niconiconi

到这里 演示就全部结束了。

转载于:https://www.cnblogs.com/Paul-watermelon/p/11338019.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gRPC 是一种高性能、开源的 RPC 框架,支持多种编程语言。在 Python 中,我们可以使用 gRPC 提供远程过程调用服务。 以下是在 Python使用 gRPC 的基本步骤: 1. 安装 gRPC使用 pip install grpcio 命令安装 gRPC。 2. 定义服务和消息:使用 proto3 编写 .proto 文件,定义服务和消息。 3. 生成代码:使用 protoc 命令生成 Python 代码。 4. 实现服务:在 Python 中实现服务端和客户端。 5. 启动服务:启动服务端程序。 6. 调用服务:在客户端程序中调用远程服务。 以下是一个简单的示例,演示如何在 Python使用 gRPC: 1. 定义服务和消息 ```protobuf syntax = "proto3"; package helloworld; // 定义消息 message HelloRequest { string name = 1; } message HelloReply { string message = 1; } // 定义服务 service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } ``` 2. 生成代码 使用以下命令生成 Python 代码: ```bash python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto ``` 3. 实现服务 在 Python 中实现服务端和客户端。 ```python import grpc import helloworld_pb2 import helloworld_pb2_grpc class Greeter(helloworld_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': serve() ``` ```python import grpc import helloworld_pb2 import helloworld_pb2_grpc def run(): with grpc.insecure_channel('localhost:50051') as channel: stub = helloworld_pb2_grpc.GreeterStub(channel) response = stub.SayHello(helloworld_pb2.HelloRequest(name='world')) print("Greeter client received: " + response.message) if __name__ == '__main__': run() ``` 4. 启动服务 在终端中运行以下命令启动服务: ```bash python greeter_server.py ``` 5. 调用服务 在终端中运行以下命令调用服务: ```bash python greeter_client.py ``` 以上是在 Python使用 gRPC 的基本步骤。在生产环境中,我们需要考虑更多的实现细节,例如错误处理、认证和安全等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值