苦学golang半年,写了一款web服务器
苦学golang半年,写了一款web服务器
文章目录
- 苦学golang半年,写了一款web服务器
- example
项目地址:https://github.com/fengyuan-liang/jet-web-fasthttp
可以的话,请star支持一下🙂
苦学golang半年,写了一款web服务器,里面包含笔者各种工程实践,大佬勿喷😊
为什么不使用Gin,而要自己开发一款web服务器呢?其实gin已经非常好了👍,笔者这里主要是想要把自己开发中的工程实践提炼出来,打造出更加顺手的兵器🏹️(现在还只是个玩具🪀,大家看个乐子就行)
那么在使用Gin中有哪些痛点呢?
-
繁琐的路由表,在
Gin中必须写路由表来映射路由,再写对应的func(ctx *gin.Context ),总感觉多写了一次,而且接口一多,看着一望无际的路由表,总感觉划分的不是很优雅,而且不太好找自己想要的接口;并且笔者在写springBoot项目时,非常喜欢用restful插件来找路由,比如输入/v1/xxx/xxx/xxx就能找到对应的路由,但是在gin的路由表不是很好找 -
每个gin的路由都必须要手动获取参数,然后校验,校验不通过再返回错误(像下面那样),这部分逻辑感觉完全应该复用(完全忍受不了写重复代码😠)。参数就应该交给框架解析,或者说有
切面或者hook来统一完成这部分的逻辑// gin engine.Get("/v1/xxx", xxx)func xxx(ctx *gin.Context) {var (err errorparams xxxx)// Bind your param dataif err = ShouldBindQuery(ctx, ¶ms); err != nil {ctx.AbortWithStatusJSON(http.StatusOK, "traceId", 400, "bad request"))return}// validator your paramif err = validator.New().Struct(¶ms) ;err != nil {ctx.AbortWithStatusJSON(http.StatusOK, "traceId", 400, "bad request"))return}// do you codectx.JSON(http.StatusOK, "traceId", "ok")) } // 相比之下,参数Jet会自动帮你注入到你的参数列表里面,并且可以定义Hook统一在参数解析完毕,调用我们自己方法之前处理参数校验的逻辑 // Jet func(YourJetController) GetV1Xxx(ctx jet.Ctx, args *Xxx) (any, error) {// do you codereturn xxx, err } -
接下来不是
Gin的缺点,毕竟Gin只是一个基础的web框架,就是笔者更喜欢MVC架构或者DDD模式开发,这里面使用到依赖注入管理生命周期是比较合适的,笔者也不喜欢用类似wire需要生成代码的方式进行依赖注入,所有笔者使用Dig进行依赖注入,反射的方式其实也只影响项目启动的时间,但是go的启动本身就很快了,看不出啥影响 -
然后就是定义了一些常用的数据结构,例如
Trie、LinkedHashMap,在golang里面其实提供的数据结构挺少的,但是像LinkedHashMap用的地方其实很多,我们需要O(1)级别的查找和添加,又需要有序的集合顺序func TestLinkedHashMap(t *testing.T) {m := maps.NewLinkedHashMap[string, int]()m.Put("one", 1)m.Put("two", 2)m.Put("three", 3)m.ForEach(func(k string, v int) {t.Logf("%s: %d\n", k, v)}) }$ go test -run TestLinkedHashMap one: 1 two: 2 three: 3 PASS ok GoKit/collection/maps 0.166s
example
下面是使用的一个例子
func main() {//jet.Register(&DemoController{})xlog.SetOutputLevel(xlog.Ldebug)jet.AddMiddleware(jet.TraceJetMiddleware)jet.Run(":8080")
}// 使用依赖注入的方式注入需要让Jet管理的Controller
func init() {jet.Provide(NewDemoController)
}func NewDemoController() jet.ControllerResult {return jet.NewJetController(&DemoController{})
}type BaseController struct {jet.IJetController
}// 对参数进行校验,如果不通过会返回`reg_err_info`中定义的错误
func (BaseController) PostParamsParseHook(param any) error {if err := utils.Struct(param); err != nil {return errors.New(utils.ProcessErr(param, err))}return nil
}// PostMethodExecuteHook restful 将所有请求以restful方式返回
func (BaseController) PostMethodExecuteHook(param any) (data any, err error) {// restfulreturn utils.ObjToJsonStr(param), nil
}// 上面的两个hook可以直接让controller继承jet.BaseJetController,这样就不用写了type DemoController struct {BaseController
}type Person struct {Name string `json:"name" validate:"required" reg_err_info="不能为空"` // 校验不通过会返回`reg_err_info`的内容Age int `json:"age"`
}// 路由 get /v1/usage/{id}/week 已经可以访问了
func (j *DemoController) GetV1Usage0Week(ctx jet.Ctx, args *jet.Args) (any, error) {ctx.Logger().Infof("GetV1Usage0Week %v", *args)return map[string]any{"request_id": ctx.Logger().GenReqId(), "code": 200, data: args}
}
$ curl http://localhost:8080/v1/usage/1/week
{"request_id":"H5OQ4Jg0yBtg","code":200,"message":"success","data":["1"]}
正常情况下会打印日志的全路径,我们在启动时候加上-trimpath就可以只打印项目的path


相关文章:
苦学golang半年,写了一款web服务器
苦学golang半年,写了一款web服务器 文章目录 苦学golang半年,写了一款web服务器example 项目地址:https://github.com/fengyuan-liang/jet-web-fasthttp 可以的话,请star支持一下🙂 苦学golang半年,写了一款…...
uniapp vue2 车牌号输入组件记录
uniapp vue2 车牌号输入案例记录 组件如图 直接上代码 1.html <template><view><view class"plate" :class"{show: show}"><view class"itemFirst flex-d"><view class"item item1" click"handl…...
Unity 点击对话系统(含Demo)
点击对话系统 可实现点击物体后自动移动到物体附近,然后弹出对话框进行对话。 基于Unity 简单角色对话UI脚本的编写(新版UI组件)和Unity 关于点击不同物品移动并触发不同事件的结合体,有兴趣可以看一下之前文章。 下边代码为U…...
vue接入高德地图
使用 JSAPI 安全模式,代理服务请以_AMapService 作为一级路由 index.html <script type"text/javascript">window._AMapSecurityConfig {serviceHost: "http://xx.xx.xx.xx:8223/_AMapService"};</script><script type"text/javascr…...
Linux的基本指令(5)
目录 bc指令 uname指令 压缩解压相关的指令 zip指令 unzip指令 tar打包压缩指令 tar解压解包指令 传输指令sz&rz 热键 关机命令 安装:yum install -y 指令 bc指令 bc命令可以很方便的进行浮点运算 Linux中的计算器 uname指令 语法:unam…...
华为商城秒杀时加密验证 device_data 的算法研究
前言 之前华为商城放出 Mate60 手机时, 想给自己和家人抢购一两台,手动刷了好几天无果后,决定尝试编写程序,直接发送 POST 请求来抢。通过抓包和简单重放发送后,始终不成功。仔细研究,发现 Cookie 中有一个名为 devic…...
Wrk压测发送Post请求的正确姿势
一、Wrk简介 wrk 是一个能够在单个多核 CPU 上产生显著负载的现代 HTTP 基准测试工具。它采用了多线程设计,并使用了像 epoll 和 kqueue 这样的可扩展事件通知机制。此外,用户可以指定 LuaJIT 脚本来完成 HTTP 请求生成、响应处理和自定义报告等功能。 …...
【管理篇 / 登录】❀ 06. macOS下使用USB配置线登录 ❀ FortiGate 防火墙
【简介】飞塔防火墙上都会配有CONSOLE接口,包装里都会配置一根USB配置线,通过这个接口和这根线,我们可以用命令的方式登录飞塔防火墙。随着苹果电脑的普及,我们来学习如何在macOS中使用USB配置线登录飞塔防火墙。 早期飞塔防火墙包…...
linux系统shell语言的自动化交互
自动化交互 自动化交互expect交互expect用法 sshpass概念shhpass的脚本批量拷贝文件批量传递秘钥批量修改密码 自动化交互 expect交互 yum -y install expect tcl tcl-devel //安装expect交互工具expect用法 用法: 1)#!/usr/bin/expect //定义脚本执行的shell 2)set …...
HarmonyOS ArkTS 三方库的基本使用(十六)
如何获取三方库 目前提供了两种途径获取开源三方库: 1、通过访问Gitee网站开源社区获取 在Gitee中,搜索OpenHarmony-TPC仓库,在tpc_resource中对三方库进行了资源汇总,可以供开发者参考。 2、通过OpenHarmony三方库中心仓获取 …...
Spring boot封装rocket mq 教程
1、rocket mq版本 5.1.3 2、pom引入rocket mq依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client-java</artifactId><version>5.0.4</version></dependency> 3、发送MQ消息工具类 impor…...
Java Swing手搓童年坦克大战游戏(I)
前言 业余偶尔对游戏有些兴趣,不过这样的时代,硬件软件飞速进步,2D游戏画面都无比精美,之前的8bit像素游戏时代早就过去了,不过那时候有许多让人印象深刻的游戏比如魂斗罗、超级玛丽、坦克大战(Battle City)等等。 学…...
【DevOps-04]】Operate阶段工具
一、简要说明 安装Docker安装Docker-compose二、安装Docker 官网地址:https://www.docker.com文档地址:Docker Docs仓库地址:https://hub.docker.com1、Docker相关网站 官方网站Get Docker | Docker Docs...
力扣2807.在链表中插入最大公约数
思路:遍历链表,对于每一个结点求出它与下一个结点的最大公约数并插入到俩个结点之间 代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}…...
开始刷Leetcode之前你需要知道的 - The basic is all you need
数据结构:列表,哈希表,集合,栈,堆,链表,二叉树,图 入门算法:递归,排序算法,二分法,bfs,dfs list/array 列表常见操作&am…...
【PostgreSQL】模式Schema
PostgreSQL 数据库集群包含一个或多个命名数据库。角色和一些其他对象类型在整个集群中共享。与服务器的客户端连接只能访问单个数据库中的数据,该数据库在连接请求中指定。 数据库包含一个或多个命名schema,而这些schema又包含表。schema还包含其他类型…...
JavaScript实现的复杂功能:自动生成带水印的图片
#程序员的崩溃瞬间 在本文中,我们将讨论一个JavaScript实现的复杂功能,该功能可以自动为图片添加水印。这个功能在许多场景中都非常有用,例如,如果你想保护你的图片版权,或者你想在你的网站上显示自定义的水印。 一、…...
图神经网络|8.2 图卷积的计算基本方法
不同于一般的神经网络,网络层数的并不用特别多。 原因是只需要少数次数迭代后(当迭代次数为图上的直径?任意两点最短距离的最大值?),某节点便可获取得到图上所有的节点。 通俗的理解是,在社会中…...
equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。 回到…...
六、基于Flask、Flasgger、marshmallow的开发调试
基于Flask、Flasgger、marshmallow的开发调试 问题描述调试方法一调试方法二调试方法三 问题描述 现在有一个传入传出为json格式文件的,Flask-restful开发的程序,需要解决如何调试的问题。 #!/usr/bin/python3 # -*- coding: utf-8 -*- # Project :…...
InstructPix2Pix真实体验:保留原图结构的智能修图,到底有多好用?
InstructPix2Pix真实体验:保留原图结构的智能修图,到底有多好用? 1. 颠覆传统的修图体验 作为一名长期与图像处理打交道的技术从业者,我第一次使用InstructPix2Pix时的感受可以用"惊艳"来形容。传统的图像编辑工具需要…...
PHP反序列化实战:手把手教你绕过CTF题中的字符检查与属性保护
PHP反序列化漏洞实战:从CTF解题到真实场景防御 在网络安全竞赛中,PHP反序列化漏洞一直是高频考点。这类漏洞不仅存在于CTF比赛中,也广泛存在于真实世界的Web应用中。本文将从一个典型CTF题目入手,深入剖析PHP反序列化的攻击手法与…...
石家庄整家定制哪个口碑好
在石家庄选择整家定制服务时,许多家庭会关注品牌的口碑、设计、环保与工艺。一个注重细节、提供系统解决方案的品牌,往往能更好地满足现代家居生活的需求。为什么整家定制受到青睐?整家定制能够根据户型、居住者习惯和审美偏好,提…...
SQL调优实战手册:索引、并行、参数调优一站式解决方案
做企业级业务开发久了,都会碰到同一个难题:数据量越积越多,原本跑得顺畅的SQL慢慢开始变慢,轻则接口响应延迟,重则整个系统卡顿,甚至影响核心业务流转。尤其是用KingbaseES这款国产企业级数据库(…...
如何用FDS火灾动力学模拟器预知建筑火灾的致命威胁?5个关键步骤让你成为安全专家
如何用FDS火灾动力学模拟器预知建筑火灾的致命威胁?5个关键步骤让你成为安全专家 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 想象一下,当火灾发生时,你能提前知道烟雾会如何扩散…...
稀疏矩阵实战:手把手教你用ILU预处理子搞定有限元分析中的病态方程组
稀疏矩阵实战:手把手教你用ILU预处理子搞定有限元分析中的病态方程组 在计算力学和CFD领域,工程师们每天都要面对一个令人头疼的数学难题——如何高效求解那些由有限元分析产生的大型稀疏线性方程组。想象一下,当你花费数小时构建精美的三维模…...
深度测评:2026年最值得拥有的专业降AI率工具
2026年论文降AI率工具已从“基础修改”升级为智能化、多维度的学术合规解决方案,核心评价维度涵盖AIGC识别精度、文本自然度、文献真实性、格式合规性、查重适配性及多语言支持。本次测评涵盖6款主流工具,覆盖中英文写作、全流程与专项优化、免费与付费模…...
3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由
3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由 【免费下载链接】Yuedu 📚「阅读」APP 精品书源(网络小说) 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 你是否经历过这样的时刻:深夜追更的小说…...
达摩院春联生成模型实战:输入两字祝福词,自动生成上下联和横批
达摩院春联生成模型实战:输入两字祝福词,自动生成上下联和横批 1. 春联生成模型简介 1.1 模型核心功能 达摩院AliceMind团队开发的春联生成模型是一款基于PALM大模型的专用AI工具,它能将简单的两字祝福词转化为完整的春联作品。这个模型特…...
3种高效方案破解NCM格式限制:从单文件到批量处理的完整指南
3种高效方案破解NCM格式限制:从单文件到批量处理的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为网易云音乐的NCM加密格式而烦恼?当你想要在非网易生态设备上播放已购买音乐时࿰…...
