goflow 是一个基于 Go 语言的高性能、可扩展、分布式的工作流框架,由 GitHub 用户 s8sg 开发。它允许开发者以编程方式将分布式工作流定义为任务的有向无环图(DAG),并通过多个工作节点(Worker)均匀分配负载来执行任务。 核心特性 1. DAG 构建与任务编排 goflow 允许用户以 DAG 的形式定义工作流,每个节点代表一个任务,边表示任务之间的依赖关系。这种结构使得任务的执行顺序清晰,便于管理复杂的工作流程。 2. 分布式执行与负载均衡 任务可以分布在多个 Worker 上执行,goflow 通过均匀分配负载的方式,确保各个 Worker 的工作量平衡,从而提高整体执行效率。 3. 可扩展的服务架构 goflow 提供了 FlowService 结构体,允许用户配置服务的端口、Redis 地址、OpenTrace 地址、Worker 并发数等参数,便于根据实际需求进行扩展和调整。 4. 内置监控与可观测性 框架支持集成 OpenTracing,提供对工作流执行过程的监控和追踪功能,帮助开发者及时发现和解决问题。 5. Redis 支持 goflow 使用 R.... 有更新! golang每日一库之goflow golang每日一库
今天介绍一个工作流库。 Fastflow 是一个由 ShiningRush 开发的基于 Go 语言的轻量级、高性能分布式工作流框架。 它旨在解决复杂任务流的调度与执行问题,特别适用于如离线任务、Kubernetes 集群管理、容器迁移等场景。 特点 基于 DAG 的工作流模型 Fastflow 使用有向无环图(DAG)定义任务之间的依赖关系。每个节点(Task)代表一个操作,只有其所有依赖任务成功完成后,才会被触发执行。 高性能与并发执行 借助 Go 的协程和 channel 技术,Fastflow 能在单个实例上并行处理数百到数万个任务,满足高并发需求。 可观测性 集成 Prometheus,Fastflow 提供任务执行的实时指标,如并发任务数、任务分发时间等,便于监控和调试。 水平扩展与负载均衡 支持多实例部署,通过 Leader 选举机制实现节点间的负载均衡,确保系统在高负载下的稳定性。 易用的 API 与扩展性 提供开箱即用的 API,支持通过编程或 YAML 定义工作流。用户可以自定义任务行为(Action),并根据上下文决定是否跳过任务。 轻量级集成 作为基础框架,Fas.... 有更新! golang每日一库之fastflow golang每日一库
go-workflow 是一个基于 Go 语言开发的超轻量级工作流引擎,设计灵感来源于 Java 的 Activiti,但进行了深度简化和解耦,特别适用于微服务架构下的流程控制需求。 特点 微服务架构友好:go-workflow 仅关注流程流转逻辑,完全解耦用户、组织等业务数据,便于与各类系统集成。 JSON 流程定义:采用 JSON 数组替代传统的 BPMN 模型,简化流程配置,灵感来源于钉钉 OA 系统。 轻量高效:相比 Activiti 更加精简,部署简单,运行效率高,适合中小型企业或对流程控制有定制需求的场景。 前后端分离:提供独立的前端流程设计器 go-workflow-UI,支持可视化流程配置。 表结构 go-workflow 使用多张表来管理流程定义、实例、任务等核心数据: procdef:流程定义表,存储流程名称、版本、JSON 配置等信息。 proc_inst:流程实例表,记录每次流程启动的实例信息,如当前节点、审批人等。 execution:执行流表,保存流程的执行路径,确保流程按预定顺序流转。 task:任务表,记录每个节点的任务详情,包括审批人、审批状态等。 i.... 有更新! golang每日一库之go-workflow golang每日一库
VictoriaMetrics/fastcache 是由 VictoriaMetrics 开发的一个高性能、线程安全的内存缓存库,旨在作为 Go 语言标准库 map 的高效替代方案,用于缓存键值对(key-value pairs)。 它在性能、并发处理能力和内存利用率方面表现优异,尤其适用于对性能要求较高的应用场景,如监控系统、代理服务、数据库中间件等。 它的缺点像它的优点一样明显。 它比 BigCache快! 先说优点 高性能、低延迟 使用内存池和分段锁,最大程度减少 GC 压力。 单个缓存实例可以并发处理多个读写操作。 内存管理高效 自动淘汰(eviction)策略:当缓存容量达到上限时,会自动丢弃旧的数据。 使用预分配大内存块的方式来减少碎片。 线程安全 适用于高并发场景。 轻量级 API 简洁,易于集成和使用。 再说缺点 fastcache 并不是持久化缓存。如果你需要跨进程/重启持久化数据,考虑其他方案(如 Redis、BoltDB)。如果你一定要持久化,其实么也可以。 不是 LRU/TTL 缓存,它只在空间用尽时自动清理旧数据。 不适合需要缓存超大 value(默认限制 6.... 有更新! golang每日一库之VictoriaMetrics/fastcache golang每日一库
go-redislock 是一个由 jefferyjob 开发的 Go 语言库,用于在分布式环境中实现基于 Redis 的高性能分布式锁。它提供了可靠的并发控制机制,确保多个节点在访问共享资源时的数据一致性和资源互斥。 核心特性 高性能:利用 Redis 的内存存储特性,实现快速的锁获取与释放。 超时机制:支持设置锁的过期时间,防止死锁。 可重入性:允许同一线程多次获取同一把锁。 自动续期:在长时间任务执行期间,自动延长锁的有效期。 手动续期:提供手动延长锁有效期的方法,满足特定需求。 灵活的锁释放方式:支持手动释放锁,确保资源的及时释放。 安装 使用以下命令安装 go-redislock: go get -u github.com/jefferyjob/go-redislock 示例 package main import ( "context" "fmt" redislock "github.com/jefferyjob/go-redislock" "github.com/redis/go-redis/v9" ) func main() { // 创建 Redis 客户端 red.... 有更新! golang每日一库之jefferyjob/go-redislock golang每日一库
bsm/redislock 是一个用于 在 Go 语言中实现基于 Redis 的分布式锁(distributed lock) 的开源库,由 bsm 组织开发和维护。 它实现了基于 Redis 的 SET NX PX 命令模式的分布式锁,兼容 Redlock 算法的核心思想,但更简单和轻量。 简介 基于 Redis 单实例实现分布式锁 遵循 Redis 官方推荐的 SET resource-name value NX PX max-lock-time 模式 简洁、高性能、线程安全 支持锁自动过期 支持锁续约(可选) 没有依赖复杂的 Redlock 多主节点算法,更适合大多数实际应用 安装方法 go get github.com/bsm/redislock 示例 import ( "context" "fmt" "log" "time" "github.com/bsm/redislock" "github.com/redis/go-redis/v9" ) func main() { // Connect to redis. client := redis.NewClient(&r.... 有更新! golang每日一库之bsm/redislock golang每日一库
redsync 是一个用 Go 编写的分布式互斥锁(Distributed Mutex)库,基于 Redis 实现。其主要目标是在分布式系统中为多个进程或服务之间提供互斥访问的机制,确保同一时间内只有一个客户端可以访问共享资源。 GitHub 项目地址:👉 https://github.com/go-redsync/redsync 核心功能 redsync 实现了 Redlock 算法(由 Redis 创始人 antirez 提出),该算法旨在在分布式环境中实现安全、健壮的锁。 基本原理 使用多个独立的 Redis 实例。 客户端尝试依次在多数 Redis 节点上设置一个带过期时间的锁。 如果大多数实例成功设置锁,并且总耗时小于锁的过期时间,则认为加锁成功。 释放锁时,会逐个删除这些实例上的锁。 安装 go get github.com/go-redsync/redsync/v4 示例 package main import ( "github.com/go-redsync/redsync/v4" "github.com/go-redsync/redsync/v4/redis/go.... golang每日一库之redsync golang每日一库
RussellLuo/slidingwindow 是一个用 Go 语言实现的滑动窗口速率限制器,灵感来源于 Kong API 网关的限流算法。该库支持本地和分布式限流,适用于需要精确控制请求速率的场景。 设计理念 该库通过维护两个窗口(当前窗口和前一个窗口)的请求计数,估算当前时间点的请求速率,从而实现滑动窗口限流。 例如,设定每分钟最多允许 100 次请求: 当前时间为第 75 秒,即当前窗口开始于第 60 秒。 当前窗口内记录了 12 次请求。 前一个窗口(第 0 秒到第 60 秒)内记录了 86 次请求。 则当前估算的请求数为: count = 86 * ((60 - 15) / 60) + 12 = 86 * 0.75 + 12 = 76.5 如果 count 超过设定的阈值(例如 100),则拒绝新的请求。 主要组件 1. Limiter Limiter 是速率限制的核心结构,负责判断是否允许新的请求。它通过维护两个窗口的计数来估算当前的请求速率。 主要方法: Allow():判断是否允许一个新的请求。 AllowN(now time.Time, n int64):判断是否.... 有更新! golang每日一库之RussellLuo/slidingwindow golang每日一库
Intern 是一个用于 Go 语言的字符串驻留库。 它的核心思想是在程序中对重复出现的字符串只保留一份副本,从而节省内存并减少垃圾回收压力。在需要频繁处理大量相同字符串的场景下(例如解析 JSON 时大量重复的键名、日志标签、协议头字段等),使用该库可以显著降低内存占用。 需要注意的是,该库仅提供“尽力而为”(best-effort)的驻留机制,即库会尽量重用已有字符串,但驻留的字符串可能会在任何时候被回收和移除。 学习该库之前,你必须明白什么是字符串驻留,为什么需要字符串驻留,什么时候需要字符串驻留,以及实现字符串驻留的常用方法。 项目用途 Intern 库的设计目的就是简化字符串驻留的过程。 通常自己实现字符串驻留需要管理一个全局映射 (map[string]string) 并处理并发访问和生命周期,但这很容易出错。 Intern 包通过简单的 API 隐藏了这些复杂性:只需调用 intern.String(s) 或 intern.Bytes(b) 即可得到驻留后的字符串版本。文档说明该包“所有函数都支持并发调用”并且“驻留的字符串可以随时被移除”。 换言之,用户无需手动加锁或维.... golang每日一库之josharian/intern golang每日一库
do 是 Go 语言中一个轻量级的依赖注入(Dependency Injection, DI)容器,由 samber 开发。 它基于 Go 1.18+ 泛型实现,为 Go 提供了一个类型安全的 DI 方案。 do 库的设计理念是简化服务组件之间的依赖管理,取代手工创建依赖关系的繁琐工作,使不同组件之间松散耦合、更易测试与维护。 与反射型 DI 框架不同,do 在注册和解析依赖时不使用反射,因此性能开销很小。 功能简介 服务注册:使用 do.Provide 系列函数将服务构造函数注册到容器中(默认懒加载,即按需单例创建);也可以使用 ProvideTransient 注册每次调用都新建实例的工厂(瞬时模式);或使用 ProvideValue/ProvideNamedValue 注册已经创建好的实例(急加载)。注册时可指定名称或匿名服务(推荐匿名,由框架自动命名)。 依赖解析:通过 do.Invoke[T](injector) 或 do.MustInvoke[T](injector) 获取指定类型的服务实例。容器会自动根据函数签名的参数解析依赖,并以依赖图的方式按顺序实例化各服务(默认单例.... 有更新! golang每日一库之依赖注入库samber/do golang每日一库
一、库简介 go-cleanhttp 是一个专门为 Golang 开发者设计的工具库,旨在提供一组函数,用以生成配置“干净”的 HTTP 客户端(http.Client)和传输(http.Transport)。在 Golang 中,标准库自带的 http.DefaultClient 和 http.DefaultTransport 往往存在共享状态(如连接池)的隐患,尤其在并发或多库同时使用时可能出现意外的副作用。 而 go-cleanhttp 则致力于消除这些隐患,帮助开发者创建独立且配置合理的 HTTP 请求组件。 二、代码示例 废话不多说,上代码 package main import ( "fmt" "io/ioutil" "net/http" "github.com/hashicorp/go-cleanhttp" // 假设库的引入路径为该路径 ) func main() { // 使用库函数创建一个干净的 HTTP 客户端 client := cleanhttp.DefaultClient() // 发送一个 GET 请求 resp, err := client.Get("h.... 有更新! golang每日一库之go-cleanhttp golang每日一库
gconv 是一个 Go 语言的库,提供了一套高效且灵活的工具来简化不同数据类型之间的转换。 它来自于 gf(GoFrame)框架的一部分,专注于数据转换任务,特别是从 map、JSON、struct、slice、array 等常见数据类型之间进行转换。 这个库的核心优势是它通过类型断言机制使得类型转换变得非常简洁且高效,极大地减少了手动编写冗长代码的需求。 核心功能 1. 类型转换 gconv 提供了多种数据类型转换的支持,包括但不限于: 基本数据类型(如 int、float64、string)之间的转换。 结构体与 map 之间的相互转换。 结构体与 JSON 的相互转换。 切片与数组 之间的转换。 其他自定义类型 与基础类型之间的转换。 package main import ( "fmt" "github.com/gogf/gf/v2/util/gconv" ) func main() { i := 123 fmt.Printf("%10s %v\n", "Int:", gconv.Int(i)) fmt.Printf("%10s %v\n", "Int8:", gconv.I.... 有更新! golang每日一库之gconv golang每日一库
一、简介 safetext 是 Google 开源的安全增强型 Go 语言模板处理库,旨在防范 YAML 注入和 Shell 命令注入攻击。它直接替代 Go 标准库的 text/template,通过严格的输入验证机制,阻断攻击者通过模板参数发起的恶意注入行为。 二、防范漏洞 YAML 注入攻击当模板参数由攻击者控制时,若使用标准库的 text/template 处理 YAML 模板,攻击者可能通过换行符等特殊字符篡改文档结构(如覆盖敏感字段)。例如: sensitive: data innocent: "{{ .input}}" # 攻击者输入可注入换行符破坏结构 safetext 会在检测到此类注入时立即返回 YAML Injection Detected 错误,阻止恶意操作。 Shell 命令注入 在拼接 Shell 命令时,传统方法(如 fmt.Sprintf)存在参数逃逸风险。例如: result := fmt.Sprintf("git commit -m %s", message) // 若 message 含 `rm -rf /` 等命令 使用 safetext 提供.... 有更新! golang每日一库之safetext golang每日一库
作为一个 HTML 解析库,PuerkitoBio/goquery 凭借类 jQuery 的语法设计,改变了开发者处理网页数据的姿势。本文将剖析其核心特性,并通过 实用案例展示该库的用法。 一、架构解析 1.1 底层技术栈 • 基于 net/html 标准库实现 DOM 解析 • 集成 cascadia CSS 选择器引擎(支持 CSS3 选择器) • 内存友好型设计,单节点内存消耗仅 0.5KB 1.2 性能 操作类型GoQuery正则解析BeautifulSoup 解析 1MB HTML12ms45ms210ms 10k 次选择器0.8s3.2s5.6s 内存占用峰值35MB120MB280MB 二、环境配置与基础用法 2.1 安装命令 go get github.com/PuerkitoBio/goquery 2.2 文档加载方式 // 从网络加载 doc, err := goquery.NewDocumentFromReader(res.Body) // 从字符串加载 html := `<html><body>Hello</body><.... 有更新! golang每日一库之goquery golang每日一库
当我们需要进行代码更新、配置热加载或证书轮换时,如何在不中断现有连接的前提下完成服务重启? 今天我们介绍一个优雅的零停机重启库endless,仓库地址 github.com/fvbock/endless。 一、关于重启 1.1 传统重启的痛点 • 连接强制中断:标准 net/http服务器重启时会立即关闭监听套接字 • 请求丢失风险:处理中的请求可能被强制终止 • 服务发现延迟:负载均衡器的健康检查可能产生服务空窗期 1.2 endless的解决方案 • 平滑套接字交接:通过 SO_REUSEPORT实现端口复用 • 双进程协作:新旧进程并行运行直至旧连接完成 • 信号驱动:支持SIGHUP等信号触发安全重启 二、技术实现 2.1 架构设计 [旧进程] │ 接收SIGHUP信号───┤ ├─► 创建新进程(继承文件描述符) │ [新旧进程共存期]──┬─► 新连接路由到新进程 └─► 旧进程处理存量请求 2.2 关键代码 func (e *endlessServer) Serve() error { // 设置套接字复用参数 syscall.SetsockoptInt(e.List.... golang每日一库之endless golang每日一库
在大数据时代,网络爬虫已成为采集、分析数据的重要工具。作为 Golang 领域中最流行、最优雅的爬虫框架之一,Colly 不仅拥有简洁直观的 API,还具备强大的性能和灵活的扩展能力。本文将带你深入了解 Colly,从基本安装到进阶用法,再到分布式爬取和代理切换,帮助你快速上手并构建属于自己的爬虫项目。 一、简介 Colly 是由 gocolly/colly 提供的 Golang 爬虫框架。它的设计理念是“快速、优雅、灵活”,能够帮助开发者高效地实现网页抓取、数据提取以及分布式爬虫等任务。无论你是需要抓取简单页面的数据,还是构建一个复杂的异步爬虫,Colly 都能满足你的需求。 主要特点: 简洁的 API 设计:通过链式调用和事件回调,开发者可以轻松编写爬虫逻辑。 高并发支持:内置并发控制和限速功能,轻松应对高流量爬取。 自动处理 Cookie 和 Session:无需额外配置,Colly 会自动管理请求过程中的 Cookie。 灵活的扩展机制:支持代理切换、分布式爬取、数据缓存等高级功能。 支持 HTML/ XML 解析:内置 goquery,方便使用 CSS 选择器或 XPath .... 有更新! golang每日一库之Colly golang每日一库
以下是一篇关于 guonaihong/gout 的技术博客,结合其核心特性、使用场景及技术实现细节进行详细介绍: 一、Gout 简介 Gout 是由开发者 guonaihong 基于 Go 语言实现的高效、易用的 HTTP 客户端库。 其设计理念是通过链式调用和反射机制,简化 HTTP 请求的构建与响应处理。代码非常优雅。 Gout 不仅支持多种数据格式(如 JSON、XML、Protobuf 等),还内置了性能测试、重试机制、中间件扩展等高级功能,适用于 API 调用、微服务通信、数据爬取等场景。源码值得一品。 二、核心特性与实现解析 1. 链式调用与请求构建 Gout 通过链式调用语法实现请求参数的灵活设置。例如,设置 URL Query、Header 和 Body 仅需一行代码: gout.POST("http://example.com"). SetQuery(gout.H{"page": 1}). SetHeader(gout.H{"X-Token": "abc"}). SetJSON(gout.H{"name": "gout"}). Debug(true). // 开启调试.... 有更新! golang每日一库之gout golang每日一库
今天介绍一个可以跟fasthttp比肩的http库imroc/req 一、简介 imroc/req 是一个用于 Golang 的 HTTP 请求客户端库,其设计理念类似于 Python 的 Requests 库。该库提供了简单、直观的 API,使得开发者能够快速构造并发送 HTTP 请求,同时方便地处理响应数据。它适用于处理各种常见的 HTTP 请求场景,包括 GET、POST、PUT、DELETE 等,同时支持 JSON、表单数据、文件上传等多种内容类型。 二、特点 简单易用的 API 通过链式调用和简化的函数接口,极大地降低了发送 HTTP 请求的门槛,代码更加清晰易读。 丰富的数据处理能力 内置对 JSON 数据的自动编码与解码支持,能够快速将响应数据绑定到结构体或 Map 中,方便后续处理。 多种请求方式支持 支持 GET、POST、PUT、DELETE、PATCH 等常见的 HTTP 方法,可以轻松应对各类接口请求。 灵活的请求配置 可以通过设置 Header、Query 参数、Cookies 等自定义 HTTP 请求,同时支持超时、代理、重试等高级配置。 文件上传和多部分表.... golang每日一库之req golang每日一库
今天简单介绍一个消息队列库 nsqio/go-nsq 一、概述 NSQ 是一个实时分布式消息平台,旨在处理大规模、分布式系统中的消息流转。它采用去中心化的设计,并且具备高可用性和容错能力。 而 go-nsq 则是 NSQ 官方提供的 Golang 客户端库,用于实现消息的生产(Producer)与消费(Consumer)。它封装了网络连接、重试、心跳检测等底层细节,使得开发者能够专注于业务逻辑的实现。 二、主要特性 简洁易用的 API 提供了简单的接口用于发布消息和消费消息,无论是生产者还是消费者,都可以快速上手。 高性能与可扩展性 适用于处理高吞吐量的实时数据流,并且可以通过 nsqlookupd 实现节点动态发现,支持大规模分布式集群。 灵活的错误处理与重试机制 内置对消息重试、延迟投递等机制,确保在网络故障或节点异常时消息依然可靠传递。 支持 TLS 与高级配置 可以配置 TLS 加密,满足对安全通信有要求的场景,同时支持各种连接和消息处理参数的自定义配置。 与 nsqlookupd 集成 除了直接连接 NSQD 节点,go-nsq 还可以通过 nsqlookupd 动态获取可用.... golang每日一库之go-nsq golang每日一库
我今天要介绍的gmail库是一个简单易用的 Golang 邮件发送库 支持 SMTP 发送、附件、HTML 邮件、TLS 加密等功能。适用于发送通知、验证码、报告等邮件。 安装 go get gopkg.in/gomail.v2 基本用法 1. 发送简单邮件 package main import ( "gopkg.in/gomail.v2" ) func main() { m := gomail.NewMessage() m.SetHeader("From", "your-email@example.com") // 发件人 m.SetHeader("To", "recipient@example.com") // 收件人 m.SetHeader("Subject", "Hello from Go") // 主题 m.SetBody("text/plain", "This is a test email!") // 邮件正文(纯文本) d := gomail.NewDialer("smtp.example.com", 587, "your-email@example.com", ".... 有更新! golang每日一库之gomail.v2 golang每日一库