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

Go编程时光

共 5627字,需浏览 12分钟

 ·

2021-08-06 05:27

点击上方“Go编程时光”,选择“加为星标

第一时间关注Go技术干货!



# 1. 环境准备

第一步:安装 protoc

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

第二步:安装 protoc-gen-go

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

将下载后的 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 mkdir $GOPATH/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

# 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



   


喜欢明哥文章的同学
欢迎长按下图订阅!

⬇⬇⬇

浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报