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

news/2025/3/1 1:22:32/

在这里插入图片描述

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

本文目录

  • 一、Protobuf简述
  • 二、使用Protobuf开发
  • 三、使用protobuf的好处

一、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())就可以获取新添加的参数。


http://www.ppmy.cn/news/1575642.html

相关文章

推荐律师事务管理系统(SpringCloud+mysql+rocketmq+deepseek)

1.深圳慧钛科技有限公司成立于2024年7月24日&#xff0c;官网地址&#xff1a;深圳慧钛律师事务管理系统&#xff08;官网&#xff09;-案件管理系统-律所档案管理-律所管理软件-律师办案系统-电子签章-律所印章-律师办公软件、律师办公系统、律所OA 。系统访问地址:深圳慧钛律…

线性模型 - 支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类&#xff08;和回归&#xff09;的监督学习算法&#xff0c;其主要目标是找到一个最佳决策超平面&#xff0c;将数据点分为不同的类别&#xff0c;并且使得分类边界与最近的数据点之间的间隔&#xff08;margin&#xff09…

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…

SGLang中context-length参数的默认值来源解析

SGLang中context-length参数的默认值来源解析 1. 问题背景2. 关键发现案例1&#xff1a;DeepSeek-V3案例2&#xff1a;DeepSeek-R1案例3&#xff1a;Llama-3.1-8B-Instruct 3. 实际验证4. 总结 在使用SGLang工具时&#xff0c;我们可能会遇到关于--context-length参数的设置问题…

包子凑数——蓝桥杯真题Python

包子凑数 输入输出样例 示例 1 输入 2 4 5输出 6样例说明 凑不出的数目包括&#xff1a;1, 2, 3, 6, 7, 11。 示例 2 输入 2 4 6输出 INF样例说明 所有奇数都凑不出来&#xff0c;所以有无限多个 运行限制 最大运行时间&#xff1a;1s最大运行内存: 256M 最大公约数 最大公…

linux 后台执行并输出日志

在Linux系统中&#xff0c;后台执行程序并输出日志通常有多种方法&#xff0c;这里列出几种常见的方法&#xff1a; 1. 使用&将命令放入后台 可以在命令的末尾加上&符号&#xff0c;将命令放入后台执行。例如&#xff1a; your_command > output.log 2>&1…

Vue3父组件访问子组件方法与属性完全指南

在Vue3的组件化开发中&#xff0c;父子组件间的通信是核心功能之一。本文将详细介绍五种父组件访问子组件属性/方法的实现方案&#xff0c;包含最新的<script setup>语法糖实践。&#xff08;综合1579&#xff09; 一、ref defineExpose&#xff08;推荐方案&#xff0…

DeepSeek 开源狂欢周(二)DeepEP深度技术解析 | 解锁 MoE 模型并行加速

在大模型时代&#xff0c;Mixture-of-Experts (MoE) 模型凭借其强大的容量和高效的计算能力&#xff0c;成为研究和应用的热点。然而&#xff0c;MoE 模型的训练和推理面临着巨大的专家并行通信挑战。近日&#xff0c;DeepSeek 开源了 DeepEP 项目&#xff0c;为解决这一难题提…