分布式对象存储 读书笔记(一) 开始
这是 <分布式对象存储 原理架构及Go语言实现>的学习笔记的第一篇
我们简单的实现一个REST(表述性状态传递,英文:Representational State Transfer)服务接口,用来单机存储对象
单机版的REST接口极其简单 只提供对象的PUT和GET方法 顾名思义 就是对象的存取方法
来看下代码

1 func main() { 2 http.HandleFunc("/objects/", objects.Handler) //注册HTTP处理函数,如果有客户端访问本机的HTTP服务且URL是以"objects"开头,那么就交由handler函数处理 3 log.Fatal(http.ListenAndServe(os.Getenv("LISTEN_ADDRESS"), nil)) //若出现错误 日志打印错误信息 4 }

1 func Handler(w http.ResponseWriter, r *http.Request) { 2 m := r.Method 3 if m == http.MethodPut { 4 // PUT请求进入下列函数处理 5 put(w, r) 6 return 7 } 8 if m == http.MethodGet { 9 // GET请求进入下列函数处理 10 get(w, r) 11 return 12 } 13 //其他请求 默认返回不允许操作提示 14 w.WriteHeader(http.StatusMethodNotAllowed) 15 }

1 func put(w http.ResponseWriter, r *http.Request) { 2 //获取代码运行时设置的保存路径(Getenv("STORAGE_ROOT"))下的objects文件夹 3 f, e := os.Create(os.Getenv("STORAGE_ROOT") + "/objects/" + 4 strings.Split(r.URL.EscapedPath(), "/")[2]) 5 //strings.Split(r.URL.EscapedPath(), "/")[2] 分解http请求中的字符串 获取要写入的对象的名称 6 if e != nil { 7 log.Println(e) 8 w.WriteHeader(http.StatusInternalServerError) 9 return 10 } 11 defer f.Close() 12 //将http请求的内容写入到本地磁盘中 13 io.Copy(f, r.Body) 14 } 15 16 func get(w http.ResponseWriter, r *http.Request) { 17 //获取代码运行时设置的保存路径(Getenv("STORAGE_ROOT"))下的objects文件夹 18 f, e := os.Open(os.Getenv("STORAGE_ROOT") + "/objects/" + 19 strings.Split(r.URL.EscapedPath(), "/")[2]) 20 //strings.Split(r.URL.EscapedPath(), "/")[2] 分解http请求中的字符串 获取要读取的对象的名称 21 if e != nil { 22 //如果出现错误 日志打印错误 返回未找寻到状态值 23 log.Println(e) 24 w.WriteHeader(http.StatusNotFound) 25 return 26 } 27 //延迟关闭 并且将读取到的对象写入到HTTP的主体W里 并且返回 28 defer f.Close() 29 io.Copy(w, f) 30 }
下面运行代码
运行环境为 unbuntu
首先在存储根目录下创建相应的objects文件夹
以监听本地地址端口12345 存储根目录为/tmp 运行go代码
再开启一个终端 GET一个名为test的对象
由于没有PUT对象 此时返回的是404 NOT FOUND
下面再PUT一个对象
再来尝试打开test对象
OK 这次成功获取之前PUT上去的那个对象的内容了
下一个章节将加强可扩展性 当前服务器无法满足等性能指标时 可以自如的调整扩展服务器集群
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话