中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang微服務框架中的go-zero文件服務怎么理解

發布時間:2022-01-14 21:28:00 來源:億速云 閱讀:618 作者:柒染 欄目:大數據

這篇文章主要為大家分析了golang微服務框架中的go-zero文件服務怎么理解的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“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等第三方存儲平臺

file服務實現思路

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

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文件服務怎么理解”就介紹到這了,更多相關內容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請多多支持億速云網站!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

来凤县| 涞水县| 凤凰县| 正蓝旗| 枣强县| 阿坝| 宁明县| 梅河口市| 昂仁县| 陆良县| 福海县| 通许县| 阿图什市| 建水县| 洪洞县| 德化县| 眉山市| 旬阳县| 久治县| 堆龙德庆县| 北川| 仲巴县| 喀什市| 阜康市| 隆德县| 富民县| 苍山县| 仙游县| 武清区| 景宁| 新蔡县| 建瓯市| 莫力| 宁国市| 库伦旗| 东兰县| 淮南市| 瓦房店市| 兴仁县| 锡林浩特市| 额济纳旗|