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

go-zero的路由机制解析

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

收录于:17天前

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

. . .

相关推荐

额外说明

由于找不到 iUtils.dll,代码执行无法继续。重新安装该程序可能会解决此问题。

目录 一、下载工具 二、修复办法 三、重启计算机 解决办法: 一、下载工具 工具下载地址:https://www.ewbang.com/community/service/details/1695878580460.html 二、修复办法 操作步骤:打开

额外说明

PostgreSQL 数据库限制

PostgreSQL 数据库存在一些大小和数量的硬性限制。 不过,这些限制通常足够大,因此实际情况往往是系统性能、磁盘空间首先出现问题。 项目 上限 备注 数据库大小 无限制 数据库数量 4,294,950,911 每个数据库中的关系数量 1,431,6

额外说明

【Python入门教程】第60章 函数高级变量关键字参数

本篇我们学习 Python 可变关键字参数(**kwargs)的概念和作用。 可变关键字参数 在 Python 中,函数的参数前面可以使用两个星号(**)作为前缀,例如 **kwwargs。这种参数被称为关键字参数(keyword parameter)。

额外说明

nginx添加echo模块

在nginx已经安装的情况下新增echo模块 1.下载需要新增的模块(升级nginx与此一样) 模块:v0.61.tar.gz 2.解压到与nginx包解压同级的目录 [root@nginx ~]# cd /usr/src/ [root@nginx sr

额外说明

【最全的大数据面试系列】Flink面试题大全

- 作者 :“大数据小禅” - 专栏简介 :本专栏主要分享收集的大数据相关的面试题,涉及到Hadoop,Spark,Flink,Zookeeper,Flume,Kafka,Hive,Hbase等大数据相关技术。大数据面试专栏地址。 - 个人主页 :大数据

额外说明

mysql连接参数配置

前言 mysql性能优化涉及到很多方面,在上一篇中通过explain打印出sql的执行计划可以作为指导开发人员进行sql优化是一个方面,另外,mysql自身的参数配置也很多,比如连接参数(connection),查询缓存等,合理的设置mysql参数对于性

额外说明

scikit-image 中用于图像分割的阈值算法

scikit-image 简介与安装 我们已经在《OpenCV-Python实战(9)——OpenCV用于图像分割的阈值技术》中介绍了图像阈值技术,由于图像阈值技术是许多计算机视觉应用中的关键步骤,因此许多算法库中都包含阈值技术,其中就包括 scikit

额外说明

【Java 基础篇】Java多态:让你的代码更灵活而强大

多态是面向对象编程中的一个重要概念,它允许我们在不同的对象上调用相同的方法,但根据对象的不同,可以产生不同的行为。在 Java 中,多态性是一个强大的特性,它有助于代码的可扩展性和可维护性。本篇博客将深入探讨 Java 中的多态概念、语法和实际应用,适用

额外说明

MobileViG实战:使用MobileViG实现图像分类任务(二)

文章目录 训练部分 导入项目使用的库 设置随机因子 设置全局参数 图像预处理与增强 读取数据 设置Loss 设置模型 设置优化器和学习率调整策略 设置混合精度,DP多卡,EMA 定义训练和验证函数 训练函数 验证函数 调用训练和验证方法 运行以及结果查看

额外说明

leetcode 133. 克隆图

leetcode 133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; p

ads via 小工具