# 1. 环境准备
第一步:安装 protoc
前往 protobuf,下载最新版的 protoc ,我下载的是 win 64
第二步:安装 protoc-gen-go
前往 protobuf-go ,同样下载最新版的 protoc,同样下载的是 win 64
将下载后的 protoc.exe 和 protoc-gen-go 放到 %GOPATH%\bin\ 目录下。
或者更简单的方法,直接执行如下命令就可以安装
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
- 1.
第三步:下载 grpc
# 安装 grpc
go get -u google.golang.org/grpc
# gRPC运行时接口编解码支持库
go get -u github.com/golang/protobuf/proto
- 1.
- 2.
- 3.
- 4.
- 5.
# 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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
# 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){};
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
在 iswbm.com 目录下,执行如下命令
protoc --go_out=. ./proto/simple.proto
protoc --go-grpc_out=. ./proto/simple.proto
- 1.
- 2.
完成后,会在当前目录下生成一个 simple 目录,该目录下有一个 simple.pb.go 和 simple_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)
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
完成后,先安装依赖包
go install
- 1.
执行如下命令运行服务端
> go run server/server.go
2021/07/28 18:31:42 :8000 net listening...
- 1.
- 2.
# 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)
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
执行如下命令运行,立马就能收到来自 server 返回的消息
> go run client/client.go
2021/07/28 18:54:35 get from server,code: 8888,value: grpc
- 1.
- 2.
同时,在 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
- 1.
- 2.
- 3.