go-zero框架快速入门

文章目录

  • go-zero 简介
    • 安装goctl
    • 安装go-zero
    • 启动go-zero
  • API语言
    • 定义结构体API
    • 定义路由API
    • 格式化对齐
  • 生成代码
    • 生成基本逻辑代码
    • 生成数据库model文件

go-zero 简介

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成代码。

安装goctl

我这里使用 goctl 1.6.4 版本进行后续演示,安装命令:

go install github.com/zeromicro/go-zero/tools/goctl@v1.6.4

安装完成后,查看版本:

goctl --version

安装go-zero

使用下面的命令安装:

go get -u github.com/zeromicro/go-zero@latest

创建项目:

cd xxx #进入到指定的目录
go mod init gozero #自定义一个项目名称
goctl api new gozero #创建工作目录
go mod tidy #自动安装扩展

执行完上面的命令后,就自动生成了 go-zero 的基本代码结构,如下所示:

image-20250106104659053

启动go-zero

接下来,执行 go run gozero.go 即可启动HTTP服务,默认端口8888,在浏览器中访问http://127.0.0.1:8888/

由于默认安装的框架中没有写逻辑层的返回值,我们可以稍微改动一下。在gozero/internal/logic/gozerologic.go 中写下如下的测试代码:

func (l *GozeroLogic) Gozero(req *types.Request) (resp *types.Response, err error) {
	// todo: add your logic here and delete this line

	return &types.Response{
		Message: "Hello " + req.Name,
	}, nil
}

然后查看路由文件 gozero/internal/handler/routes.go 已经定义好了一个路由:/from/:name

接下来,启动服务,在浏览器访问:http://127.0.0.1:8888/from/me

image-20250106105330168

同时,查看控制台,打印出了如下的请求日志:

{"@timestamp":"2025-01-06T10:52:50.231+08:00","caller":"handler/loghandler.go:147","content":"[HTTP] 200 - GET /from/me - 127.0.0.1:56698 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36","duration":"0.2ms","level":"info","span":"b3b8d837f92d24ea","trace":"6810521642bbebef31f2d531e4cf6311"}

至此,一个HTTP服务就启动起来啦!是不是很简单~

API语言

api 是 go-zero 自研的领域特性语言(下文称 api 语言 或 api 描述语言),旨在实现人性化的基础描述语言,作为生成 HTTP 服务最基本的描述语言。

api 领域特性语言包含语法版本,info 块,结构体声明,服务描述等几大块语法组成,其中结构体和 Golang 结构体 语法几乎一样,只是移出了 struct 关键字。

参考:api 语法 | go-zero Documentation

简单地说,就是可以编写最简洁的结构体定义语句,然后生成完整的go代码块。

定义结构体API

在项目的 gozero/gozero.api 中已经生成好了一个默认的 api文件,现在在这个默认的api文件中引入一个我们自定义的api文件:

import (
	"./api/user.api"
)

然后创建我们自定义的api文件:api/user.api,写入如下内容:

syntax = "v1"

info (
	title:   "用户相关业务"
	desc:    "用户的增删改查"
	author:  "renxing"
	email:   "renxing@xxx.com"
	version: "1.0"
)

type UserDetailRequest {
	Id   int32  `json:"id"`
	Name string `json:"name,optional"`
}

type UserDetailResponse {
	Code int64          `json:"code"`
	Msg  string         `json:"msg"`
	Data UserDetailData `json:"data"`
}

type UserDetailData {
	Id   int32  `json:"id"`
	Name string `json:"name"`
}

然后,在Goland编辑器中,选中此文件,右键Override File Type,选择api就可以识别为api文件类型了。

image-20250106110942007

定义路由API

gozero/gozero.api 这个api文件中,已经包含了如下自动生成的代码块:

service gozero-api {
	@handler GozeroHandler
	get /from/:name (Request) returns (Response)
}

接下来,我们在这个文件里面定义用户相关的路由和方法。比如,现在需要生成一个查询用户详细信息的接口。

可以如下定义(写在上面service gozero-api {} 方法块的后面,这里以 /admin 作为前缀):

@server (
	prefix: admin
	group:  admin
)
service gozero-api {
	@doc (
		summary: "用户详细信息"
	)
	@handler UserDetail
	post /user/detail (UserDetailRequest) returns (UserDetailResponse)
}

格式化对齐

有时候,写完的api文件中的代码比较错乱,如果需要对齐,可以使用下面的命令:

goctl api format --dir api/user.api

然后,就可以对齐工整了,也不怕提交到git仓库的时候一大堆变动了。

image-20250106111709718

生成代码

根据上面定义的api的内容,可以快速生成对应的routeshandlerlogic 的基本代码。

生成基本逻辑代码

使用下面的命令,一键生成基本逻辑代码:

goctl api go -api gozero.api -dir .

执行完上述命令后,就自动生成了下面的文件:

image-20250106132820140

其中,gozero/internal/handler/routes.go 自动添加了路由信息:

server.AddRoutes(
  []rest.Route{
    {
      // 用户详细信息
      Method:  http.MethodPost,
      Path:    "/user/detail",
      Handler: admin.UserDetailHandler(serverCtx),
    },
  },
  rest.WithPrefix("/admin"),
)

gozero/internal/handler/admin/userdetailhandler.go 自动生成了handler文件,或者说是controller文件:

// 用户详细信息
func UserDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		var req types.UserDetailRequest
		if err := httpx.Parse(r, &req); err != nil {
			httpx.ErrorCtx(r.Context(), w, err)
			return
		}

		l := admin.NewUserDetailLogic(r.Context(), svcCtx)
		resp, err := l.UserDetail(&req)
		if err != nil {
			httpx.ErrorCtx(r.Context(), w, err)
		} else {
			httpx.OkJsonCtx(r.Context(), w, resp)
		}
	}
}

gozero/internal/logic/admin/userdetaillogic.go 自动生成了逻辑层文件:

type UserDetailLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

// 用户详细信息
func NewUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserDetailLogic {
	return &UserDetailLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *UserDetailLogic) UserDetail(req *types.UserDetailRequest) (resp *types.UserDetailResponse, err error) {
	// todo: add your logic here and delete this line

	return
}

接下来,就可以在上面逻辑层的func (l *UserDetailLogic) UserDetail 部分写我们自己的业务逻辑代码了。

生成数据库model文件

mysql 代码生成支持从 sql 文件和数据库链接生成, 且支持生成带缓存逻辑代码。

mysql 生成的代码内容有数据表对应的 golang 结构体、CURD 操作方法,缓存逻辑等信息,更多详细的数据库代码生成可参考指南 goctl model

goctl model 的基本用法,可以通过 goctl model mysql -h 查看。

一般常用的有下面两种方式:

# 通过ddl生成
goctl model mysql ddl -src="./sql/user.sql" -dir="./goctl_model" -c=true

# 通过datasource生成 (多个表用逗号分隔,如果是全部表,使用 -table="*")
goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="user,goods,order"  -dir="./goctl_model"

生成的数据库model如下:

image-20250106134434134

通过goctl model 生成的model,执行增删改查操作的时候,使用的是原生的SQL语句(select/update/delete/insert),因此不太推荐,这里仅做了解。

更多参考:MySQL 数据库操作 | go-zero Documentation

一般在项目中,推荐使用更强大的gorm库来操作数据库。可以参考:使用Go语言的gorm框架查询数据库并分页导出到Excel实例_go语言 gorm 输出列表-CSDN博客

Go-zero 相关文档

golang 安装 | go-zero Documentation](https://go-zero.dev/docs/tasks)

go-zero - 《go-zero v1.6 教程》 - 书栈网 · BookStack](https://www.bookstack.cn/read/go-zero-1.6-zh/d41d8cd98f00b204.md)

源代码:https://gitee.com/rxbook/go-demo-2025

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950081.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

切忌 SELECT *,就算表只有一列

原文地址 尽量避免 SELECT *,即使在单列表上也是如此 – 如果你现在不同意这一点,读完这篇文章,你可能就要动摇了。 2012年的一个故事 这是我 12 年前(约 2012-2013 年)在客户后台应用程序中遇到的一个真实故事。 当…

了解RabbitMQ中的Exchange:深入解析与实践应用

在分布式系统设计中,消息队列(Message Queue)扮演着至关重要的角色,而RabbitMQ作为开源消息代理软件的佼佼者,以其高性能、高可用性和丰富的功能特性,成为了众多开发者的首选。在RabbitMQ的核心组件中&…

【linux系统之redis6】redis的基础命令使用及springboot连接redis

redis的基础命令很多,大部分我们都可以在官网上找到,真的用的时候可以去官网找,不用全部记住这些命令 redis通用的基础命令的使用 代码测试 string类型常见的命令 key值的结构,可以区分不同的需求不同的业务名字 hash类型 创建…

基于FPGA的交通信号灯实现 (verilog极简实现)

本文分享利用FPGA实现的交通信号灯,FPGA型号为野火征途Pro开发板,具体功能如下: 此项目旨在模拟东西和南北两路口交通信号灯,初始态两路口均为红灯亮,接着,东西路口绿灯亮,南北路口红灯亮&…

在K8S上部署OceanBase的最佳实践

在K8S上部署OceanBase的最佳实践 目录 1. 背景与选型 1.1 为什么选择OB1.2 为什么选择ob-operator实现OB on K8S 2. 部署实操 2.1 环境准备2.2 安装 ob-operator2.3 配置 OB 集群2.4 配置 OBProxy 集群2.5 Headless Service 和 CoreDNS 配置2.6 监控与运维 2.6.1 Promethues部…

unity开发之shader 管道介质流动特效

效果 shader graph 如果出现下面的效果,那是因为你模型的问题,建模做贴图的时候没有设置好UV映射,只需重新设置下映射即可

【JavaWeb】2. 通用基础代码

以下内容来源:编程导航。 无论在任何后端项目中,都可以复用的代码。 1、自定义异常 自定义错误码,对错误进行收敛,便于前端统一处理。 💡 这里有 2 个小技巧: 自定义错误码时,建议跟主流的错…

Excel 技巧04 - 如何计算两个时间之差 (★)

本文讲了如何通过Excel计算两个时间的时间差。 1,计算两个时间的时间差 比如 5:50 ~ 19:40 a),用公式 相减 这样默认算出来的是机械的时间加减,即它们之间相差了 13小时50分钟 b),…

win下搭建elk并集成springboot

一、ELK 是什么? ELK 实际上是三个工具的集合,Elasticsearch Logstash Kibana,这三个工具组合形成了一套实用、易用的监控架构,很多公司利用它来搭建可视化的海量日志分析平台。 ElasticSearch ElasticSearch 是一个基于 Lucen…

JUC--线程池

线程池 七、线程池7.1线程池的概述7.2线程池的构建与参数ThreadPoolExecutor 的构造方法核心参数线程池的工作原理 Executors构造方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPool(int corePoolSize) 为什么不推荐使用内置线程池&…

Java到底是值传递还是引用传递????

在搞懂这个问题之前, 我们要首先了解什么是值传递, 什么是引用传递? 值传递: 传递的是数据的副本,修改副本不会影响原始数据。引用传递: 传递的是数据的引用(地址),修改引用会直接影响原始数据. 也就是说,值传递和引…

屏幕显示技术再突破!海信RGB- Mini LED,让色彩“活”起来

文 | 智能相对论 作者 | 佘凯文 在今天,屏幕显示技术的日新月异,让每次技术革新都引领行业迈向新的高度。 从黑白到彩色,从标清到高清,再到超高清,回顾曾经彩电显示的技术升级,不仅都极大地提升了观众的…

豆包ai 生成动态tree 增、删、改以及上移下移 html+jquery

[豆包ai 生成动态tree 增、删、改以及上移下移 htmljquery) 人工Ai 编程 推荐一Kimi https://kimi.moonshot.cn/ 推荐二 豆包https://www.doubao.com/ 实现效果图 html 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF…

基于SMT32U575RIT单片机-中断练习

任务 查看手册对所有的拓展板上和相对应的底板的引脚对应的端口找到以下结论 通过STM32MX软件对各个引脚进行相应的配置 1.第一种切换模式电脑发送 #include "main.h" #include "icache.h" #include "usart.h" #include "gpio.h"/*…

HNU人工智能期末复习知识点整理

考纲 选择题 ( 30 分 ) (30分) (30分)&#xff1a; 15 15 15个单选 选择题范围为 PPT 内容&#xff0b;课本内容 计算、简答、推理题 ( 70 分 ) (70分) (70分)&#xff1a; 4 4 4个大题&#xff0c;每个大题 2 ∼ 3 2 \sim 3 2∼3小问 4 4 4个大题分别为&#xff1a;机器学习、…

设计DCDC的 Layout的秘诀

很多DCDC芯片的手册都有对应的PCB Layout设计要求&#xff0c;有些还会提供一些Layout示意图&#xff0c;都是大同小异的。 比如我随便列几点buck的设计要点&#xff1a; 1、输入电容器和二极管在与IC相同的面&#xff0c;尽可能在IC最近处。 2、电感靠近芯片的SW&#xff0c;输…

自动驾驶控制与规划——Project 6: A* Route Planning

目录 零、任务介绍一、算法原理1.1 A* Algorithm1.2 启发函数 二、代码实现三、结果分析四、效果展示4.1 Dijkstra距离4.2 Manhatten距离4.3 欧几里德距离4.4 对角距离 五、后记 零、任务介绍 carla-ros-bridge/src/ros-bridge/carla_shenlan_projects/carla_shenlan_a_star_p…

单纯形法的学习笔记

文章目录 A. 单纯形法概述1. 优化模型示例 B. 理论基础C. 算法思想D. 实现算法1. 线性规划的标准型2. 顶点解的理解及表示2.1 在标准型中变量取值为零的意义2.2 顶点解的表示 3. 最优性判断4. 解的更新5. 完成迭代过程 E. 单纯形法的基本概念与本文对照F. 文档源码 前言&#x…

ArmSoM RK3588/RK3576核心板,开发板网络设置

ArmSoM系列产品都搭配了以太网口或WIFI模块&#xff0c;PCIE转以太网模块、 USB转以太网模块等&#xff0c;这样我们的网络需求就不止是上网这么简单了&#xff0c;可以衍生出多种不同的玩法。 1. 网络连接​ 连接互联网或者组成局域网都需要满足一个前提–设备需要获取到ip&a…

[Linux]线程概念与控制

目录 一、线程概念 1.什么是线程 2.线程的轻量化 3.LWP字段 4.局部性原理 5.线程的优缺点 6.进程VS线程 二、线程的控制 1.线程创建 2.获取线程id 3.线程退出与等待 4.创建轻量级进程 三、线程的管理 1.pthread库管理线程 2.线程局部存储 四、C线程库 1.构造函…