当前位置:   article > 正文

【GO开发工程师】grpc入门#golang

【GO开发工程师】grpc入门#golang

【GO开发工程师】grpc入门#golang

在这里插入图片描述

推荐个人主页席万里的个人空间

1、什么是grpc和protobuf?

gRPC(gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并基于HTTP/2协议实现。它支持多种编程语言,并提供了强大的功能,如双向流、流控制、认证和可插拔的序列化器等。

Protocol Buffers(protobuf)是一种轻量级、高效的数据序列化框架,也由Google开发。它用于将结构化数据序列化为可传输的格式,以便在网络上传输或存储到磁盘。protobuf定义了一种简洁的语言来描述数据结构,以及生成代码来读写这些数据结构。在gRPC中,protobuf通常用来定义RPC服务接口和消息格式。

因此,gRPC和protobuf通常一起使用,gRPC用于定义远程服务接口,并使用protobuf来序列化和传输数据。这种结合使用的方式使得开发分布式系统变得更加简单和高效。

下载protobuf:gitub下载protobuf3.13.0

下载go的依赖包:

go get -u google.golang.org/protobuf
  • 1

2、protobuf

profobuf 可以看作中立语言,可以用于多个语言之间对象的传递。

下载protobuf插件:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
  • 1

这是一个protobuf的文件,

syntax = "proto3";//固定语法,使用最新版本
option go_package = ".;proto";
//定义了一个 gRPC 服务接口,名为 Greeter,其中包含一个方法 SayHello,接收一个 HelloRequest 参数,返回一个 HelloReply 参数
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply);
}
//将 sessionid放入 放入cookie中 http协议
//定义了一个消息类型 HelloRequest,其中包含一个名为 name 的字符串字段,字段标识号为 1
message HelloRequest {
    string name = 1;
}
//定义了另一个消息类型 HelloReply,其中包含一个名为 message 的字符串字段,字段标识号也为 1
message HelloReply {
    string message = 1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

使用命令生成go文件:

protoc --go_out=./ *.proto
  • 1

3、grpc

3.1、流模式

这种模式是客户端发起一次请求,服务端返回一段连续的数据流。 典型的例子是客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端。

package main

import (
	"OldPackageTest/stream_grpc_test/proto" // 导入自动生成的 gRPC 代码包
	"fmt"
	"google.golang.org/grpc" // 导入 gRPC 库
	"net"
	"sync"
	"time"
)

const PORT = ":50052" // 定义服务端监听的端口号

type server struct {} // 定义一个空结构体 server,用于实现 gRPC 服务端接口

// 实现 gRPC 服务端接口中的 GetStream 方法
func (s *server) GetStream(req *proto.StreamReqData, res proto.Greeter_GetStreamServer) error {
	i := 0
	for {
		i++
		// 向客户端发送当前时间的 Unix 时间戳
		_ = res.Send(&proto.StreamResData{
			Data: fmt.Sprintf("%v", time.Now().Unix()),
		})
		time.Sleep(time.Second) // 休眠一秒钟
		if i > 10 {
			break
		}
	}
	return nil
}

// 实现 gRPC 服务端接口中的 PutStream 方法
func (s *server) PutStream(cliStr proto.Greeter_PutStreamServer) error {
	for {
		// 接收客户端发送的数据
		if a, err := cliStr.Recv(); err != nil {
			fmt.Println(err)
			break
		} else {
			fmt.Println(a.Data)
		}
	}
	return nil
}

// 实现 gRPC 服务端接口中的 AllStream 方法
func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error {
	wg := sync.WaitGroup{} // 创建一个 WaitGroup 用于等待 Goroutine 结束
	wg.Add(2)
	// 启动一个 Goroutine 用于接收客户端发送的数据并打印到控制台
	go func() {
		defer wg.Done()
		for {
			data, _ := allStr.Recv()
			fmt.Println("收到客户端消息:" + data.Data)
		}
	}()

	// 启动一个 Goroutine 用于向客户端发送数据
	go func() {
		defer wg.Done()
		for {
			_ = allStr.Send(&proto.StreamResData{Data: "我是服务器"})
			time.Sleep(time.Second)
		}
	}()

	wg.Wait() // 等待所有 Goroutine 结束
	return nil
}

func main() {
	// 监听指定端口
	lis, err := net.Listen("tcp", PORT)
	if err != nil {
		panic(err)
	}
	s := grpc.NewServer() // 创建一个 gRPC 服务器
	proto.RegisterGreeterServer(s, &server{}) // 注册服务端实现
	err = s.Serve(lis) // 启动 gRPC 服务
	if err != nil {
		panic(err)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/164121
推荐阅读
相关标签
  

闽ICP备14008679号