日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

分布式对象存储 读书笔记(一) 开始

發(fā)布時間:2023/12/24 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 分布式对象存储 读书笔记(一) 开始 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這是 <分布式對象存儲 原理架構(gòu)及Go語言實現(xiàn)>的學(xué)習(xí)筆記的第一篇

我們簡單的實現(xiàn)一個REST(表述性狀態(tài)傳遞,英文:Representational State Transfer)服務(wù)接口,用來單機存儲對象

單機版的REST接口極其簡單 只提供對象的PUT和GET方法 顧名思義 就是對象的存取方法

來看下代碼

1 func main() {
2     http.HandleFunc("/objects/", objects.Handler) //注冊HTTP處理函數(shù),如果有客戶端訪問本機的HTTP服務(wù)且URL是以"objects"開頭,那么就交由handler函數(shù)處理
3     log.Fatal(http.ListenAndServe(os.Getenv("LISTEN_ADDRESS"), nil))  //若出現(xiàn)錯誤 日志打印錯誤信息
4 }

View Code

 1 func Handler(w http.ResponseWriter, r *http.Request) {
 2     m := r.Method
 3     if m == http.MethodPut {
 4         // PUT請求進入下列函數(shù)處理
 5         put(w, r)
 6         return
 7     }
 8     if m == http.MethodGet {
 9         // GET請求進入下列函數(shù)處理
10         get(w, r)
11         return
12     }
13     //其他請求 默認(rèn)返回不允許操作提示
14     w.WriteHeader(http.StatusMethodNotAllowed)
15 }

View Code

 1 func put(w http.ResponseWriter, r *http.Request) {
 2     //獲取代碼運行時設(shè)置的保存路徑(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請求的內(nèi)容寫入到本地磁盤中
13     io.Copy(f, r.Body)
14 }
15 
16 func get(w http.ResponseWriter, r *http.Request) {
17     //獲取代碼運行時設(shè)置的保存路徑(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         //如果出現(xiàn)錯誤 日志打印錯誤 返回未找尋到狀態(tài)值
23         log.Println(e)
24         w.WriteHeader(http.StatusNotFound)
25         return
26     }
27     //延遲關(guān)閉 并且將讀取到的對象寫入到HTTP的主體W里 并且返回
28     defer f.Close()
29     io.Copy(w, f)
30 }

View Code

下面運行代碼

運行環(huán)境為 unbuntu

首先在存儲根目錄下創(chuàng)建相應(yīng)的objects文件夾

以監(jiān)聽本地地址端口12345 存儲根目錄為/tmp 運行g(shù)o代碼

再開啟一個終端 GET一個名為test的對象

由于沒有PUT對象 此時返回的是404 NOT FOUND

下面再PUT一個對象

再來嘗試打開test對象

OK 這次成功獲取之前PUT上去的那個對象的內(nèi)容了

下一個章節(jié)將加強可擴展性 當(dāng)前服務(wù)器無法滿足等性能指標(biāo)時 可以自如的調(diào)整擴展服務(wù)器集群

作 者: itdef
歡迎轉(zhuǎn)帖 請保持文本完整并注明出處

技術(shù)博客 http://www.cnblogs.com/itdef/

B站算法視頻題解
https://space.bilibili.com/18508846
qq 151435887

gitee https://gitee.com/def/

歡迎c c++ 算法愛好者 windows驅(qū)動愛好者 服務(wù)器程序員溝通交流
如果覺得不錯,歡迎點贊,你的鼓勵就是我的動力

總結(jié)

以上是生活随笔為你收集整理的分布式对象存储 读书笔记(一) 开始的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。