包含标签 Go源码阅读 的文章

hystrix-go 之流量控制实现

在分析 hystrix-go 主流程中,我们知道只有当获取令牌成功后才能继续往下正常执行用户自定义的闭包函数,否则还是会进行降级处理。 1 cmd.ticket = <-circuit.executorPool.Tickets: // 获取令牌成功 今天我们分析下,hystrix-go 是如何进行流量控制的。 源码分析……

阅读全文

hystrix-go 之统计控制器实现

上一篇 我们分析断路器时有用到 metricExchange,但并未展开详细介绍,本篇我们主要介绍它以及实现原理。 metricExchange 主要是用来收集处理上报的所有事件,并对事件进行汇总处理,最后根据计算出来的一段时间内的错……

阅读全文

hystrix-go 之断路器实现

上一篇我们分析 hystrix-go 主流程时知道,对于每个 command 都有一个对应的断路器,而且在 GoC 中首先要通过 GetCircuit(name) 获取断路器对象,该方法会在断路器不存在时新建一个,并赋值给 cmd.circuit。 回顾下 command 结构体: 1 2 3 4 5 type command struct {……

阅读全文

hystrix-go 之核心流程实现

前言 上一篇文章我们介绍了服务保护熔断器 sentinel-go 如何使用,今天介绍另外一款优秀的集限流、熔断、降级于一身的组件 hystrix-go。hystrix-go 是著名开源库 hystrix 的 Go 语言简化版本,实现了核心功能,源码实现……

阅读全文

juju/ratelimit 令牌桶限流器分析

上一篇 我们介绍了基于漏桶算法的限流器 - uber-go/ratelimit,为了应对突发流量,它做了最大松弛量的改良。本篇文章继续介绍另外一种限流器:令牌桶(Token Bucket)。 什么是令牌桶 漏桶的……

阅读全文

uber-go/ratelimit 漏桶限流器分析

限流器是微服务中不可缺少的组件,起着保护下游服务负载过高、保证服务稳定性的作用。 什么是限流器 Web servers typically use a central in-memory key-value database, like Redis or Aerospike, for session management. A rate limiting algorithm is used to check if the user session (or IP address) has to be limited based on the information in the session cache. In case a client made too many requests within a given……

阅读全文

Go源码阅读 | channel 设计与实现

本文基于 Go1.14 源码阅读 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91……

阅读全文

Go源码阅读 | context.Context设计与实现

本文基于 Go1.14.2 Go 自带的 context 包设计的很巧妙,最近阅读了下源码实现,可谓是短小精悍,很值得投入时间去学习。 什么是 context Go1.7 开始引入的 context 标准库包,主要用来在协程之间传递上下文信息,包括:取消信号、超时控制、截止时间、k……

阅读全文

Go源码阅读 | sync.WaitGroup设计与实现

前言 当我们的程序在运行过程中需要执行多个子任务时,我们可以利用 Go 协程并发地执行这些子任务,然后等待它们执行结束,从而缩短程序串行执行的耗费时间。Go 语言标准库自带了该组件:sync.WaitGroup……

阅读全文

Go源码阅读 | sync.Once设计与实现

介绍 sync.Once 是 Go 官方自带的标准库,实现了 exactly once 的功能。通过使用 sync.Once 我们可以很方便地实现单例模式,确保对象只被初始化一次。 首先看一个 sync.Once 的 Go 官方例子,源码链接在这里: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var once sync.Once onceBody := func() { fmt.Println("Only once") }……

阅读全文