grpc教程
1.安装proto
下载地址:https://github.com/protocolbuffers/protobuf/releases
2.安装依赖
go get google.golang.org/grpc
3.安装grpc核心库
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
4.proto文件编写
syntax = "proto3"; //这里说明使用版本信息
option go_package = ".;service"; //生成的go文件存放在那个目录那个包中,.代表当前目录生成,service代表生成的go文件的包名称是service
//定义一个服务,在这个服务中需要有一个方法,这个方法可以接受客户端的参数,再返回服务端的响应
//这个方法请求参数为HelloRequest,响应HelloResponse
service SayHello{
rpc SayHello(HelloRequest)returns (HelloResponse){}
}
//这里的message关键字,其实可以当做go中的结构体
// 这里比较特殊的是后面的“赋值”。注意这里的不是赋值,而是在定义这个变量在message中的位置
message HelloRequest{
string requestName = 1;
}
message HelloResponse{
string responseMsg = 1;
}
5.编译命令
protoc --go_out=. .\hello.proto
protoc --go-grpc_out=. .\hello.proto
6.proto字段规则
required:消息体中必填字段,不设置会导致编码异常。在protobuf2中使用,在protobuf3中被删除
optional:消息体中可选字段,protobuf3中没有required,optional等说明关键字,都默认为optional
repeated:消息结构体可重复字段。重复的值的顺序会被保留到go中重复的会被定义为切片
7.服务端代码
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"net"
pd "study/proto"
)
type server struct {
pd.UnimplementedSayHelloServer
}
func (s server) SayHello(cx context.Context, req *pd.HelloRequest) (*pd.HelloResponse, error) {
result := req.RequestName + "1"
return &pd.HelloResponse{
ResponseMsg: result,
}, nil
}
func main() {
//开启端口号
listen, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println(err)
}
//创建grpc服务
grpcServer := grpc.NewServer()
//在grpc服务端中去注册我们自己编写的服务
pd.RegisterSayHelloServer(grpcServer, server{})
//启动服务
err = grpcServer.Serve(listen)
if err != nil {
fmt.Println(err)
return
}
}
7.客户端
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
pd "study/proto"
)
func main() {
// 连接server,此处禁止安全传输,没有加密认证
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
return
}
defer conn.Close()
// 建立连接
client := pd.NewSayHelloClient(conn)
//执行调用
resp, err := client.SayHello(context.Background(), &pd.HelloRequest{RequestName: "test"})
fmt.Println(resp)
}