原文链接: go-zero 的自适应熔断器 上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断。 熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会处理,但熔断不是。 在一条调用链上,如果发现某个服务异常,比如响应超时。那么调用者为了避免过多请求导致资源消耗过大,最终引发系统雪崩,会直接返回错误,而不是疯狂调用这个服务。 本篇文章会介绍主流熔断器
原文链接: Go 语言中排序的 3 种方法 在写代码过程中,排序是经常会遇到的需求,本文会介绍三种常用的方法。 废话不多说,下面正文开始。 使用标准库 根据场景直接使用标准库中的方法,比如: sort.Ints sort.Float64s sort.Strings 举个例子: s := []int{4, 2, 3, 1} sort.Ints(s) fmt.Println(s) // [1 2
原文链接: go-zero 是如何实现令牌桶限流的? 上一篇文章介绍了 如何实现计数器限流?主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了 go-zero 采用固定窗口方式实现的源码。 但是采用固定窗口实现的限流器会有两个问题: 会出现请求量超出限制值两倍的情况 无法很好处理流量突增问题 这篇文章来介绍一下令牌桶算法,可以很好解决以上两个问题。 工作原理 算法概念如下: 令牌以固定
原文链接: 如何实现计数器限流? 上一篇文章 go-zero 是如何做路由管理的? 介绍了路由管理,这篇文章来说说限流,主要介绍计数器限流算法,具体的代码实现,我们还是来分析微服务框架 go-zero 的源码。 在微服务架构中,一个服务可能需要频繁地与其他服务交互,而过多的请求可能导致性能下降或系统崩溃。为了确保系统的稳定性和高可用性,限流算法应运而生。 限流算法允许在给定时间段内,对服务的请求流
原文链接: go-zero 是如何做路由管理的? go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分。 而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的,具体采用了哪种技术方案。 路由管理方案 路由管理方案有很多种,具体应该如何选择,应该根据使用场景,以及实现的难易程度做综合分析,下面介绍常见的三种方案。 注意这里
原文链接: 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。 它有很多变种,比如红黑树,常被用作 std::map 和 std::set 的底层实现;B 树和 B+ 树,广泛应用于数据库系统中。 本文要介绍的二叉搜索树用的也很多,比如在开源项目 go-zero 中,就被用来做路由管理。 这篇文章也算是一篇前导文章,介绍一些必备知识,下一篇再
原文链接: Go 语言 select 都能做什么? 在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作。 通过 select 语句,我们可以同时监听多个 channel,并在其中任意一个 channel 就绪时进行相应的处理。 本文将总结一下 select 语句的常见用法,以及在使用过程中的注意事项。 基本语法 select 语句的基本语法如下: sele
原文链接: Go 语言 context 都能做什么? 很多 Go 项目的源码,在读的过程中会发现一个很常见的参数 ctx,而且基本都是作为函数的第一个参数。 为什么要这么写呢?这个参数到底有什么用呢?带着这样的疑问,我研究了这个参数背后的故事。 开局一张图: 核心是 Context 接口: // A Context carries a deadline, cancelation signal,
原文链接: 为什么说 Go 语言字符串是不可变的? 最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: type stringStruct struct { str unsafe.Pointer len int }
原文链接: Go 语言 map 如何顺序读取? Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 现象 先看一段代码示例: package main import "fmt" func main() { m := map[string]int{
原文链接: Go 语言 map 是并发安全的吗? Go 语言中的 map 是一个非常常用的数据结构,它允许我们快速地存储和检索键值对。然而,在并发场景下使用 map 时,还是有一些问题需要注意的。 本文将探讨 Go 语言中的 map 是否是并发安全的,并提供三种方案来解决并发问题。 先来回答一下题目的问题,答案就是并发不安全。 看一段代码示例,当两个 goroutine 同时对同一个 map 进行
原文链接: 为什么 Go for-range 的 value 值地址每次都一样? 循环语句是一种常用的控制结构,在 Go 语言中,除了 for 关键字以外,还有一个 range 关键字,可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。 但是在使用 for-range 循环迭代数组和切片的时候,是很容易出错的,甚至很多老司机一不小心都会在这里翻车
原文链接: Go 语言切片是如何扩容的? 在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: type slice struct { array unsafe.Pointer len
原文链接: Go 语言数组和切片的区别 在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 另外,这个问题在面试中也经常会被问到,属于入门级题目,看过文章之后,相信你会有一个很好的答案。 数组 数组是同一种数据类型元素的集合,数组在定义时需要指定长度和元素类型。 例如:[4]int 表示一个包含四个整数的数组,数组的大小是固定的。并且长度是
原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是 new 和 make 这两个内置函数的区别。 其实这个问题本身并不复杂,简单来说就是,new 只分配内存,而 make 只能用于 slice、map 和 chan 的初始化,下面我们就来详细介绍一下。 new new 是一个内置函数,它会分配一
在Go中,如果interface{}作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。举个例子:gopackagemainimport"fmt"funcfoo(vinterface{}){ifv1,ok1:=v.(string);ok1{fmt.Println(v1)}elseifv2,ok2:=v.(int);ok2{fmt.Println(v2)}}funcmain(){foo(2
原文链接:Python中的鸭子类型和猴子补丁(https://mp.weixin.qq.com/s/3WGFkl9MRbYjojFK7eEww)大家好,我是老王。Python开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已。我最近在面试候选人的时候,也会问这两个概念,很多人答的也并不是很好。但是当我向他们解释完之后,普遍
使用sort()或内建函数sorted()对列表进行排序。它们之间的区别有两点:1.sort()方法是对原列表进行操作,而sorted()方法会返回一个新列表,不是在原来的基础上进行操作。2.sort()是应用在列表上的方法,而sorted()可以对所有可迭代的对象进行排序操作。pythonsort()a=1,2,3,4,2,3a.sort()a1,2,2,3,3,4a=1,2,3,4,2,3a.
在使用Python开发的过程中,避免不了会用到递归函数。但递归函数的返回值有时会出现意想不到的情况。下面来举一个例子:pythondeffun(i):...i+=1...ifi<5:...fun(i)...else:...returni...r=fun(0)print(r)比如上面这段代码,乍一看没什么问题,但返回值并不是我们期望的5,而是None。pythonprint(r)None要解决这个问
提到Python的Web框架,第一反应就是老三样,Django,Flask和Tornado。如果按流行度来排名的话,应该也是这个顺序。在2016年,发布了一款Web框架,叫Sanic,表现还不错,应该算是后起之秀。!(https://cdn.jsdelivr.net/gh/yongxinz/picb@main/data/Web开发.png)Django项目地址:https://github.com
原文链接:Python学习路线(2022)(https://mp.weixin.qq.com/s/CyJ92CD1xnihlpDqj8Yw)前几天整理了一份Go学习路线(2022)(https://mp.weixin.qq.com/s/Dwf98JFUnRij0Ha7o3ZSHQ),广受好评。那么趁火打劫,不是,是趁热打铁,又整理了一份Python学习路线。内容依然是从入门到进阶,既有教程,也有经
!(https://cdn.jsdelivr.net/gh/yongxinz/picb@main/data/Go&32;书籍推荐.png)书单一共包含10本书,分为入门5本,进阶5本。我读过其中7本,另外3本虽然没读过,但也是网上推荐比较多的。虽然分了入门和进阶,但是很多书中这两部分内容是都包含了的。大家看的时候可以根据自己的情况,先打好基础,再进行进阶。有的书是开源的,可以直接在线阅读,有的有电
原文链接:读Go源码,可以试试这个工具(https://mp.weixin.qq.com/s/E2TL_kcbVcRJ0CnxwbXWLw)编程发展至今,从面向过程到面向对象,再到现在的面向框架。写代码变成了一件越来越容易的事情。学习基础语法,看看框架文档,几天时间搞出一个小项目并不是一件很难的事情。但时间长了就会发现,一直这样飘在表面是不行的,技术永远得不到提升。想要技术水平有一个质的飞跃,有一
我整理了一份 Go 开发路线,这份开发路线不以数量取胜,努力做到精简。从基础到进阶,从理论到实战
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号