golang微服务框架go-zero系列-4:go-zero文件服务

3 篇文章 0 订阅
3 篇文章 0 订阅

golang微服务框架go-zero系列-4: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来实现文件服务,如何实现呢?

下章预告

单体应用需要的基本梳理完,明天开始微服务

本文代码获取

关注公众号betaidea 输入file即可获得本文相关代码
关注公众号betaidea 输入html即可获得html解析相关代码
关注公众号betaidea 输入jwt即可获得gozero集成jwt-token相关代码
关注公众号betaidea 输入gozero即可gozero入门代码

广而告之

送福利了uniapp用户福音来啦!
历经数十万用户考验,我们的客服系统终于对外提供服务了。
你还在为商城接入客服烦恼吗?只需一行代码,即可接入啦!!
只需一行代码!!!

/*kefu.vue*/
<template>
	<view>
		<IdeaKefu :siteid="siteId"  ></IdeaKefu>
	</view>
</template>

<script>
	import IdeaKefu from "@/components/idea-kefu/idea-kefu.vue"
    export default {
		components:{
			IdeaKefu
		},
		data() {
			return {
				siteId:2
			}
		}
    }   

效果杠杠的
客服效果

开发文档地址
http://kefu.techidea8.com/html/wiki/

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Golang有多个微服务框架可供选择。其中一款是Go Micro,它是一款支持多种传输协议、服务发现和负载均衡的微服务框架。Go Micro提供了一系列基本服务以及相应的工具和库,包括服务注册、服务发现、RPC、消息传递等,使得微服务的开发、管理和部署变得更加方便。\[1\]另外,还有一些服务治理型的RPC框架,如Dubbo、DubboX、Motan等,它们提供了丰富的功能,包括高性能的远程调用、服务发现和治理功能,适用于大型服务微服务化拆分和管理。然而,这些框架的缺点是语言耦合度较高,跨语言支持难度较大。\[2\]因此,有人基于Go的net/rpc框架实现了一个类似Dubbo的分布式框架,以弥补Go Micro等框架服务治理方面的不足。\[3\] #### 引用[.reference_title] - *1* [golang微服务框架](https://blog.csdn.net/weixin_42094245/article/details/130554068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [golang 微服务框架](https://blog.csdn.net/u014311799/article/details/120773991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值