go-zero的路由机制解析

news2024/11/27 20:58:51

构建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.coloradmin.cn/o/720053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 7 常用数据结构

10大数据结构图示 10大数据类型: redis字符串(String)redis列表(ist)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet)redis地理空间(GEO)redis基数统计(HyperLogLog)redis位图(bitmap)redis位域(bitfield)redis流(Stream) Redis键(key) 命令不区分大小写&am…

Burp代理单个站点

这里写自定义目录标题 Burp代理问题解决代理单个站点(核心) Burp代理问题 平时进行渗透的时候为浏览器挂上代理后往往全部站点都进行代理,有很多没用的包被抓到,影响测试,且和在burp上设置单个站点抓包比较麻烦。 解…

奥威BI云星空标准方案:部署快、一站式的SaaS BI解决方案

奥威BI云星空标准方案是一种基于奥威BI数据云(SaaS平台)的商业智能解决方案,提供一站式的销售管理、客户关系管理、人力资源管理、财务管理等业务流程。该方案提供了从数据连接、数据建模到数据分析与价值挖掘的全链路数据应用服务&#xff0…

[AJAX]使用fetch发送请求

fetch是浏览器原生的函数,不需要像原生AJAX新建实例就可以用于发送AJAX请求。 支持Promise获取异步的HTTP响应,和支持流式获取。 服务端代码 // 服务端准备 // 1、引入express const express require(express); // 2、创建应用对象 const app expre…

springcloud+docker+k8s发布脚本

项目结构如图: Dockerfile 文件 构建镜像: #基础镜像,如果本地仓库没有,会从远程仓库拉取 openjdk:8 FROM openjdk:8 #暴露端口 EXPOSE 9301 #容器中创建目录 RUN mkdir -p /usr/local/java #编译后的jar包copy到容器中创建到目录…

PyTorch的安装(ANACONDA+PyCharm)

文章目录 一、概念1.什么是PyTorch2.什么是ANACONDA3.什么是PyCharm 二、PyTorch的安装1.安装ANACONDA和PyCharm(一路Next即可)2.将ANACONDA与pycharm进行配置3.安装pytorch环境 一、概念 1.什么是PyTorch PyTorch是一个开源的机器学习框架&#xff0c…

软件测试需求分析方法

目录 前言: 1.1 什么是测试需求? 1.2 为什么要做测试需求? 2.测试需求分析方法 2.1 测试需求分析依据 2.2 测试需求架构划分 2.3 测试需求分析过程 2.3.1 测试需求收集 2.3.1.1 测试类型划分 2.3.1.2 测试类型细化 2.3.1.3 生成测…

华为OD机试真题 Python 实现【查找重复代码】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出 一、题目描述 小明负责维护项目中的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。 重复代码查找方法&#xff1…

高频前端面试题汇总之JavaScript篇

近期整理了一下高频的前端面试题,分享给大家一起来学习。如有问题,欢迎指正! 前端面试题系列文章: 【1】「2021」高频前端面试题汇总之HTML篇 【2】「2021」高频前端面试题汇总之CSS篇 【3】「2021」高频前端面试题汇总之Java…

超详细,Pytest自动化测试框架 token全局设置-多套环境使用(实战)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在做自动化测试时…

LAMP环境搭建

文章目录 LAMP环境搭建LAMP概述LAMP搭建安装Apache服务器安装mariadb(mysql)安装PHP PHP连接MySQLLAMP搭建论坛 LAMP环境搭建 LAMP概述 LAMP是一个常用的Web应用程序开发和部署平台,它是由以下四个开源软件的首字母组成: Linux(操作系统&a…

【开发问题】sqlserver怎么开启cdc

怎么开启 执行sql1、创建cdc​2.如上执行完毕之后&#xff0c;会在<database_name>数据库下的“系统表”中创建如下六个系统表&#xff1a;3.验证SQLServer库级别CDC是否启用4.启用SQLServer表级别CDC功能&#xff08;针对某一张表&#xff09;5、验证SQLServer表级别是否…

计算机毕业论文内容参考|基于微信小程序和云开发的小区垃圾分类知识手册平台的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势相关技术与方法介绍系统分析总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于微信小程序和云开发的小区垃圾分类知识手册平台的设计与实现 摘要 本文介绍了基于微信小程序和云开发的小区垃圾分类知识手…

智慧餐厅系统(外卖、堂食)

智慧餐厅是基于物联网和云计算技术为餐饮店量身打造的智能管理系统&#xff0c;通过客人自主点餐系统、服务呼叫系统、后厨互动系统、前台收银系统、预定排号系统以及信息管理系统等可显著节约用工数量、降低经营成本、提升管理绩效。 系统功能介绍 客户端 1、自助点餐系统&…

JavaScript(基础语法篇)

目录 初识 JavaScript JavaScript 是什么 发展历史 JavaScript 和 HTML 和 CSS 之间的关系 JavaScript 运行过程 JavaScript 的组成 前置知识 JavaScript 的书写形式 1. 行内式 2. 内嵌式 3. 外部式 注释 输入输出 输入: prompt 输出: alert 选择框&#xff1a…

如何用 TDengine 预测 “未来”

介绍 TDengine™ 是一种开源的云原生时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;&#xff0c;专为物联网&#xff08;IoT&#xff09;、连接汽车和工业物联网进行了优化。它能够高效地实时摄取、处理和监控一天内由数十亿个传感器和数据收集器产…

美女小姐姐是你得菜吗~PYTHON采集西瓜小姐姐

目录标题 前言第三方模块&#xff1a;环境介绍:基本流程:代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 第三方模块&#xff1a; requests >>> pip install requests 第三方模块安装: win R 输入cmd 输入安装命令 pip install 模块名 (如果你觉…

Matlab|改进的粒子群算法优化支持向量机(多分类)

作者在前面的文章中介绍了粒子群算法的原理及其2种改进算法&#xff0c;本文将基于这三种优化方法&#xff0c;应用于支持向量机进行分类&#xff0c;并对比改进算法与标准粒子群算法的分类性能&#xff0c;结果显示改进后的方法能够得到更佳的分类效果。&#xff08;在对PSO-S…

小程序实现自定义分享微信好友

首先在全局page.json中添加"shareAppMessage": true {"path": "pages/brandCoupon/brandCoupon","style": {"navigationBarTitleText": "霸王餐","navigationStyle": "custom","enable…

3D建模软件、Creo 3D 、Creo8安装、下载教程

PTC Creo 8.0 是一款三维 CAD 软件&#xff0c;适用于多个行业和应用场景&#xff0c;包括机械设计、工业设计、电子设计等等。以下是 PTC Creo 8.0 的功能介绍和安装条件&#xff1a; 功能介绍&#xff1a; 三维建模&#xff1a;可以使用多种工具进行三维建模&#xff0c;包…