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.goclient.gochannel.go 组成,分别完成相应功能,具体看一下代码。

client.go 中Client结构,收到http请求后创建:

type Client struct {
    lastEventId,
    channel string
    send chan *Message
}

[Read More]

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,
	})
}

[Read More]

Go 源码学习( go-cache )

go-cache

https://github.com/patrickmn/go-cache 缓存

上次学习 gin-contrib/cache 的源码时,说到其支持的 go-cache 内存缓存,但发现该库最后更新是5、6年前,并且fork自:patrickmn/go-cache ,而原作者去年仍然在少量更新,并且有一些变化,今天对这个库阅读分析一下。

这是一个类似于memcachedkey-value型内存缓存,但并不是独立服务程序,可以被当做一个库编译进程序,适合单机应用,线程安全。

[Read More]

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()))
	}))

[Read More]

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()
	}
}

[Read More]