202101-22 gin源码解读-路由算法 NEW gin的路由算法gin的是路由算法其实就是一个Trie树(也就是前缀树). 有关数据结构的可以自己去网上找相关资料查看.1.1.1. 注册路由预处理我们在使用gin时通过下面的代码注册路由1.1.2. 普通注册router.POST("/somePost", func(context *gin.Context) { context.String(http.StatusOK,&n... Read More >
202101-21 gin源码解读-牛逼的context NEW gin牛逼的contextGin封装的最好的地方就是context和对response的处理. github的README的介绍,基本就是对这两个东西的解释. 本篇文章主要解释context的使用方法, 以及其设计原理1.1.1. 为什么要将Request的处理封装到Context中在阅读gin的源码时, 请求的处理是使用type HandlerFunc func(*Context)来处理的. 也就是func(context *gin.Context) {... Read More >
202101-20 gin源码解读-揭开gin的神秘面纱 NEW 揭开gin的神秘面纱1.1.1. 数据如何在gin中流转package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/ping", func(c *g... Read More >
202101-19 gin源码解读-net/http的大概流程 net/http的大概流程1.1.1. gin框架预览上图大概是gin里面比较重要的模块. 从gin的官方第一个demo入手.package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET(&qu... Read More >
202101-18 gin框架使用jwt对前端用户身份认证 1. 前言JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。2. gin集成Jwtgin 可以自定义中间件,所以集成jwt可以以中间件的方式引入,jwt在golang上已有好几个现成的开源库,我用的是jwt-go,具体使用可以查看GitHub、或 https://pkg.go.dev/github.com/dgrijalva/jwt-go... Read More >
202101-17 golang 各种类型相互转换 时间格式化时间格式化 字符串"2019-04-07 15:15:05"----结果 字符串 2019-04-07T15:15:05+0800package main import ( "encoding/json" "fmt" "time" ) fun... Read More >
202101-16 go语言time.Add()方法使用变量作为参数报错:Cannot use xxx(type int) as the type Duration 在使用time.Add()方法时,可以直接传入一个整数作为参数,如:func main() { t := time.Now() fmt.Println(t) t = t.Add(10 * time.Millisecond) ... Read More >
202101-15 golang日志切割归档 1.1.1. 使用Lumberjack进行日志切割归档这个日志程序中唯一缺少的就是日志切割归档功能。Zap本身不支持切割归档日志文件为了添加日志切割归档功能,我们将使用第三方库Lumberjack来实现。1.1.2. 安装执行下面的命令安装Lumberjack go get -u github.com/natefinch/lumberjack1.1.3. zap logger中加入Lumberjack... Read More >
202101-14 golang自带日志logger介绍 1. Logger1.1.1. 介绍在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:能够将事件记录到文件中,而不是应用程序控制台。日志切割-能够根据文件大小、时间或间隔等来切割日志文件。支持不同的日志级别。例如INFO,DEBUG,ERROR等。能够打印基本信息,如调用文件/函数名和行号,日志时间等。1.1.2. 默认的Go Logger在介绍Uber-go的zap包之前,让我们先看看Go语言提供的基本日志功能。Go语言提供的默认日志包是 https:/... Read More >
202101-14 go好用的配置库viper 项目地址github.com/spf13/viper安装go get github.com/spf13/viper配置文件aaa.yaml: : : : :简单使用 ( ) (){ : () () : () { () } :() (,,)... Read More >
202101-13 go语言系列之日志库zap Zap Logger1.1.1. Uber-go ZapZap是非常快的、结构化的,分日志级别的Go日志库。1.1.2. 为什么选择Uber-go zap它同时提供了结构化日志记录和printf风格的日志记录它非常的快根据Uber-go Zap的文档,它的性能比类似的结构化日志包更好——也比标准库更快。 以下是Zap发布的基准测试信息记录一条消息和10个字段:记录一个静态字符串,没有任何上下文或printf风格的模板:1.1.3. 安装运行下面的命令安装zap &n... Read More >
202101-12 golang-zap日志库的使用及gin框架配置zap记录日志 介绍zap 是go 中比较火的一个日志库,提供不同级别的日志,并且速度快官方文档: https://pkg.go.dev/go.uber.org/zap#section-readme, 也可以github 直接搜索 zap。 文档上面有全面的介绍。鼓励大家观看文档, 可以有视频资料做相关引导,但学东西必须要看到官方文档。尤其是文档也已经适合入门了,先看Quick Start 部分,一般都有入门例子及整体框架介绍。官方文档介绍,非常清晰,还有相关数据对比,并且一般都会具有 ex... Read More >
202101-11 window下gin集成endless报错undefined: syscall.SIGUSR1处理 在 go 的安装目录修改 Go\src\syscall\types_windows.go,增加如下代码:var signals = [...]string{ // 这里省略N行。。。。 /** 找到此位置添加如下 */ 16: "SI... Read More >
202101-10 Go语言系列之标准库flag Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。os.Args如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。package main import ( "fmt" "os" ) //os.Args demo func main() { //os.Args是一个[]strin... Read More >
202101-09 Gin框架优雅关机和重启 背景我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢?阅读本文需要了解一些UNIX系统中信号的概念,请提前查阅资料预习。实现方案信号名称与编号每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。 信号定义在signal.h头文件中,信号名都定义为正整数。具体的信号名称... Read More >
202101-08 一文讲懂服务的优雅重启和更新 在服务端程序更新或重启时,如果我们直接 kill -9 杀掉旧进程并启动新进程,会有以下几个问题:旧的请求未处理完,如果服务端进程直接退出,会造成客户端链接中断(收到 RST)新请求打过来,服务还没重启完毕,造成 connection refused即使是要退出程序,直接 kill -9 仍然会让正在处理的请求中断很直接的感受就是:在重启过程中,会有一段时间不能给用户提供正常服务;同时粗鲁关闭服务,也可能会对业务依赖的数据库等状态服务造成污染。所以我们服务重启或者是重新发布过... Read More >
202101-07 golang中的服务平滑重启类库介绍 三个库 facebookgo/grace - Graceful restart & zero downtime deploy for Go servers. fvbock/endless - Zero downtime restarts for go servers (Drop in replacement for http.ListenAndServe)&... Read More >
202101-06 golang中如何真正平滑重启 背景在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。当模式实验成熟之后会逐渐放量,此时我们的发布停机带来的影响就会大很多。我们整个服务都是基于云,请求流量从 四层->七层->机器。要想实现平滑重启大致有三种方案,一种是在流量调度的入口处理,一般的做法是 ApiGateway + CD ,发布的时候自动摘除机器,等待程序处理完现有请求再做发布处理,这样的好处就是程序不需要关心如何做平滑重启。第二种就是程序自己完成平滑重启,保证在重... Read More >
202101-05 Go语言编程GMP调度模型 并发和并行并发和并行的目的都是为了充分利用 CPU 的多核(多处理器)架构,但两者却有着本质的区别。 并发:在同一时间段内,多条指令在 CPU 上执行。 并行:在同一时刻内,多条指令在 CPU 上执行。并发程序 并不要求 CPU 具备多核计算能力,只要求多个线程在同一个 Core 上进行 “分时轮询” 处理。可以在宏观上实现多线程同时执行的效果。并发程序的执行通常是不确定的,这种不确定性来源于资源之间的相... Read More >
202101-04 面试必备(背)--Go语言八股文系列 1. 垃圾回收详情参考:https://phpmianshi.com/?id=5195典藏版: https://phpmianshi.com/?id=51972. GPM 调度 和 CSP 模型详情参考:https://phpmianshi.com/?id=37393. CHAN 原理3.1 结构体 type hchan struct { qcount uint&n... Read More >