从0到1:带你完整写一个 golang grpc 服务

作者: 王炳明 分类: Golang 基础教程 发布时间: 2021-07-28 19:17 热度:424

1. 环境准备

第一步:安装 protoc

前往 protobuf,下载最新版的 protoc ,我下载的是 win 64

从0到1:带你完整写一个 golang grpc 服务插图

第二步:安装 protoc-gen-go

前往 protobuf-go ,同样下载最新版的 protoc,同样下载的是 win 64

从0到1:带你完整写一个 golang grpc 服务插图(1)

将下载后的 protoc.exeprotoc-gen-go 放到 %GOPATH%\bin\ 目录下。

或者更简单的方法,直接执行如下命令就可以安装

go install Google.Golang.org/gRPC/cmd/protoc-gen-go-grpc

第三步:下载 grpc

# 安装 grpc 
go get -u google.golang.org/grpc

# gRPC运行时接口编解码支持库
go get -u Github.com/golang/protobuf/proto 

2. 项目目录结构

$GOPATH/src 下新建 iswbm.com 目录及三个子目录(client,server,proto),在终端上进入该目录,执行如下命令创建 go.mod

mkdir GOPATH/src/iswbm.com/{client,server,proto}
cd mkdirGOPATH/src/iswbm.com/

# 设置环境变量,确保 GO111MODULE 是开启的
go env -w GO111MODULE=auto

# 初始化项目
go mod init

3. 编写 proto 文件

编写 proto/simple.proto

syntax = "proto3";

package proto;
option go_package ="/proto";

// 定义发送请求信息
message SimpleRequest{
  // 参数类型 参数名称 标识号
  string data = 1;
}

// 定义响应信息
message SimpleResponse{
  int32 code = 1;
  string value = 2;
}

// 定义我们的服务(可以定义多个服务,每个服务可以定义多个接口)
service Simple{
  rpc GetSimpleInfo(SimpleRequest) returns (SimpleResponse){};
}

iswbm.com 目录下,执行如下命令

protoc --go_out=. ./proto/simple.proto
protoc --go-grpc_out=. ./proto/simple.proto

完成后,会在当前目录下生成一个 simple 目录,该目录下有一个 simple.pb.gosimple_grpc.pb.go

从0到1:带你完整写一个 golang grpc 服务插图(2)

4. 编写 server.go

package main

import (
    "context"
    pb "iswbm.com/proto"
    "google.golang.org/grpc"
    "log"
    "net"
)

const (
    Address string = ":8000"
    Network string = "tcp"
)

// 定义我们的服务
type SimpleService struct{
    pb.UnimplementedSimpleServer
}

// 实现 GetSimpleInfo 方法
func (s *SimpleService) GetSimpleInfo(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) {
    data := req.Data
    log.Println("get from client: ", data)
    resp := &pb.SimpleResponse{
        Code:  8888,
        Value: "grpc",
    }
    return resp, nil
}

func main() {

    // 1.监听端口
    listener, err := net.Listen(Network, Address)
    if err != nil {
        log.Fatalf("net.listen err: %v", err)
    }
    log.Println(Address, " net listening...")
    // 2.实例化gRPC服务端
    grpcServer := grpc.NewServer()

    // 3.注册我们实现的服务 SimpleService
    pb.RegisterSimpleServer(grpcServer, &SimpleService{})

    // 4.启动gRPC服务端
    err = grpcServer.Serve(listener)
    if err != nil {
        log.Fatalf("grpc server err: %v",err)
    }

}

完成后,先安装依赖包

go install

执行如下命令运行服务端

> go run server/server.go
2021/07/28 18:31:42 :8000  net listening...

5. 编写 client.go

package main

import (
    "context"
    "google.golang.org/grpc"
    "log"
    pb "iswbm.com/proto"
)

const (
    Address string = ":8000"
)

func main() {
    // 1.创建于gRPC服务端的连接
    conn, err := grpc.Dial(Address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("dial conn err: %v", err)
    }
    defer conn.Close()

    // 2.创建grpc客户端
    client := pb.NewSimpleClient(conn)

    // 3.调用服务端提供的服务
    req := pb.SimpleRequest{
        Data: "Hello,Server",
    }
    resp, err := client.GetSimpleInfo(context.Background(), &req)
    if err != nil {
        log.Fatalf("resp err: %v", err)
    }
    log.Printf("get from server,code: %v,value: %v", resp.Code, resp.Value)

}

执行如下命令运行,立马就能收到来自 server 返回的消息

> go run client/client.go
2021/07/28 18:54:35 get from server,code: 8888,value: grpc

同时,在 server 端也会打印来自 client 端的消息

> go run server/server.go
2021/07/28 18:51:59 :8000  net listening...
2021/07/28 18:54:35 get from client:  Hello,Server
明哥公众号

文章有帮助,请作者喝杯咖啡?

发表评论