1、准备
1.1 安装protobuf
官网地址:Releases · protocolbuffers/protobuf · GitHub
2 、环境变量(Windows)
下载protobuf并解压
将bin目录添加到你的环境变量PATH
中。
- 右击“我的电脑”或“此电脑”,选择“属性”。
- 点击“高级系统设置”,然后点击“环境变量”。
- 在“系统变量”下,找到并选择
PATH
,点击“编辑”。 - 添加解压后的
bin
目录的路径,点击“确定”。
验证:cmd运行protoc --version,显示版本号为安装成功
3、安装gRPC
3.1下载gRPC的Go实现包
go get -u google.golang.org/grpc
3.2下载protoc-gen-go.exe
go get -u google.golang.org/protobuf/cmd/protoc-gen-go
3.3下载protoc-gen-go-grpc.exe
go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc
无报错则下载成功,可在GOPATH的bin目录下找到
4、定义服务
创建proto文件,如:user.proto
模版:
//使用proto3语法
syntax = "proto3";
package user;
//生成的go文件是处在那个目录哪个包中, .代表在当前目录生成,user代表了生成的go文件包名是user
option go_package = "./user";
//定义了一个service,称为User,服务内有一个rpc方法
//getUser会发送一个IdRequest,然后返回一个UserResponse
service User {
rpc getUser(IdRequest) returns(UserResponse);
}
//message关键字,可以理解为Golang中的结构体
//定义IdRequest,定义了一个id变量。"注意:变量后面的1,在这里并不是赋值,而是顶一个这个变量在message中的位置"
message IdRequest {
string id = 1;
//bool gender = 2;
}
//定义返回的UserResponse
message UserResponse {
// 用户id
string id = 1;
// 用户名称
string name = 2;
// 用户性别
bool gender = 3;
}
5、生成代码
使用 Protocol Buffers 编译器生成 Go 语言代码
protoc --go_out=. user.proto
protoc --go-grpc_out=. user.proto
6、服务端代码实现
package main
import (
"context"
pb "gRPC-study/user"
"google.golang.org/grpc"
"log"
"net"
)
type server struct {
pb.UnimplementedUserServer
}
// 实现GetUser方法
func (s *server) GetUser(ctx context.Context, in *pb.IdRequest) (*pb.UserResponse, error) {
return &pb.UserResponse{Id: "1", Name: "张三", Gender: true}, nil
}
func main() {
//创建端口
listen, err := net.Listen("tcp", ":9090")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
//创建grpc服务
rpcServer := grpc.NewServer()
//在grpc服务端中去注册我们自己编写的服务
pb.RegisterUserServer(rpcServer, &server{})
//启动服务
if err := rpcServer.Serve(listen); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
7、客户端代码实现
package main
import (
"context"
"fmt"
"gRPC-study/gRPC-golang/user"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
//连接到server端,此处禁用安全传输,没有加密和验证
conn, err := grpc.Dial("localhost:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
//建立连接
client := user.NewUserClient(conn)
//执行rpc调用(这个方法在服务端实现并返回结果)
r, err := client.GetUser(context.Background(), &user.IdRequest{Id: "1"})
if err != nil {
log.Fatalf("调用失败: %v", err)
}
fmt.Println("user: ", r.Id, r.Name, r.Gender)
}
8、测试
启动服务端监听端口、注册服务
启动客户端连接rpc服务,调用服务方法