RPC-grpc实践
参考:https://developer.aliyun.com/article/1152352?spm=a2c6h.12873639.article-detail.33.344f6446zEnbRi&scm=20140722.ID_community@@article@@1152352._.ID_community@@article@@1152352-OR_rec-V_1
参考:https://onejson.blog.csdn.net/article/details/90294238?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-90294238-blog-89449117.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-90294238-blog-89449117.pc_relevant_recovery_v2&utm_relevant_index=3
实践
- 安装grpc
- 两种方式
- brew install protobuf
- go get -u google.golang.org/grpc
- 是否安装成功
- protoc --version
- 两种方式
- 编写文件idl
syntax = "proto3";option go_package = "./;MyGRPCService";
package proto;message MyRequest {string reqMessage = 1;
}message MyResponse {string respMessage = 1;
}service MyService{rpc MyQuery(MyRequest) returns (MyResponse);
}
- 生成文件服务端、客户端文件
- 服务文件(服务类、函数)
protoc --go-grpc_out=. service.proto3
- 参数文件(参数的结构)
protoc --go_out=. service.proto3
- 需要提前安装go协议编译器插件(就是代码生成的命令工具)
- protoc–go-grpc_out
- protoc–go_out
- 服务文件(服务类、函数)
- 编写服务端程序
- 依赖文件
protoc --go-grpc_out=./MyGRPCService --go_out=./MyGRPCService ../grpc_test/service.proto3 -I ../grpc_test
- 注意包和文件名
- -I参考
- :https://www.tsingfun.com/it/opensource/file-does-not-reside-within-any-path-specified-using-proto-path.html
- 指定文件路径
- 依赖文件
package mainimport ("context""fmt""google.golang.org/grpc""grpc_server/MyGRPCService""net""os""strconv"
)type RpcService struct {MyGRPCService.UnimplementedMyServiceServer
}func (r *RpcService) MyQuery(ctx context.Context, req *MyGRPCService.MyRequest) (resp *MyGRPCService.MyResponse, err error) {resp = &MyGRPCService.MyResponse{}resp.RespMessage = strconv.Itoa(len(req.ReqMessage))return
}func main() {server := grpc.NewServer()MyGRPCService.RegisterMyServiceServer(server, &RpcService{})lis, err := net.Listen("tcp", ":9003")if err != nil {fmt.Println("err : ", err)os.Exit(1)}fmt.Println("servicing....")err = server.Serve(lis)if err != nil {fmt.Println("err : ", err)os.Exit(1)}
}
- 编写客户端代码
- 依赖文件
protoc --go-grpc_out=./MyGRPCService --go_out=./MyGRPCService ../grpc_test/service.proto3 -I ../grpc_test
- 就是可以在客户端程序中直接使用的结构体文件
- 依赖文件
package mainimport ("context""fmt""google.golang.org/grpc""grpc_client/MyGRPCService""os"
)func main() {conn, err := grpc.Dial(":9003", grpc.WithInsecure()) //没有IP,默认本机if err != nil {fmt.Println("err:", err)os.Exit(1)}defer conn.Close()client := MyGRPCService.NewMyServiceClient(conn)res, err := client.MyQuery(context.Background(), &MyGRPCService.MyRequest{ReqMessage: "husdghdsg",})if err != nil {fmt.Println("err:", err)os.Exit(1)}fmt.Println(res)}
问题
protoc --go-grpc_out=. service.proto3报错
protoc-gen-go-grpc: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
--go-grpc_out: protoc-gen-go-grpc: Plugin failed with status code 1.
- 没有安装编译器
- 解决
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
- go install之后,命令不生效是因为系统找不到执行文件
- go install安装的可执行文件在GOPATH的bin目录下
- gopath查看:
go env
- 参考:http://c.biancheng.net/view/122.html
- gopath查看:
- 修改path
- 将gopath添加到.zshrc文件中
- 参考:https://skyao.io/learning-go/develop/install/
- vim ~/.zshrc
- export PATH=“/Users/didi/go/bin:$PATH”
goland支持.proto3文件
参考:https://blog.csdn.net/taoerchun/article/details/103554739
- 在设置-> 插件中搜索protocol
- 安装protocol buf插件
- 在设置->file type中配置关联关系