分佈式對象存儲 讀書筆記(一) 開始

 

這是 <分佈式對象存儲 原理架構及Go語言實現>的學習筆記的第一篇服務器

咱們簡單的實現一個REST(表述性狀態傳遞,英文:Representational State Transfer)服務接口,用來單機存儲對象架構

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

來看下代碼ide

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 }
View Code
 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 }
View Code
 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 }
View Code

下面運行代碼函數

運行環境爲 unbuntu性能

首先在存儲根目錄下建立相應的objects文件夾學習

以監聽本地地址端口12345 存儲根目錄爲/tmp 運行go代碼spa

 

再開啓一個終端 GET一個名爲test的對象3d

因爲沒有PUT對象 此時返回的是404 NOT FOUND日誌

下面再PUT一個對象

再來嘗試打開test對象

OK 此次成功獲取以前PUT上去的那個對象的內容了

下一個章節將增強可擴展性 當前服務器沒法知足等性能指標時 能夠自如的調整擴展服務器集羣

相關文章
相關標籤/搜索