参考: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 main
import (
"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 main
import (
"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/[email protected]
- 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中配置关联关系