1、grpc简介
Github地址: https://github.com/grpc/grpc
- gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。
- 目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go。
- 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
2、protocol buffer简介
- Protocol Buffer 其实是Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 强很多!
3、下载protoc工具,用户根据自定义protobuf配置文件生成相应的代码
protoc Github下载地址:https://github.com/protocolbuffers/protobuf/releases
说明:下载完成后,根据计算机系统设置好环境变量
4、下载go的依赖包
go get github.com/golang/protobuf/protoc-gen-go
5、grpc开发体验
5.1 定义helloworld的proto配置文件,并使用工具命令生成go文件(与Python不同的是,go只会生成一个文件,python是两个文件)
helloworld.proto
syntax = "proto3";
// 指定包名
option go_package = "../proto";
service Greeter{
rpc SayHello (HelloRequest)returns(HelloReply);
}
message HelloRequest{
string name = 1;
}
message HelloReply{
string message = 1;
}
6、使用工具生成rpc文件
protoc -I . helloworld.proto --go_out=plugins=grpc:.
# --go_out=plugins=grpc:. 指定生成的文件都在当前目录
7.下载grpc包
go get google.golang.org/grpc
8、服务端
server.go
package main
import (
"context"
"demo/grpc_test/proto"
"google.golang.org/grpc"
"net"
)
type Server struct {
}
func (s *Server) SayHello(c context.Context, r *proto.HelloRequest) (*proto.HelloReply, error) {
return &proto.HelloReply{
Message: "hello," + r.Name,
}, nil
}
func main() {
g := grpc.NewServer()
// Server定义的是指针,这边需加上"&"
proto.RegisterGreeterServer(g, &Server{})
lis, err := net.Listen("tcp", "0.0.0.0:8080")
if err != nil {
panic("listen failed: " + err.Error())
}
err = g.Serve(lis)
if err != nil {
panic("grpc start failed: " + err.Error())
}
}
客户端
client.go
package main
import (
"context"
"demo/grpc_test/proto"
"fmt"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
if err != nil {
panic("connect failed")
}
defer func() {
_ = conn.Close()
}()
c := proto.NewGreeterClient(conn)
r, err := c.SayHello(context.Background(), &proto.HelloRequest{
Name: "jason",
})
if err != nil {
panic(err)
}
fmt.Println(r.Message)
}