go-zero的路由机制解析

news/2024/10/31 3:21:47/

构建web服务

参考官方教程go-zero安装

//安装goctl插件
go install github.com/zeromicro/go-zero/tools/goctl@latest//加载go-zero依赖
go get -u github.com/zeromicro/go-zero@latest

zero构建一个http服务器,基于goctl命令创建:

goctl api new demo

在这里插入图片描述

在目录下生成一个web服务

在这里插入图片描述
在web目录下,etc是web服务的整体配置,一般包括项目名称,主机,端口等;internal是一个web的主体部分,包括路由,接口配置,逻辑部分,参数类型等;web.api是生成web服务的配置文件和grpc远程服务proto文件生成rpc服务器一样,web.api文件是生成控制器也叫接口的配置文件;web.go文件web服务的入口文件,服务器通过改文件启动。

在这里插入图片描述
在internal文件夹下,包含配置文件,控制器,逻辑部分,参数集等。需要加入自己的逻辑部分只需要修改logic目录下的文件即可。

根据官网的提示在logic.go文件27行添加如下代码:
在这里插入图片描述

resp = new(types.Response)
resp.Message = req.Name

切换到web目录下,运行web程序
在这里插入图片描述

浏览器输入http://127.0.0.1:8888/from/me

在这里插入图片描述
上述步骤实现了基于go-zero的web服务,这个web是基于go的net/http重构的,可能go较为流行的gin框架,go-zero的实现的web和gin还是有很大的区别的。

config.go文件

用来记载etc文件的yml的配置,具体配置项如下:

在这里插入图片描述
svc目录

该目录的文件将config的配置加载到控制器中。

handler目录

控制器负责转发路由,在routes.go中就是路由:

func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {server.AddRoutes([]rest.Route{{Method:  http.MethodGet,Path:    "/from/:name",Handler: WebHandler(serverCtx),},},)
}

zero的路由不用与gin,其是通过路由注册的方式。在zero中rest是zero的web对象,rest.RestConf是配置类。

在这里插入图片描述

rest.Server是web容器,包含引擎和路由,提供了众多方法配置路由和引擎。

在这里插入图片描述

rest.Route是一个整体的路由对象,包含请求方法,请求路径和处理逻辑。

在这里插入图片描述

AddRoutes是rest.Server提供的注册路由的方法,其参数是路由对象数组[]rest.Route

在这里插入图片描述
如上的注册逻辑,路由地址和方法以及处理逻辑均被注册到web容器中。

//路由对象也可分离出来var routeList []rest.Route = []rest.Route{//rest.Route//...
}

路由的处理函数还有一个参数,来自svc目录,该结构体封装了rest.RestConf也就是web容器的配置类。

在这里插入图片描述
转到路由处理函数,该配置类直到调用逻辑部分才被调用,如下图:
在这里插入图片描述
svc.ServiceContext就是封装了一下config结构体,logx.Logger是日志,context.Context是上下文连接,这个才是最重要的,就像gin的gin.Context一样。
在这里插入图片描述
这些并不需要开发者完全使用,结构体的多层封装是为了方便扩展,如果需求不高,直接使用默认的即可。

因此,这个封装的svc.ServiceContext的配置参数并不是必须的。存在这个参数可以改变对上下文,日志更改,不存在就是使用框架默认的。

那么一个处理函数必须包含那些必要的条件呢?接下来从一个函数来解析。

在这里插入图片描述
看到goctl生成的标准路由处理函数,之前已经说明了不需要svc.ServiceContext参数,那么http.HandlerFunc返回值函数就是必须的了。

在这里插入图片描述
看到http.HandlerFunc的源码其本身是一个函数类型,且携带了两个参数,一个响应一个请求。

那么就可以得到结论,路由处理函数是返回类型为http.HandlerFunc的任意函数。

只要自定义的函数满足上述条件,就可以当做路由处理函数注册到路由的rest.Route对象。

// 自定义处理函数
func MyHandler() http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {httpx.OkJsonCtx(r.Context(), w, "hello")}
}
//路由注册
func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {server.AddRoutes([]rest.Route{{Method:  http.MethodGet,Path:    "/from/:name",Handler: WebHandler(serverCtx),},{Method: http.MethodGet,Path: "/hello",Handler: MyHandler(),},},)
}

启动web服务器,在浏览器端访问
在这里插入图片描述
在这里插入图片描述

另外,如下图所示查看处理函数的参数,响应参数和请求参数。

在这里插入图片描述
显然对于http的请求与响应操作。但是官方使用了httpx这个库,转到该库可以看到内部函数大多都包含http.ResponseWriter对其进一步封装。

在这里插入图片描述
开发者可以使用http.ResponseWriter元素返回参数,也可以使用httpx提供的方法返回数据。后者的优势是可以直接返回结构体不用在序列化操作。

// 返回短文
func ArticleController() http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {//定义结构体type Article struct {Str string}art := Article{"开发者可以使用http.ResponseWriter元素返回参数,也可以使用httpx提供的方法返回数据。后者的优势是可以直接返回结构体不用在序列化操作。",}httpx.OkJson(w, art)}
}

路由处理函数可以模块化并自己封装,实现定制的服务。

最后就是api文件了,api文件是goctl插件一键化生成一个控制的配置文件,通过api的一些简单的配置可以直接生成一个控制,开发者只需要编写逻辑部分,非常方便。

在这里插入图片描述
有兴趣的可以了解api语法,使用自动生成工具会快捷很多。


http://www.ppmy.cn/news/747516.html

相关文章

Visio实现箭头反向

1.开始->位置->旋转形状->水平翻转 2.ctrlh

Visio中如何绘制斜线箭头

问题描述: 今天在visio的程序流程图时绘制斜线箭头时,直接通过线头上面的小点旋转,竟然没有成功 原以为是这样的,比如我想旋转这个图形, 点击按住图形上方的小点左右移动就可以进行旋转 可在当我按照一样的方式旋转箭…

Visio自制直角箭头

1.搜索形状,箭头,找到普通箭头,拖至空白区(注:普通箭头的头和尾上有个小点,可以拖着变地方) 2.画矩形,可以在箭头上画,保证宽度一致,然后拖出来,旋…

如何用Visio画出总线(空心的箭头)如何放置粗双向可变箭头

如何用Visio画出总线(空心的箭头),如何放置粗双向可变箭头 之前对于弄出粗双向可变箭头有点忘记了,特此记录。 Office Visio 是Office软件系列中的负责绘制流程图和示意图的软件,是一款便于IT和商务人员就复杂信息、…

visio一分二的箭头_visio软件双箭头连接线怎么画?

visio软件中可以绘制各种图像,其中很多流程图中都是需要用到双向箭头连接线的,具体的形状如下图所示,这种双向箭头连接线在箭头前端类型中并不能够直接选择,需要经过一定的步骤之后才能够画出,下面我们可以一起看看具体的画法。 visio软件双箭头连接线怎么画? 1、首先在电…

visio箭头尾部遮盖方框边线

在visio画流程图时,有时候会出现直线尾部遮盖一部分边框的现象,如图(1)所示。 图(1) 箭尾遮盖边框 出现这种现象的原因时,箭头处在的图层位于方框之前,所以有遮挡现象。只需要将直线、方框放到同一图层,或者将箭头的端…

visio一分二的箭头_Microsoft Office Visio绘画双箭头直线的具体步骤介绍

Microsoft Office Visio绘画双箭头直线的具体步骤介绍 作者:小鑫 来源:PC下载网时间:2019-07-19 15:27:03 你们的工作中是不是也离不开Microsoft Office Visio呢?不过你们了解Microsoft Office Visio是怎么绘画双箭头直线吗?以下文章就为你们带来了Microsoft Office Visio绘画…

Visio画箭头

在画一个系统框图的时候,想添加一个箭头像这样: 结果一直画出来的不对,像这样: 也不知道为什么,就是画不出来,但是。。有一端是可以的,所以,骚操作来了:先画出一端的箭头…