开发者

go中的protobuf和grpc使用教程

开发者 https://www.devze.com 2024-08-14 10:45 出处:网络 作者: 卡卡舅舅
目录一、Protobuf二、grpc三、使用教程3.1 student.proto3.2 根据proto文件生成接口和结构定义3.3 grpc provider 实现3.4 grpc server 实现3.5 grpc client 实现一、Protobuf
目录
  • 一、Protobuf
  • 二、grpc
  • 三、使用教程
    • 3.1 student.proto
    • 3.2 根据proto文件生成接口和结构定义
    • 3.3 grpc provider 实现
    • 3.4 grpc server 实现
    • 3.5 grpc client 实现

一、Protobuf

       Protobuf是接口规范的描述语言,可以通过工具生成代码,将结构化数据序列化。

二、grpc

        gRPC 是 Google 公司基于 Protobuf 开发的跨语言的开源 RPC 框架。

三、使用教程

3.1 student.proto

syntax = "proto3";
import "google/api/annotations.proto";
package main;
option go_package = "/main;student";
message Student {
  string name = 1;
  int32 age = 2;
  repeated int32 scores = 3;
}
service StudentService {
  rpc GetStudent(Student) returns (Student){
  javascript  option (google.api.http) = {
      post: "/v1/student/get"
      body: "*"
    };
  };
}

3.2 根据proto文件生成接口和结构定义

   third_party 存放annotations.proto

 protoc --proto_path=./third_party --proto_path=.  --go_out=.  --go-grpc_out=.   student.proto 

 编译生成目标文件

go中的protobuf和grpc使用教程

3.3 grpc provider 实现

// 定义提供者
type StudentService struct {
	student.UnimplementedStudentSerEmoUiviceServer `wire:"-"`
}
// 实现提供者方法
func (s *StudentService) GetStudent(contexthttp://www.devze.com.Context, *student.Student) (*student.Student, error) {
	return &student.Student{
		Apythonge:    18,
		Name:   "vicyor",
		Scores: []int32{1, 2, 3, 4, 5EmoUi},
	}, nil
}

3.4 grpc server 实现

func main_grpc() {
	serverPort := 50051
	// 创造grpc服务端
	server := grpc.NewServer()
	// 创建listener
	lis, _ := net.Listen("tcp", fmt.Sprintf(":%d", serverPort))
	// 注册grpc服务
	student.RegisterStudentServiceServer(server, &StudentService{})
	// grpc 启动
	server.Serve(lis)
}

3.5 grpc client 实现

func main_grpc() {
    <-time.NewTimer(time.Second * 2).C
	// 这里启动一个消费者
	conn, _ := grpc.NewClient("127.0.0.1:50051", 
    grpc.WithTransportCredentials(insecure.NewCredentials()))
	defer conn.Close()
	cli := student.NewStudentServiceClient(conn)
    // 3秒读超时
	ctx, _ := context.WithTimeout(context.Background(), time.Second*3)
	res, _ := cli.GetStudent(ctx, &student.Student{})
	fmt.Println(res)
}

到此这篇关于go中的protobuf和grpc的文章就介绍到这了,更多相关go protobuf和grpc内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号