您好,登錄后才能下訂單哦!
這篇文章主要為大家分析了golang微服務框架中的go-zero文件服務怎么理解的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“golang微服務框架中的go-zero文件服務怎么理解”的知識吧。
go-zero本身支持文件服務,但是我們需要寫相關的handler文件,本文目的在于
不寫任何一個和文件相關的handler
如果有新的文件,直接把文件模板到某個特定目錄就好,不要動任何go代碼
需求在這里,開擼吧
golang微服務框架go-zero系列-1:在go-zero中使用XormV2 golang微服務框架go-zero系列-2:在go-zero中使用jwt-token鑒權實踐 golang微服務框架go-zero系列-3:擴展go-zero,使之支持html模板解析自動化
微服務講究資源分離,實際生產過程中盡量使用專業的文件服務器或者OSS等第三方存儲平臺
在gin
中有專門的static file
服務封裝,go-zero
目前并沒有提供。目前go-zero
提供非常嚴格的路徑匹配,如 訪問 /asset/l1.jpg
將映射到 /asset/:1
對應的handlerlv1 /asset/l1/l2.jpg
將映射到 /asset/:1/:2
對應的handlerlv2 這有如下倆種情況
比如我們需要訪問favourite.ico
,系統指向./www/favourite.ico
文件,代碼如下
//處理函數,傳入文件地址 func filehandler(filepath string) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { http.ServeFile(w, req, filepath) } }
在router里面直接調用AddRoute
方法添加單個路由
func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) { //這里直接添加單個 engine.AddRoute( rest.Route{ Method: http.MethodGet, Path: "/favourite.ico", Handler: filehandler("./www/favourite.ico"), }) }
實際過程中我們需要對外暴露某一個目錄,比如/assets/
目錄,該目錄下存放一些資源文件如css
,js
,img
等
tree /f +---assets | +---css | +---fonts | +---images | +---js | \---plugins | +---font-awesome | | +---css | | \---fonts | +---fontawesome | | +---css | | \---fonts | +---ionicons | | +---css | | \---fonts | +---jquery.contextmenu | | \---images | +---jquery.pin | | +---css | | \---images | +---jqueryui-1.12.1 | | +---external | | | \---jquery | | \---images | \---swiper-4.5.3 | +---css | \---js
如果使用單個文件的方式來實現,肯定不合理,因為router會非常大,怎么解決這個問題?我們可以使用如下方法實現文件夾服務
// func dirhandler(patern, filedir string) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { handler := http.StripPrefix(patern, http.FileServer(http.Dir(filedir))) handler.ServeHTTP(w, req) } }
如上函數的核心是http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))
函數,這個函數的核心功能是將映patern
格式映射到某一個目錄filedir
patern:請求路徑格式/assets/:1
,/assets/:1/:2
這種
filedir:映射對應的文件夾./assets/
這種
那么我們只需要構建多級文件訪問格式和dirhandler
的映射關系即可
func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) { //這里注冊 dirlevel := []string{":1", ":2", ":3", ":4", ":5", ":6", ":7", ":8"} patern := "/asset/" dirpath := "./assets/" for i := 1; i < len(dirlevel); i++ { path := prefix + strings.Join(dirlevel[:i], "/") //最后生成 /asset engine.AddRoute( rest.Route{ Method: http.MethodGet, Path: path, Handler: dirhandler(patern,dirpath), }) logx.Infof("register dir %s %s", path,dirpath) } }
404可以在main函數中配置
rt := router.NewPatRouter() rt.SetNotFoundHandler(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { //這里內容可以定制 w.Write([]byte("服務器開小差了,這里可定制")) })) server := rest.MustNewServer(c.RestConf, rest.WithRouter(rt))
此時請求http://127.0.0.1:8888/hello
,系統響應 服務器開小差了,這里可定制
啟動系統后運行
E:\workspace@go\gozero\file>go run file.go 2020/09/05 20:18:24 {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"{{{file-api { console logs info false 0 100} pro { 0 }} 0.0.0.0 8081 false 10000 1048576 3000 900 {false 0s []}} [/asset/=./assets]}"} {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"register dir /asset/:1 ./assets"} {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2 ./assets"} {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2/:3 ./assets"} {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2/:3/:4 ./assets"} {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5 ./assets"} {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5/:6 ./assets"} {"@timestamp":"2020-09-05T20:18:24.698+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5/:6/:7 ./assets"}
訪問系統都能正常響應
http://127.0.0.1:8888/asset/images/avatar.jpg
http://127.0.0.1:8888/asset/js/test.js
http://127.0.0.1:8888/asset/js/lv2/test.js
注意,請求的是
/asset/**
不是/assets/**
我們可以在NotFoundHandler中根據req.URL.path來實現文件服務,如何實現呢?
關于“golang微服務框架中的go-zero文件服務怎么理解”就介紹到這了,更多相關內容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請多多支持億速云網站!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。