Categorygithub.com/hq-cml/go-tools
modulepackage
0.0.0-20241208110050-80ad13c13e46
Repository: https://github.com/hq-cml/go-tools.git
Documentation: pkg.go.dev

# README

一些有趣、简单、实用的go的库

  1. ants:协程池
  2. bigcache:本地缓存
  3. cast:各种基础类型转换,省去断言的麻烦
  4. errors:error的包裹,利用它就可以不必处处打印错误日志,将错误层层包裹上报统一打印,包括调用栈
  5. jsonpath:在不知道具体的json结构的时候,可以用json path来尝试取出值;同时支持各种条件过滤
  6. limiter:go官方的限流器,基于令牌桶的一种实现。在单实例的场景中简单实用,非分布式限流。
  7. singleflight:并发控制,防击穿神器,比如保护DB击穿等等
  8. ecdh: 基于椭圆曲线的密钥交换
  9. echo:http的echo框架使用
  10. metrics: go-metrics在Go性能指标度量中的应用
  11. static: 将一些静态资源文件,编译成go文件
  12. syncmap:官方syncMap库的注释版本

# Packages

* 封装一个协程池,底层用的是ants库 * 注意: ants只是并发度的控制,它不能取代同步机制(如sync.WaitGroup) */.
* 本地缓存 * 在高并发的系统中,缓存的设计,应该是分级的,所以本地缓存有其存在价值 */.
* 在Go中处理动态数据时,通常需要将数据从一种类型转换为另一种类型。Cast是一个库,以一致和简单的方式在不同的go类型之间转换。 * Cast强制转换提供了一些ToXXX 的方法。这些方法将始终返回所需的类型。如果提供的输入不能转换为该类型,则返回该类型的0或nil值。 * Cast也提供了 ToXXXE相同的方法。这些方法返回与ToXXX方法相同的结果,外加一个额外的错误,告诉您是否成功转换。 * 使用这些方法,您可以分辨输入匹配零值时的不同,以及转换失败时返回零值时的不同。 */.
* 基于椭圆曲线的秘钥交换 */.
No description provided by the author
* Golang 的 error 不会像 Java 那样打印 stackTrack 信息。回溯 err 非常不方便。 * 如果自己层层log,写起来费劲并且高并发下还会被隔开。 * 通过 github.com/pkg/errors 这个包来处理 err,可以解决这些问题。 * * 如果只需要附带自己信息,可以WithMessage(err, msg) * 如果需要记录调用栈函数可以Wrap(err, msg) * 注意,使用 log.Errorf("%+v", err) 才会打印 stackTrack,使用 %v %s 不行 * * 利用这个库,就可以不必处处打印错误日志,尤其是在某些第三方调用的底层 * 将错误层层上报,在高层统一一次打印,使得问题定位更加清晰 */.
* 在不知道具体的json结构的时候,可以用json path来尝试取出值 * * Operator Supported Description * $ Y json 的根节点.
* golang官方限流器(只适用于单实例,非分布式) * 限流器是提升服务稳定性的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 * 限流器的实现方法有很多种,常见的限流算法有固定窗口、滑动窗口、漏桶、令牌桶等。 * * 官方限流器用的是令牌桶方法: * 简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。 * 在请求比较的少的时候桶可以先"攒"一些Token,应对突发的流量,如果桶中有剩余 Token 就可以一直取。 * 如果没有剩余 Token,则需要等到桶中被放置了 Token 才行。 * * 最常用的方法:Wait,Allow,Reserve 下面有例子 * * 参考:https://studygolang.com/articles/35102?fr=sidebar */.
* * go-metrics包是Go领域使用较多的是metrics包,该包是对Java社区依旧十分活跃的Coda Hale’s Metrics library的不完全Go移植 * (不得不感慨一下:Java的生态还真是强大)。 * * 支持五种Metric类型: * Gauges :最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态 * Counters:Counter 就是计数器,Counter 只是用 Gauge 封装了 AtomicLong * Meters:Meter度量一系列事件发生的速率(rate),例如TPS。Meters会统计最近1分钟,5分钟,15分钟,还有全部时间的速率。 * Histograms:Histogram统计数据的分布情况。比如最小值,最大值,中间值,还有中位数,75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。 * Timer其实是 Histogram 和 Meter 的结合, histogram 某部分代码/调用的耗时, meter统计TPS。 * * 参考文档:https://blog.csdn.net/smilejiasmile/article/details/125274894 */.
No description provided by the author
* 并发控制,防击穿神器:singleflight * * 缓存击穿: * 缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存 * 过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。 * * 应对措施: * 一般这种情况,都是利用一个分布式锁,比如用redis的setnx简单实现一个,不过还是有点小复杂。 * 如果线上实例不会太多,那么可以考虑直接在本地搞一个锁,直接在本地做一下防击穿(如果分布式实例太多,仍然有风险) * 本地并发控制,如果不自己搞锁,那么用singleflight包也可以搞 * 整个包的核心代码不到100行,充分利用到了map和WaitGroup的特性。 */.
* * statik工具,可以将一些静态的文件,比如一整个目录,都编译成一个go文件,这样就不用去读取遍历目录文件了 * 比如:嵌入web前端资源, 如js/css/html, 用于将包含了web页面的项目通过一个go可执行文件发布出去 * 或者嵌入template模板文件, 这样发布将很简单, 不再需要将tpl文件复制到服务器 * * 安装: * go get github.com/rakyll/statik * go install github.com/rakyll/statik * * 使用: * 1.
No description provided by the author