索引

【go项目-geecache】动手写分布式缓存 - day1 - 实现LRU算法
【go项目-geecache】动手写分布式缓存 - day2 - 单机并发缓存
【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端
【go项目-geecache】动手写分布式缓存 - day4 - 一致性哈希(hash)
【go项目-geecache】动手写分布式缓存 - day5 - 分布式节点
【go项目-geecache】动手写分布式缓存 - day6 - 防止缓存击穿
【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信

收获:

  1. 了解节点之间通信的方式
  2. 如何使用Protobuf通信

基本介绍 protobuf 和 安装方法

详情看这篇博客[【go】protobuf 基本介绍和window安装说明](【go】protobuf 基本介绍和window安装说明_CCSU__LRF的博客-CSDN博客)

使用 protobuf 通信 geecachepb.proto

syntax = "proto3";  package geecachepb;  message Request {  string group = 1;  string key = 2;
}  message Response {  bytes value = 1;
}  service GroupCache {  rpc Get(Request) returns (Response);
}

新建 package geecachepb,定义 geecachepb.proto

  • Requset为信息类型:包含group和key满足/_geecache/<group>/<name>所需要的参数
  • Response为信息类型 : 包含一个value为bytes, 表示回复的内容

生成 geecache.pb.go

$ protoc --go_out=. *.proto
$ ls
geecachepb.pb.go  geecachepb.proto

可以看到 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"`
}

修改 peers.go 中的 PeerGetter 接口

import pb "geecache/geecachepb"
type PeerGetter interface {  Get(in *pb.Request, out *pb.Response) error
}

修改 group.go

import (  // ...  pb "geecache/geecachepb"
)  func (g *Group) getFromPeer(peer PeerGetter, key string) (ByteView, error) {  req := &pb.Request{  Group: g.name,  Key:   key,  }  res := &pb.Response{}  err := peer.Get(req, res)  if err != nil {  return ByteView
, err  }  return ByteView{b: res.Value}, nil
}

修改 http.go

import (  // ...  pb "geecache/geecachepb"  "github.com/golang/protobuf/proto"
)  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)
}  func (h *httpGetter) Get(in *pb.Request, out *pb.Response) error {  u := fmt.Sprintf(  "%v%v/%v",  h.baseURL,  url.QueryEscape(in.GetGroup()),  url.QueryEscape(in.GetKey()),  )  res, err := http.Get(u)  // ...  if err = proto.Unmarshal(bytes, out); err != nil {  return fmt.Errorf("decoding response body: %v", err)  }  return nil
}

【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信相关推荐

  1. picACG本地缓存目录_7天用Go动手写/从零实现分布式缓存GeeCache

    目录 第一天:LRU 缓存淘汰策略 | Code - Github 第二天:单机并发缓存 | Code - Github 第三天:HTTP 服务端 | Code - Github 第四天:一致性哈希( ...

  2. go操作网页元素_7天用Go动手写/从零实现分布式缓存GeeCache

    目录 第一天:LRU 缓存淘汰策略 | Code - Github 第二天:单机并发缓存 | Code - Github 第三天:HTTP 服务端 | Code - Github 第四天:一致性哈希( ...

  3. Asp.Net Core 轻松学-正确使用分布式缓存

    前言     本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...

  4. [go 语言学习笔记] 7天用Go从零实现分布式缓存GeeCache 「已完结」

    说明 本文用于记录学习 go 语言过程中的笔记, 文中的代码都是在文本中敲出来的 伪代码, 并不能直接运行, 如有需要可以参考原教程. 本文的整体思路是对原系列教程阅读后的自我思考. 关于本文参考的 ...

  5. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  6. 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis...

    Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...

  7. JAVA社交平台项目第六天 Redis分布式缓存

    第6章 - Redis分布式缓存 学习目标: 掌握Redis性能测试 掌握Redis读写分离搭建 掌握Redis高可用Sentinel搭建 掌握Sentinel整合SpringBoot 掌握Redis ...

  8. 分布式面试全家桶:分布式事务+分布式锁+分布式缓存+分布式面试题+分布式项目

    一.分布式事务 1.分布式事务简介 2.Seata简介 3.Seata-Server安装 4.Seata配置Nacos注册中心和配置中心 5.Seata-AT模式   6.XA协议 7.Seata整体 ...

  9. 分布式技术与实战第六课 分布式缓存设计

    第33讲:不止业务缓存,分布式系统中还有哪些缓存? 缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis.Memcached 等后端存储:在前端页面.浏览器.网络 CDN 中也都有 ...

最新文章

  1. JS页面加载完成触发事件
  2. linux在生信的作用,【生信笔记】右键菜单打开WSL功能方法简介
  3. 如何利用XShell隧道通过跳板机连接内网机器
  4. tensolrflow之基础变量
  5. Asp.Net生命周期系列三
  6. CRM Fiori my note应用的后台ABAP实现
  7. go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...
  8. 祝贺 Java 走过创新的 25 年
  9. posix 线程(一)
  10. 使用内存精简版caffe运行densenet
  11. 2020年4月编程语言排行榜:少儿编程真有这么火吗?
  12. redis常用命令与常用api
  13. GD32F450替换STM32F429
  14. xui和嘟嘟桌面哪个好_小米这款手机桌面,好用到忘记原生桌面
  15. 自我总结3dmaxs建筑场景展uv步骤
  16. html、css、js粒子特效——前端
  17. 两行轨道报(TLE)简介
  18. 相对舒适的爬虫入门系列(一):手快尝鲜【requests库】
  19. Python 进阶视频课 - 10. LSMC 美式百慕大期权定价
  20. 使用node上传到腾讯云对象存储cos---转载

热门文章

  1. 守护软件供应链安全:国产软件BinSearch的最佳实践
  2. 【Kaggle从入门到放弃】(01):竞赛类型
  3. Python 的异步 IO:Aiohttp Client 代码分析
  4. ABAP DOI 下载SMW0的EXCEL和WORD模板
  5. [CAN] [CVPR2019]:Context-Aware Crowd Counting论文+代码解读
  6. 杨校老师课堂之CSDN博客查找博文汇总-目录
  7. 传输加载优化(资源压缩、资源缓存、HTTP2)
  8. ios时间戳和日期的一些转换,如具体时间,年龄,星座等等
  9. TOF传感器、摄像头传感器、超声波传感器、激光雷达、毫米波雷达
  10. 一起撸个简单粗暴的Tv应用主界面的网格布局控件(下)