这可能是最容易理解的 Go Mutex 源码剖析

Hi,大家好,我是 haohongfan。 上一篇文章《一文完全掌握 Go math/rand》,我们知道 math/rand 的 global rand 有一个全局锁,我的文章里面有一句话:“修复方案: 就是把 rrRand 换成了 globalRand, 在线上高并发场景下, 发现全局锁影响并不 ... »

最清晰易懂的 Go WaitGroup 源码剖析

hi,大家好,我是haohongfan。 本篇主要介绍 WaitGroup 的一些特性,让我们从本质上去了解 WaitGroup。关于 WaitGroup 的基本用法这里就不做过多介绍了。相对于《这可能是最容易理解的 Go Mutex 源码剖析》来说,WaitGroup 就简单的太多了。 源码剖析 ... »

看过这篇剖析,你还不懂 Go sync.Map 吗?

hi, 大家好,我是 haohongfan。 本篇文章会从使用方式和原码角度剖析 sync.Map。不过不管是日常开发还是开源项目中,好像 sync.Map 并没有得到很好的利用,大家还是习惯使用 Mutex + Map 来使用。 下面这段代码,看起来很有道理,其实是用错了(背景:并发场景中获取注册 ... »

Go Protobuf(比xml小3-10倍, 快20-100倍)

简介 Protocol Buffers是什么? protocol buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小、更快、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更 ... »

答应我,别在go项目中用init()了

前言 go的 init函数给人的感觉怪怪的,我想不明白聪明的 google团队为何要设计出这么一个“鸡肋“的机制。实际编码中,我主张尽量不要使用init函数。 首先来看看 init函数的作用吧。 init() 介绍 init()与包的初始化顺序息息相关,所以先介绍一个go中包的初始化顺序吧。(下面的 ... »

RabbitMQ 入门 (Go) - 6. 数据持久化(上)

从本节开始,我介绍一下如何将相关数据持久化到数据库,也就是上图中蓝色的部分。 目前的问题 我先运行 6 个传感器和2 个协调器,这里我使用了批处理文件: 运行后,看一下 RabbitMQ 的管理控制台: 注意上面前面几个 Queue,这些 Queue 就是我们让传感器和协调器监听那两个 Fanout ... »

一文教你搞懂 Go 中栈操作

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/513 本文使用的go的源码15.7 知识点 LInux 进程在内存布局 多任务操作系统中的每个进程都在自己的内存沙盒中运行。在32位模式下,它总是4GB内存地址空间,内 ... »

RabbitMQ 入门 (Go) - 5. 使用 Fanout Exchange 做服务发现(下)

到目前为止,我一直专注于如何让消息进出消息代理,也就是RabbitMQ。 实际上,我们可以继续使用 RabbitMQ 和它的 Exchanges 来连接这个应用程序的其他部分,但是我想探索一个稍微不同的模型:我想使用协调器来跟踪哪些类型的消费者得到消息通知。 这样的话,我断开了传感器数据生成器和数据 ... »

RabbitMQ 入门 (Go) - 4. 使用 Fanout Exchange 做服务发现(上)

到目前为止,我们项目的结果大致如下: 传感器生成的模拟数据(包含传感器名称、数据、时间戳)是通过传感器在运行时动态创建的 Queue 来发送的。这些 Queue 很难直接被发现。 为了解决这个问题,我创建了另一个消息,它包含各传感器的 Queue 的路由 key,这个消息是在一个“众所周知”的 Qu ... »

golang 性能优化分析:benchmark 结合 pprof

前面 2 篇 golang 性能优化分析系列文章: golang 性能优化分析工具 pprof (上) golang 性能优化分析工具 pprof (下) 一、基准测试 benchmark 简介 在 golang 中,可以通过 benchmark 基准测试来测试代码性能。基准测试主要是通过测试 cp ... »

golang 性能调优分析工具 pprof(下)

golang 性能调优分析工具 pprof(上)篇, 这是下篇。 四、net/http/pprof 4.1 代码例子 1 go version go1.13.9 把上面的程序例子稍微改动下,命名为 demohttp.go: package main import ( "bytes" "fmt" "i ... »

golang 性能调优分析工具 pprof (上)

一、golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占比,内存泄露等。如果在往里分,程序堆、栈使用情况 I/O:IO的使用情况 - 哪个程序IO占用时间比 ... »

从源码剖析Go语言基于信号抢占式调度

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/485 本文使用的go的源码15.7 这一次来讲讲基于信号式抢占式调度。 介绍 在 Go 的 1.14 版本之前抢占试调度都是基于协作的,需要自己主动的让出执行,但是这样 ... »

RabbitMQ 入门 (Go) - 1. 简介和安装

Message Broker(消息代理) 维基百科对 Message Broker 的定义是:Message broker 是一种中介程序模块,它把消息从发送方的正式消息传递协议转化为接收方的正式消息传递协议。 这个定义略繁琐,下面看看 RabbitMQ 官网对 Message broker 的定义 ... »

Go语言中使用K8s API及一些常用API整理

Go Client 在进入代码之前,理解k8s的go client项目是对我们又帮助的。它是k8s client中最古老的一个,因此具有很多特性。 Client-go 没有使用Swagger生成器,就像前面我们介绍的openAPI一样。它使用的是源于k8s项目中的源代码生成工具,这个工具的目的是要生 ... »

Docker SDK api操作Docker

下载包 go get "github.com/docker/docker/api/types" go get "github.com/docker/docker/client" 创建Container 其主要复杂在端口的映射上面。如果hostConfig里面的PortBindings对应的PortM ... »

微服务复杂查询之缓存策略

大型业务系统中,通过对持久层添加缓存,对大多数单行记录查询,缓存能够帮持久层减轻很大的访问压力,但数据读取不仅仅只是单行记录,面对大量多行记录的查询,这对持久层也会造成不小的访问压力,本文介绍 go-zero 缓存设计之biz cache。 ... »

从零开始编写一个BitTorrent下载器

从零开始编写一个BitTorrent下载器 BT协议 简介 BT协议Bit Torrent(BT)是一种通信协议,又是一种应用程序,广泛用于对等网络通信(P2P)。曾经风靡一时,由于它引起了巨大的流量,对因特网的运营、维护和管理都产生了重要的影响。 BT协议的典型特征就是没有中心服务器。BT协议中, ... »