這是 <分佈式對象存儲 原理架構及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 }
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代碼spa
再開啓一個終端 GET一個名爲test的對象3d
因爲沒有PUT對象 此時返回的是404 NOT FOUND日誌
下面再PUT一個對象
再來嘗試打開test對象
OK 此次成功獲取以前PUT上去的那個對象的內容了
下一個章節將增強可擴展性 當前服務器沒法知足等性能指標時 能夠自如的調整擴展服務器集羣