3. go的grpc开发体验
注意:新版本的protoc和之前的3.14之前的版本的protoc插件有区别:
如果大家使用的是新版本的protoc参考:
https://grpc.io/docs/languages/go/quickstart/ 官方文档最权威,里面的安装都是最新的
如果大家使用的protoc3.14以及以前的版本 就可以参考下面的文档
1. 下载工具
如果觉得下载较慢可以点击这里下载:
protoc-3.14.0-win64.zip
protoc-3.14.0-linux-x86_64.zip
注意:protoc的版本需要和golang/protobuf保持一致 (尽量自己去下载最新的版本)
下载完成后解压后记得将路径添加到环境变量中
2. 下载go的依赖包
go get github.com/golang/protobuf/protoc-gen-go
如果是新版本protoc则需要安装下面两个
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
注意:安装过程中会提示说go get会慢慢被弃用,不是错误只是提示,go的新版本依赖安装会慢慢弃用go get方式安装,以后一律采用 go install方式安装第三方依赖
3. proto文件
syntax = "proto3";
option go_package = ".;proto"; #新版本的protoc和protobuf这里应该写成 option go_package = "./;proto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
4. 生成go文件
goland插件地址: https://plugins.jetbrains.com/plugin/14004-protocol-buffer-editor/versions
protoc -I . goods.proto --go_out=plugins=grpc:.
#如果大家使用最新的protoc此处可能会报错说不支持这种用法,所以可以使用下面的语句生成:
protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. goods.proto
# 生 pb.go 文件
protoc greet.proto --go_out=. --go-grpc_out=.
5. 服务端代码
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpc_demo/hello"
"net"
)
type Server struct {
hello.UnimplementedServerServer //新版生成的go源码强制要求这里默认集成默认生成的unimplemented代码,大家集成以下就行了,其他代码不用变
}
func (s *Server) SayHello(ctx context.Context,request *hello.HelloRequest)(*hello.HelloReply,error){
return &hello.HelloReply{Message:"Hello "+request.Name},nil
}
func main() {
g := grpc.NewServer()
s := Server{}
hello.RegisterGreeterServer(g,&s)
lis, err := net.Listen("tcp", fmt.Sprintf(":8080"))
if err != nil {
panic("failed to listen: "+err.Error())
}
g.Serve(lis)
}
6. 客户端
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpc_demo/proto"
)
func main() {
conn,err := grpc.Dial("127.0.0.1:8080",grpc.WithInsecure())
if err!=nil{
panic(err)
}
defer conn.Close()
c := hello.NewGreeterClient(conn)
r,err := c.SayHello(context.Background(),&hello.HelloRequest{Name:"yeliangchen"})
if err!=nil{
panic(err)
}
fmt.Println(r.Message)
}
*