grpc-go的环境搭建及入门

(一)环境搭建


1.安装protoc工具

地址:https://github.com/protocolbuffers/protobuf/releases

找到需要的版本,windows的下载protoc-3.12.4-win64.zip(版本可自行选择)

或protoc-3.12.4-win32.zip(版本可自行选择),找个地方解压,然后将bin加入path


2.安装protoc-gen-go 插件

地址:https://github.com/protocolbuffers/protobuf-go

下载成功后,然后进入 protobuf-go\cmd\protoc-gen-go 目录

执行go install ,此时protoc-gen-go已经安装在gopath/bin 目录下了


3.安装protoc-gen-go-grpc 插件

地址:https://github.com/grpc/grpc-go

下载成功后,进入grpc-go\cmd\protoc-gen-go-grpc目录

执行go install 此时protoc-gen-go-grpc已经安装在gopath/bin 目录下了


至此环境搭建已经成功了,需要注意的是,本人已将gopath加入path环境变量,如果不加入的话,可以自行将相关插件加入path


(二)入门


1.搭建server端


找个地方建个server文件夹(不要放在gopath下面)

进入server目录执行go mod init server (建立module)

在server目录下面建个pb文件夹(此文件夹放.proto文件)

在pb文件夹下面建个arith.proto文件,内容如下:

syntax = "proto3";

package pb;

option go_package = ".;pb";

message ArithRequest {

    double  num1 = 1;

    double  num2 = 2;

}

message ArithResponse {

    double result = 1;

}

service Arith {

    rpc multiply (ArithRequest) returns (ArithResponse);   

    rpc divide (ArithRequest) returns (ArithResponse);

}

在pb目录下执行

protoc --go_out=. --plugin=grpc .\arith.proto

protoc --go-grpc_out=requireUnimplementedServers=false:. .\arith.proto

以上两条是根据proto文件自动生成go文件,至于proto的书写规则,去网上看看就知道了

回到server目录下,建个server.go文件,内容如下:

package main

import (

    "context"

    "errors"

    "log"

    "net"

    "server/pb"

    "google.golang.org/grpc"

)

type Arith struct{}

//乘法

func (m *Arith) Multiply(ctx context.Context, req *pb.ArithRequest) (resp *pb.ArithResponse, err error) {

    resp = new(pb.ArithResponse)

    resp.Result = req.Num1 * req.Num2

    return resp, nil

}

// 除法

func (m *Arith) Divide(ctx context.Context, req *pb.ArithRequest) (resp *pb.ArithResponse, err error) {

    resp = new(pb.ArithResponse)

    if req.Num2 == 0 {

        return nil, errors.New("the dividend is 0")

    }

    resp.Result = req.Num1 / req.Num2

    return resp, nil

}

func main() {

    lis, err := net.Listen("tcp", "127.0.0.1:8888")

    if err != nil {

        log.Fatal("failed to listen: %v", err)

    }

    s := grpc.NewServer()

    pb.RegisterArithServer(s, &Arith{})

    log.Println("proto server start")

    err = s.Serve(lis)

    if err != nil {

        log.Fatal(err)

    }

}

在server目录下执行 go run server.go,服务端就建立起来了


2.搭建client客户端


建个client文件夹,进入client目录执行 go mod init client,建立pb文件夹,进入pb目录,将server>pb>arith.proto文件拷贝至此,然后执行

protoc --go_out=. --plugin=grpc .\arith.proto

protoc --go-grpc_out=requireUnimplementedServers=false:. .\arith.proto

然后在client目录下面新建client.go文件,内容如下:

package main

import (

    "context"

    "log"

    "time"

    pb "client/pb"

    "google.golang.org/grpc"

)

func main() {

    conn, err := grpc.Dial("localhost:8888", grpc.WithInsecure(), grpc.WithBlock())

    if err != nil {

        log.Fatalf("did not connect: %v", err)

    }

    defer conn.Close()

    c := pb.NewArithClient(conn)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)

    defer cancel()

    r, err := c.Multiply(ctx, &pb.ArithRequest{Num1: 1.0, Num2: 2.0})

    if err != nil {

        log.Fatal(err)

    }

    log.Printf("result: %f", r.Result)

    ctx2, cancel2 := context.WithTimeout(context.Background(), time.Second)

    defer cancel2()

    r, err = c.Divide(ctx2, &pb.ArithRequest{Num1: 1.0, Num2: 2.0})

    if err != nil {

        log.Fatal(err)

    }

    log.Printf("result: %f", r.Result)

}

然后执行 go run client.go,就会得到结果:

2020/08/04 18:34:41 result: 2.000000

2020/08/04 18:34:41 result: 0.500000

你可能感兴趣的:(grpc-go的环境搭建及入门)