switch go

Go每日一库之139:cmux (连接多路复用)

如果一个应用需要同时对外提供 HTTP 和 gRPC 服务,通常情况下我们会为两个服务绑定不同的监听端口,而本文要介绍的 cmux 为我们提供了一种连接多路复用的新选择,使用 cmux 可以将不同服务绑定在同一个网络端口上! # 简介 多路复用是个很常见的概念,我们在编写 HTTP 服务时通常会用 ......
cmux 139

Go每日一库之134:fsm(基有限状态机库)

开发中,我们经常会遇到这种情况,服务模块有多种状态,它们有一定的顺序,先后执行,逐步切换。这时,fsm这个库可以帮助我们更好的管理多个状态。 fsm库,它主要基于两个FSM实现,增加了golang版本的实现: - Javascript Finite State Machine, [https://g ......
机库 状态 有限 134 fsm

Go每日一库之138:dive(Docker 镜像分析)

## 什么是 dive? 用于探索 Docker 镜像、每一层中的内容以及发现缩小 Docker/OCI 镜像大小的方法的工具。 ## 安装 dive `go get github.com/wagoodman/dive` ## dive 特性 - 按层分解 Docker 镜像 - 可视化展示每一层变 ......
镜像 Docker dive 138

Go每日一库之129:promu(Prometheus构建发布工具)

众所周知,Go语言中打包命令是 go build。在项目中,你可以单独使用 go build 命令对项目进行编译打包,也可以根据自己的需要,在该命令后加各种参数。prometheus官方为了统一项目(包括 prometheus、alertmanager和各种官方的 exporter)的编译和打包,开 ......
Prometheus 工具 promu 129

Go每日一库之145:MinIO(高性能对象存储)

1. MinIO 简介 MinIO 是一个基于 Go 实现的高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议,项目地址是 https://github.com/minio/minio,官网是 https://min.io。 它适合存储海量的非结构化的数据,例如说图片、音频 ......
高性能 对象 MinIO 145

Go每日一库之131:caddy(轻量web服务器)

一直以来,我都是使用 Nginx 作为 Web 服务器,但是配置可以说是非常麻烦了。每次我要新开一个域名,都要先使用 [acme.sh](https://github.com/Neilpang/acme.sh) 签发 SSL 证书,然后再写配置,大概要花上 5 分钟的时间。曾经想过写个脚本自动完成这 ......
轻量 服务器 caddy 131 web

Go每日一库之140:Zinc(轻量级搜索引擎)

# ‍项目介绍 [Zinc](https://github.com/zinclabs/zinc) 是一个轻量级替代 Elasticsearch 的开源搜索引擎。 Elasticsearch 真的好用,但是 Elasticsearch 安装和配置也是真的繁琐,后续的一些维护也有一定成本。另外一个 El ......
轻量 轻量级 搜索引擎 引擎 Zinc

Go每日一库之143:servicegroup(进程内优雅管理多个服务)

## 前言 在 go-zero 社区里,经常会有同学问,把 `API gateway` 和 `RPC service` 放在同一个进程内可不可以?怎么弄?有时也会有同学把对外服务和消费队列放在一个进程内。咱们姑且不说此种用法合理与否,因为各个公司的业务场景和开发模式的差异,我们就只来看看此类问题怎么 ......
servicegroup 进程 多个 143

Go每日一库之135:Ent(Facebook 开源 Golang 实体框架)

> 对于**后端开发者**来说,一款好用的框架能够大大提升应用的开发效率。为了降低开发者使用 TiDB 的门槛,**方便开发者快速连接到 TiDB**,我们也在和合作伙伴一起,逐步完善**面向主流开发语言和框架的连接支持**。 ![每日一库之135:Ent(Facebook%20开源%20Golan ......
实体 框架 Facebook Golang 135

Go每日一库之128:podinfo(k8s微服务模板)

## 项目介绍 官方 Github: [Podinfo](https://github.com/stefanprodan/podinfo) Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践。 它已实现的技术指标(截选自官方 [RE ......
模板 podinfo 128 k8s k8

Go每日一库之133:lo(基于泛型的 Golang lodash 库)

近日,Go 核心开发团队终于宣布了 Go 1.18 正式版本的发布!这是一个大家期待很久的版本!Go 1.18 包含大量新功能:模糊测试、性能改进、工作区等,以及 Go 语言开源以来最大的一次语法特性变更 —— 支持泛型! 支持泛型后,我们便不再需要写如下冗余的代码: ![每日一库之133:lo(基 ......
Golang lodash 133

Go每日一库之109:go-stash

[go-stash](https://github.com/kevwan/go-stash)是一个高效的从Kafka获取,根据配置的规则进行处理,然后发送到ElasticSearch集群的工具。 go-stash有大概logstash 5倍的吞吐性能,并且部署简单,一个可执行文件即可。 > go-s ......
go-stash stash 109 go

Go每日一库之113:retry-go

在微服务架构中,通常会有很多的小服务,小服务之间存在大量 RPC 调用,但时常因为网络抖动等原因,造成请求失败,这时候使用重试机制可以提高请求的最终成功率,减少故障影响,让系统运行更稳定。[retry-go](https://github.com/avast/retry-go) 是一个功能比较完善的 ......
retry-go retry 113 go

Go每日一库之114:go-fuzz

## 推荐 go-fuzz 的背景 我们在日常开发中经常会编写测试和对应的测试用例,大家是否常常会有以下疑惑: - 现有的测试用例是否完全覆盖了各种边界场景?会不会有意料之外的 case? - 代码测试覆盖率都达到 100% 了,代码上线时为啥还会战战兢兢? - 写测试用例太费心费力了,有没有一款能 ......
go-fuzz fuzz 114 go

Go每日一库之115:go-diff

## 简介 纯文本差异对比在许多场景下都有应用,如语音识别技术对识别率的评估,需要将识别后的文本与预期文本之间做差异对比计算;又如我们使用 Git 进行代码提交时,通常会使用git diff来查看这次编辑发生了哪些改动。 这里我们先简单定义一下差异 diff:是指目标文本和源文本之间的区别,也就是将 ......
go-diff diff 115 go

Go每日一库之96:phantomjs

## 1. 什么是Phantomjs [PhantomJS](https://phantomjs.org/)是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何您可以在基于webkit浏览器做 ......
phantomjs

Go每日一库之97:chromedp

## chromedp是什么? [chromedp](https://github.com/chromedp/chromedp)是一个更快、更简单的Golang库用于调用支持Chrome DevTools协议的浏览器,同时不需要额外的依赖(例如Selenium和PhantomJS) > Chrome ......
chromedp

Go每日一库之108:elastic

[elastic](https://github.com/olivere/elastic)是go语言中与ElasticSearch交互使用最多的一个库。 首先要根据ElasticSearch版本选择对应的库: | **Elasticsearch version** | **Elastic versi ......
elastic 108

Go每日一库之112:asynq

# 什么是Asynq [Asynq](https://github.com/hibiken/asynq)是一个go语言实现的分布式任务队列和异步处理库,基于redis,类似sidekiq和celery,他具有以下特点: - 保证至少执行一次任务 - 持久化 - 失败重试 - worker崩溃自动恢复 ......
asynq 112

Go每日一库之118:netlink(内核通信)

# 什么是netlink? netlink 是 Linux 系统里用户态程序、内核模块之间的一种 IPC 方式,特别是用户态程序和内核模块之间的 IPC 通信。比如在 Linux 终端里常用的 ip 命令,就是使用 netlink 去跟内核进行通信的。例如想在golang代码中实现ip link a ......
内核 netlink 118

Go每日一库之125:ast(抽象语法树)

## 写在前面 当你对GoLang AST感兴趣时,你会参考什么?文档还是源代码? 虽然阅读文档可以帮助你抽象地理解它,但你无法看到API之间的关系等等。 如果是阅读整个源代码,你会完全看懂,但你想看完整个代码我觉得您应该会很累。 因此,本着高效学习的原则,我写了此文,希望对您能有所帮助。 让我们轻 ......
语法 125 ast

Go每日一库之117:gopacket(网络数据抓包)

## gopacket是什么? gopacket是google出品的golang三方库,质量还是靠的住,项目地址为:[github.com/google/gopacket](https://github.com/google/gopacket) gopacket到底是什么呢?是个抓取网络数据包的库, ......
gopacket 数据 网络 117

Go每日一库之119:goleak(goroutine 泄漏检测)

# 背景 goroutine 作为 golang 并发实现的核心组成部分,非常容易上手使用,但却很难驾驭得好。我们经常会遭遇各种形式的 goroutine 泄漏,这些泄漏的 goroutine 会一直存活直到进程终结。它们的占用的栈内存一直无法释放、关联的堆内存也不能被 GC 清理,系统的可用内存会 ......
goroutine goleak 119

Go每日一库之121:moby(操作docker容器)

在日常开发中,测试是不可避免的,在针对DAO层的代码写测试用例的时候,直接将依赖的存储服务(比如mongodb)的client给mock掉,可能达不到检验代码中语法或数据操作正确性的目的。如果在本地起一个相关的存储服务又会由于不同的项目带来环境的污染,并且测试代码由于依赖本地环境可能导致多人协作困难 ......
容器 docker moby 121

Go每日一库之120:image(标准库图形处理)

在开发中,有时会遇到对图片的处理需求,在 Python中, PIL/Pillow 库非常强大和易用。 而 Golang 语言中,处理图片的标准库 image也可以实现一些基本操作。 image 库支持常见的 PNG、JPEG、GIF 等格式的图片处理, 可以对图片进行读取、裁剪、绘制、生成等操作。 ......
图形处理 图形 标准 image 120

Go每日一库之122:gofumpt(增强代码格式化)

# 前言 gofmt 是 golang 自带的代码自动格式化工具,是保证 Go 代码风格一致的大杀器。我们这次要推荐的 **gofumpt 在 gofmt 的基础上添加了一系列更加严格的格式化规则,并保证了对 gofmt 的兼容**。 gofumpt 有助于进一步提升代码质量,它已经成为 gopls ......
gofumpt 代码 格式 122

Go每日一库之110:protoc-gen-doc

## 前言 毫无疑问,目前后台开发接口协议应用最广泛的除了HTTP之外就是gRPC了,HTTP接口有成熟的swagger工具可以生成界面美观和使用友好的文档,那么对于gRPC呢? 所以通过 .proto 文件能否生成更易阅读的 HTML 接口文档? ## protoc-gen-doc [**prot ......
protoc-gen-doc protoc 110 gen doc

Go每日一库之121:timer(时间轮算法定时器)

当业务要处理大量的定时任务时,如果每个任务都创建一个Golang原生的timer的话,会占用较多的cpu资源,这类场景,可以用时间轮算法优化timer的资源消耗。本次介绍一款多级时间轮库antlabs/timer(以下timer特指antlabs/timer库),处理类似场景的优化。 ## **功能 ......
定时器 算法 时间 timer 121

Go每日一库之123:pgzip(高性能gzip压缩)

## 背景 gzip是当前应用非常广泛的文件压缩格式,golang 中也有内置的compress/gzip对其提供原生支持。今天我们要介绍的pgzip是一款完全兼容 gzip 的插件,并能提供相较于compress/gzip上百倍的性能提升! ## **pgzip 简介** pgzip([https ......
高性能 pgzip gzip 123

Go每日一库之126:h2c(明文https)

# 背景 `net/http`包默认支持`http2`的,而`HTTP/2`强制使用`TLS`的,所以在使用的时候必须指定证书,正好最近玩过,在这写一下: 原本实现一个http服务的代码: ```go http.HandleFunc("/", func(w http.ResponseWriter, ......
明文 https 126 h2c h2