【Go | 从0实现简单分布式缓存】-5:使用Protobuf通信

在这里插入图片描述

本文为极客兔兔动手写分布式缓存GeeCache学习笔记。

一、Protobuf简述

之前已经讲过Protobuf了,这里在回顾一下,就是protobuf 即 Protocol Buffers,Google 开发的一种数据描述语言,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 以二进制方式存储,占用空间小。Json和xml是文本格式。

protobuf主要应用于gRPC,远程过程调用。

使用过程也是非常简单,一般的话就两个步骤,来看看具体的步骤如下。

1、按照 protobuf 的语法,在 .proto 文件中定义数据结构,并使用 protoc 生成 Go 代码(.proto 文件是跨平台的,还可以生成 C、Java 等其他源码文件)。

2、在项目代码中引用生成的 Go 代码。

二、使用Protobuf开发

首先定义一个proto文件,然后运行命令protoc --go_out=. *.proto就能够生成对应的代码了。

Request 包含 2 个字段, group 和 cache,这与我们之前定义的接口 /_geecache/<group>/<name> 所需的参数吻合。

Response 包含 1 个字段,bytes,类型为 byte 数组,与之前吻合。

syntax = "proto3";

package geecachepb;

message Request {
  string group = 1;
  string key = 2;
}

message Response {
  bytes value = 1;
}

service GroupCache {
  rpc Get(Request) returns (Response);
}

生成完之后可以看到geecachepb.pb.go文件里边有对应的结构体定义了。

type Request struct {
	Group string   `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
    Key   string   `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
    ...
}
type Response struct {
	Value []byte   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}

然后接下来就修改一些原来的代码,修改 geecache.go 和 http.go 中使用了 PeerGetter 接口的地方。

比如在peers.go中,原来的代码如下。

在这里插入图片描述
现在使用pb数据进行替换。

在这里插入图片描述


然后是更换geecache.go中使用到的地方。

如下所示,需要构造对应的请求res和resp

在这里插入图片描述

首先是需要在ServeHTTP() 中使用 proto.Marshal() 编码 HTTP 响应。

func (p *HTTPPool) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // ...
	// Write the value to the response body as a proto message.
	body, err := proto.Marshal(&pb.Response{Value: view.ByteSlice()})
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	w.Header().Set("Content-Type", "application/octet-stream")
	w.Write(body)
}

然后是http.go中需要替换,使用 proto.Unmarshal() 解码 HTTP 响应。

在这里插入图片描述

三、使用protobuf的好处

序列化和反序列化速度快:Protobuf 的编解码逻辑经过高度优化,比 JSON、XML 等格式的处理速度快数倍,尤其适合对性能要求较高的场景(如高频通信的微服务架构)。

跨语言支持:Protobuf 支持多种编程语言(如 C++、Java、Go、Python、JavaScript 等),并且可以无缝地在不同语言之间交换数据。这使得它非常适合多语言的分布式系统和微服务架构。

跨平台:Protobuf 生成的二进制数据格式固定,可以在不同的操作系统和硬件平台上保持一致,确保数据的兼容性。

一个是protobuf的扩展性很好,可以在.proto文件里边直接更改对应的Request和Response就可以了。

不需要再改变相关的接口,因为相关的接口都是通过传入传出参数:in pb.Request*out pb.Response。然后我们再去对应的文件中获取就可以了,比如url.QueryEscape(in.GetValue())就可以获取新添加的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值