Mygin中间件优化及日志中间件
本篇是mygin的第七篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现。
目的
- 中间件Middleware优化
- 默认log日志中间件
在上篇 Mygin实现中间件Middleware 中间件Middleware很生硬,完全依赖循环,如果某个中间件想要cover住全部中间件,比如我想记录,整个请求的耗时时间,以便针对优化的功能。因此需要把之前生硬的方式做一些修改。
修改
1.实例化上下文修改
//实例化一个下上文
c := &Context{
Request: r,
Writer: w,
Params: params,
handlers: handlers,
index: -1, //默认下标为-1
}
2.修改上下文Next方法
// Next 执行链中的剩余处理程序。
func (c *Context) Next() {
c.index++
//遍历handlers
for c.index < int8(len(c.handlers)) {
//真正调用执行handler方法
c.handlers[c.index](c)
c.index++
}
}
日志
参照(复制)gin中的写法,新建mygin/logger.go日志中间件文件。
- mygin/logger.go
package mygin
import (
"fmt"
"net/http"
"time"
)
const (
green = "\033[97;42m" // 绿色
white = "\033[90;47m" // 白色
yellow = "\033[90;43m" // 黄色
red = "\033[97;41m" // 红色
blue = "\033[97;44m" // 蓝色
magenta = "\033[97;45m" // 洋红色
cyan = "\033[97;46m" // 青色
reset = "\033[0m" // 重置颜色
)
type LogFormatterParams struct {
}
// MethodColor 方法颜色获取
func (l *LogFormatterParams) MethodColor(method string) string {
switch method {
case http.MethodGet:
return blue
case http.MethodPost:
return cyan
case http.MethodPut:
return yellow
case http.MethodDelete:
return red
case http.MethodPatch:
return green
case http.MethodHead:
return magenta
case http.MethodOptions:
return white
default:
return reset
}
}
// StatusCodeColor 状态颜色获取
func (l *LogFormatterParams) StatusCodeColor(code int) string {
switch {
case code >= http.StatusOK && code < http.StatusMultipleChoices:
return green
case code >= http.StatusMultipleChoices && code < http.StatusBadRequest:
return white
case code >= http.StatusBadRequest && code < http.StatusInternalServerError:
return yellow
default:
return red
}
}
// LoggerFunc 记录日志的方法
func (l *LogFormatterParams) LoggerFunc() HandlerFunc {
return func(context *Context) {
// 启动时间
start := time.Now()
// 后续处理请求
context.Next()
//后续处理请求 结束时间
now := time.Now()
str := fmt.Sprintf("[MyGIN] %v |%s %3d %s| %13v |%s %-7s %s %#v\n",
now.Format("2006/01/02 - 15:04:05"),
l.StatusCodeColor(context.status), context.status, reset,
now.Sub(start), //耗时
l.MethodColor(context.Request.Method), context.Request.Method, reset,
context.Request.URL.Path,
)
fmt.Println(str)
}
}
日志中间件
测试
测试代码
package mygin
import (
"net/http"
"path"
"testing"
)
func TestMyGin06(t *testing.T) {
r := Default()
r.Use()
//测试需要登录
group := r.Group("/api", func(context *Context) {
//todo....
context.String(http.StatusOK, "api Group 中间件失败了....\n")
context.Abort()
})
group.Use()
//这个回调不会执行
group.GET("/hello/:name", func(context *Context) {
name := context.Params.ByName("name")
context.String(http.StatusOK, path.Join("hello ", name, "!"))
})
//测试没有发生Abort
group2 := r.Group("/api2", func(context *Context) {
//todo....
context.String(http.StatusOK, "api Group 中间件成功了....\n")
})
//这个回调会执行
group2.GET("/hello2/:name", func(context *Context) {
name := context.Params.ByName("name")
context.String(http.StatusOK, path.Join("hello2 ", name, "!\n"))
})
// 启动服务器并监听端口
r.Run(":8088")
}
启动测试
go test
curl请求测试
curl -i http://localhost:8088/api2/hello2/scott
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 30 Jan 2024 06:56:03 GMT
Content-Length: 49
api Group 中间件成功了....
hello2 /scott/!
➜ ~ curl -i http://localhost:8088/api/hello/scott
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 30 Jan 2024 06:56:26 GMT
Content-Length: 33
api Group 中间件失败了....
查看控制台输出

Mygin中间件优化及日志中间件的更多相关文章
- 高吞吐koa日志中间件
Midlog中间件 node服务端开发中少不了日志打点,而在koa框架下的日志打点在多进程环境中日志信息往往无法对应上下文,而且在高并发下直接进行写buffer操作(内核调用writev)也会造成内存 ...
- 咏南中间件新增SQL日志
为了方便开发时跟踪调试SQL语句的执行情况,咏南中间件新增SQL日志,所有执行过的SQL都会写入SQL日志文件中. SQLDEBUG设为1,启用:设为0,停止写SQL日志.
- ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- 自定义Django中间件(登录验证中间件实例)
前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- express中的中间件(middleware)、自定义中间件、静态文件中间件、路由中间件
express文档地址 什么是中间件呢(middleware)?它是谁的中间件呢? 首先我们需要了解到请求和响应, 请求就是客户端发送请求给服务器, 响应就是,服务器根据客户端的请求返回给客户端的数据 ...
- 什么是django中间件?(七个中间件-自定义中间件)
目录 一:django中间件 1.什么是django中间件 2.django请求生命周期流程图 二:django自带七个中间件 1.研究django中间件代码规律 2.django支持程序员自定义中间 ...
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 自定义ASP.NET Core日志中间件
这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息. 1.首先创建一个Web应用项目,我选择的是MVC模板: 2.使用NuGet添加Microsoft.Extens ...
- Mbp通过筛选器和中间件实现异常,日志,事务及接口返回数据格式化aop处理.
Mbp应用服务层的AOP实现 实现方法:asp.net core mvc 筛选器 + 中间件 日志,事务,和接口返回结果统一格式化采用操作筛选器,而异常处理采用中间件来处理. 最开始,我是打算用aut ...
随机推荐
- MAC SAP for JAVA配置
一.自定义应用程序服务器配置 conn = /H/<SAP路由器服务器地址(如果有)>/S/3299 /H/<SAP服务器地址>/S/32<Instance_no> ...
- 【内核】深入分析内核panic(一)--内核问题的原因
1 概述 linux内核包括进程管理.内存管理.中断管理.设备驱动.同步机制等各种模块,它们共同运行在一个共享的地址空间中,因此在运行中一旦出现问题,彼此之间可能具有千丝万缕的联系. 而且与用户态不同 ...
- Laravel - 使用查询构造器查询
public function constructorQuery() { # 1,新增 DB::table('student')->insert([ ...
- 远程连接-ssh
- 【ES系列】(一)简介与安装
首发博客地址 首发博客地址 系列文章地址 教学视频 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了 ...
- [转帖]clickhouse 超底层原理& 高可用集群 实操(史上最全)
https://www.cnblogs.com/crazymakercircle/p/16718469.html 文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵 ...
- [转帖]【数据库架构】NewSQL和PGXC
数据库架构风格 数据库的基本架构 分库分表方案 分布式事务和跨节点查询 PGXC NewSQL:原生分布式数据库 总结 数据库的两种架构风格:NewSQL(代表Google Spanner).Prxo ...
- [转帖]Oracle优化案例:vfs_cache_pressure和min_free_kbytes解决RMAN挂起问题
https://www.modb.pro/db/34028 环境: Oracle 11gr2 + dataguard 512GB内存 + 128核cpu + 高性能存储服务器 uname -an Li ...
- [转帖]RAC环境下误操作将数据文件添加到本地存储
https://www.cnblogs.com/jyzhao/p/7986729.html 今天碰到个有意思的事情,有客户在Oracle RAC环境,误操作将新增的数据文件直接创建到了其中一个节点的本 ...
- [转帖]egrep及扩展的正则表达式
egrep: egrep = grep -E 语法:egrep [选项] PATTERN [FILE...] 扩展正则表达式的元字符: 字符匹配: .:匹配任意单个字符: [ ]:匹配指定范围内的任意 ...