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 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
    • 修改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中配置关联关系

你可能感兴趣的:(rpc,网络协议,go,grpc)