记录一些值得学习的Go开源项目,以下是部分链接,留待以后学习。<置顶>
Gin 源码学习(Gin JWT Middleware)
Gin JWT Middleware
记录一个Gin框架的JWT中间件,项目地址:https://github.com/appleboy/gin-jwt
这个项目是利用 dgrijalva/jwt-go 项目来实现JSON Web Tokens
,简称JWT
。什么是JWT
,可以参看这个文档 JSON Web Token (JWT) ,也可以百度,这有个中文介绍:什么是 JWT – JSON WEB TOKEN 。
xUID 三种唯一ID生成
GUID-UUID-NUID
开发项目中可能经常会使用到唯一标识符(Unique Identifier
),特别是设计一些并发并行的应用系统,之前在Github上看到了一些生成算法库,在此做些学习记录,以备或需。
UUID
第一种UUID
,这个就不用多说了,很多语言标准库里面都提供了生成函数,Go的标准库里面没有,但是万能的开源社区提供了多个项目,用来实现符合RFC4122
规范的UUID
。
[Read More]我看了两个项目:
一个适合Go入门者的教程
Gobyexample
今天看到一个适合Go初学者、入门者,以及某些记性差的(比如我)一段时间老不用Go开发就忘记了语法,重看语言基础的时候,可以浏览的教程,带示例讲解,注释浅显易懂。
英文原版:
中文翻译:
特此记录,感谢作者,翻译者。
Go 源码学习( go-sse )
alexandrevicenzi-go-sse
上次学习了gossed
项目 https://github.com/benas/gossed
再来学习一下它用到的核心开源库:https://github.com/alexandrevicenzi/go-sse
这个项目也是一个Go语言实现SSE的库,按照README里面的说明:支持多通道隔离,广播,自定义headers
,支持Last-Event-ID
,遵循SSE规范。
这个库主要由三个核心源文件 sse.go
,client.go
,channel.go
组成,分别完成相应功能,具体看一下代码。
client.go
中Client结构,收到http请求后创建:
type Client struct {
lastEventId,
channel string
send chan *Message
}
Go 源码学习( gossed )
benas-gossed
上次说到Gin框架中有Server-Send Events
的实现,这次针对SSE又进一步做了些研究,涉及到两个项目,分两篇学习。项目地址:https://github.com/benas/gossed
这个项目是利用alexandrevicenzi/go-sse 项目来实现将标准输入数据转发给浏览器,这是个有趣的项目,可以用浏览器来实时监控某些你想要监控的数据。:)
[Read More]Gin 源码学习(Gin SSE Middleware)
Gin SSE Middleware
https://github.com/gin-contrib/sse Server-Send Events
这个项目是Server-Send Events
协议的Go语言实现,有关Server-Send Events
的知识,可以参看这几个链接:谷歌HTML5项目网站一篇精彩介绍 和 阮一峰的中文教程 ,这是HTML5
的一个技术规范,用于服务器向浏览器单向推送消息,相对于Websocket
协议,更简单和轻量化。
这个项目被用在了Gin框架之中,用来实现Gin对SSE的支持(c.SSEvent()
)。具体可以参看Gin框架源码中实时聊天高级示例 的代码。
下面简单分析和记录一下这个库的工作原理。
Gin中提供了一个方法,支持返回SSEvent
数据,返回的是一个sse.Event
:
// SSEvent writes a Server-Sent Event into the body stream.
func (c *Context) SSEvent(name string, message interface{}) {
c.Render(-1, sse.Event{
Event: name,
Data: message,
})
}
Go 源码学习( go-cache )
go-cache
https://github.com/patrickmn/go-cache 缓存
上次学习 gin-contrib/cache 的源码时,说到其支持的 go-cache 内存缓存,但发现该库最后更新是5、6年前,并且fork自:patrickmn/go-cache ,而原作者去年仍然在少量更新,并且有一些变化,今天对这个库阅读分析一下。
这是一个类似于memcached
的key-value
型内存缓存,但并不是独立服务程序,可以被当做一个库编译进程序,适合单机应用,线程安全。
Gin 源码学习(Gin Cache Middleware)
Gin Cache Middleware
https://github.com/gin-contrib/cache 缓存
这个项目是Gin的一个Middleware,用于缓存请求结果,目前支持 go-cache 内存缓存(ps:这个库最新的应该是这个地址:patrickmn/go-cache)、memcached 缓存、redis 缓存三种类型。这三个库以后再阅读学习,今天先完成这个项目的学习。缓存用的key采用urlEscape
函数生成,规则为:前缀+冒号+URL(或其MD5)。
示例中仅仅给了一个CachePage
的用法:
r.GET("/cache_ping", cache.CachePage(store, time.Minute, func(c *gin.Context) {
c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))
}))
Gin 源码学习(Gin Limit Middleware)
Gin Limit Middleware
https://github.com/aviddiviner/gin-limit 请求限制
代码超级简单呐,利用空结构体和缓冲为n的chan做连接限制,请看:
func MaxAllowed(n int) gin.HandlerFunc {
sem := make(chan struct{}, n)
acquire := func() { sem <- struct{}{} }
release := func() { <-sem }
return func(c *gin.Context) {
acquire() // before request
defer release() // after request
c.Next()
}
}