小工具      在线工具  汉语词典  css  js  c++  java

go-zero的路由机制解析

# go-zero,golang,后端,微服务,服务器 额外说明

收录于:152天前

构建web服务

参考官方教程归零安装

//安装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文件

yml的配置用于记录etc文件。具体配置项如下:

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

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

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语法,使用自动生成工具会快捷很多。

. . .

相关推荐

额外说明

创建新模块后,swagger无法扫描新模块中的控制器接口。

 框架默认情况下,只能扫描ruoyi-admin模块下的controller接口。如果需要扫描其它子模块中的swagger注解,那么需要调整一下swagger相关内容。 目录 1、前置条件 2、解决办法 1、前置条件 首先,我们要知道,默认情况下swag

额外说明

thymeleaf的汉字在JS中转义了怎么办?

使用thymeleaf在JS里中文被转义了怎么办? 目录 一、转义写法 二、不转义写法  一、转义写法 这种写法,会导致中文被解析为Unicode编码格式。  <script type="text/javascript" th:inline="javas

额外说明

win11查占端口对应的进程并杀死

查占端口对应的进程 netstat -aon|findstr "8782" 杀进程 taskkill -pid 14868 -f

额外说明

C#WPF 控件

一、控件(元素)分类 注:以开发工具Visual Studio 2015为例 1.布局控件:是可以容纳多个控件或者嵌套其他布局的控件,用于在UI上组织和 排列控件。Grid(网格标签)、StackPanel(栈式面板)、DockPanel(停靠面板)等控

额外说明

如何在windows平台下造字

学习背景:   最近在工作当中,有好几位同事要求我帮他造字,说输入法中没有他想打的字,第一次听到这个问题的时候,没有注意,后面有好几次遇到同样的问题,正好今天有空,我就查找了下关于如何在windows平台下造字的相关资料。   其中造字用到的一个最关键的

额外说明

python——游戏开发入门 Pygame最小开发框架与最小游戏

QQ 1274510382 Wechat JNZ_aming 商业互捧 QQ群538250800 技术搞事 QQ群599020441 技术合作 QQ群152889761 加入我们 QQ群649347320 纪年科技aming 网络安全 ,深度学习,嵌入式

额外说明

【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 23⚠️ 角点检测

【OpenCV】⚠️高手勿入! 半小时学会基本操作 23⚠️ 概述 角点检测 角点检测代码 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. (第 23 课) 角点检测 角点

额外说明

2023.9.20 Fiddle 安装使用

目录 Fiddle 下载 Fiddle 下载 Fiddle 是一种抓包工具来捕获到请求交互的详细情况 抓包工具相当于一个 代理程序 ,浏览器给服务器发的请求会经过这个代理程序,因此可以分析出 请求 和 响应 的结果 安装步骤: 1.在浏览器中输入 Fid

额外说明

wordpress批量标签_如何将帖子批量移动到WordPress中的类别和标签

WordPress 批量标签 Many WordPress beginners often get confused about 类别和标签. You may end up using too many 类别 or 标签 before realizing

ads via 小工具