• 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
    

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

  • 相关阅读:
    JCTF 2014(Reverse)
    JCTF 2014(Misc)
    实验吧CTF题库-密码学(部分)
    第四章 Jinja2模版
    第三章 URL与视图
    flask学习导航主页
    flask调试模式
    rontab踩坑(三):crontab定时任务调度机制与系统时间/时区的不一致
    crontab踩坑(二):Unit crond.service could not be found.
    crontab踩坑(一)
  • 原文地址:https://www.cnblogs.com/Paul-watermelon/p/11338019.html
Copyright © 2020-2023  润新知