栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Golang gRPC以及protobuf快速入门

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang gRPC以及protobuf快速入门

gPRC gRPC介绍

gRPC是一个由Google开源的RPC框架

gRPC工作原理

在gRPC中客户端应用可以像调用本地对象的方法一样直接调用另一台不同机器上服务端应用的方法,使得我们能够更容易的创建分布式应用和服务。

gRPC基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个gRPC服务器来处理客户端的调用。在客户端拥有一个存根,它提供与服务器相同的方法或功能,存根由gRPC自动生成

gRPC使用Protocol Buffer生成服务端&客户端存根

gRPC为什么高效
  • gRPC使用HTTP/2作为传输协议
gRPC & REST

protobuf编写

vscode下载vscode-proto3插件

安装Go protocol buffers插件 执行 go install github.com/golang/protobuf/protoc-gen-go@latest

编译生成go文件 protoc --go_out=./go ./proto } Corpus corpus = 4; } 序列化&反序列化

package main

import (
	"encoding/json"
	"fmt"
	"grpc/user"

	"google.golang.org/protobuf/proto"
)

func main() {
	article := &user.Article{
		Aid:   1,
		Title: "protobuf for golang",
		Views: 100,
	}
	// 序列化为二进制数据
	bytes, _ := proto.Marshal(article.ProtoReflect().Interface())
	fmt.Printf("bytes: %vn", bytes)

	// 反序列化
	otherArticle := &user.Article{}
	proto.Unmarshal(bytes, otherArticle.ProtoReflect().Interface());
	fmt.Printf("otherArticle: %vn", otherArticle)
}
protobuf与json转换

下载protojson go get google.golang.org/protobuf/encoding/protojson

package main

import (
	"fmt"
	"grpc/blog"

	"google.golang.org/protobuf/encoding/protojson"
)

func main() {
	article := &blog.Article {
		Aid: 1,
		Title: "protobuf for golang",
		Views: 100,
	}

	// message to json
	jsonString := protojson.Format(article.ProtoReflect().Interface())
	fmt.Printf("jsonString: %vn", jsonString)

	// json to message
	m := article.ProtoReflect().Interface()
	protojson.Unmarshal([]byte(jsonString), m)
	fmt.Printf("m: %vn", m)
}
protobuf定义服务

生成带有 service 的pb.go文件 protoc --go_out=plugins=grpc:. ./proto/*.proto

syntax = "proto3"

service UserService {
	rpc login(User) returns (User) {};
	rpc register(User) returns (User) {};
}
gRPC允许的四类服务方法
  • 单项RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用
rpc SayHello(HelloRequest) returns (HelloResponse) {}
  • 服务端流式RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse) {}
  • 客户端流式RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端,一旦客户端完成消息写入,就等待服务端读取消息并返回应答
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}
  • 双向流式RPC,两边都可以通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse)
gRPC示例

引入依赖 :

go get -u google.golang.org/grpc

go install github.com/golang/protobuf/protoc-gen-go@latest

grpc-example

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937828.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号