本文转载自微信公众号《捉虫大师》,作者:捉虫大师。转载本文请联系捕虫大师公众号。大家好,我打算写一个Go语言组件源码分析系列,一个是学习Go语言,看看别人怎么写Go,另一个是掌握一个组件。这次我选择了Sentinel-Go。首先,我对Java版的Sentinel有了一些了解,也已经在生产中实现了。第二,感觉他的代码应该不会太复杂(感觉而已)。随着越来越火的趋势,Go实现的限流和降级容错应该更通用。阅读源代码本身很无聊。我尽量用通俗易懂的语言来描述它。希望大家多多支持我的文章。点赞关注关注就是对我最大的支持。Sentinel背景介绍随着微服务的普及,服务与服务之间的稳定性变得越来越重要。Sentinel是分布式服务架构的流量控制组件。主要以流量为切入点,从流量控制、断路器降级、系统自适应保护等多个维度帮助您保障微服务的稳定性。Sentinel是阿里在2018年开源的一个项目,最初是Java版本。截至目前,它拥有17.6k颗星。项目地址为https://github.com/alibaba/Sentinel/。2020年Go版本开源,瞄准朝云原生方向进化,截至目前1.7kstar,项目地址https://github.com/alibaba/sentinel-golang也提到了Sentinel的作用在上面的介绍中,Sentinel是微服务时代保障稳定的法宝。:在电商系统中,用户在浏览商品详情页时,通常会通过RPC调用多个微服务。在查询商品信息的同时,也查询用户信息,展示优惠信息。通常,下拉列表还会显示推荐、广告等信息,如下图,如果流量大的时候CouponService容量不足,或者RecomService因为某些原因不可用,这时候AggrService就会被拖死,导致商品详情服务不可用,但是想想仔细看看这些服务不是那么重要,可以限制Streaming或者直接降级(不再调用),比直接服务要好,要不就是流量太大,ProductService受不了,所以拿是正常的限流措施,保留部分用户的请求,总比这些问题全部不可用要好。Sentinel可以解决Sentinel提供的能力。Sentinel将需要保护的对象(可以是服务,也可以是一段代码)抽象为资源,通过动态下发的规则来控制资源的流向。两个主要功能的发挥方式有很多种,比如限流是针对QPS还是针对并发数,控制的效果是直接拒绝还是排队等等。当然,Sentinel也提供了开箱即用的Dashboard,可以扩展分发规则,展示监控指标,调用关系链等。快速启动源码阅读环境,准备fork源码到自己的仓库,方便添加注释和拉取源码到本地gitclonegit@github.com:lkxiaolou/sentinel-golang.git导入IDE,因为我既要写Java又要写Go,所以用IntelliJ更方便IDEA,安装一个Go插件导入后,一般IDE会自动下载依赖,如果没有自动下载,尝试执行(安装Go就不说了)gomod下载目录结构介绍sentinel-golangapi:externallyexposedinterfacecore:核心实现示例:使用exampleexporter:Prometheus的exporterext:扩展接口,主要是动态规则配置中心扩展接口logging:日志模块pkg:th的实现ird-party插件,比如各个组件对Sentinel的适配,以及Sentinel对接各种第三方配置中心的扩展实现在/example目录下新建mytests目录,并创建一个quick_start.go文件。按照官网给出的例子,先用最简单的默认方式初始化iferr:=sentinel.InitDefault();err!=nil{//Initializationfailedpanic(err.Error())}然后加载规则在一种硬编码方式//资源名称resource:="test-resource"//加载流控规则,硬编码_,err:=flow.LoadRules([]*flow.Rule{{Resource:resource,//Threshold+StatIntervalInMs可以组合起来限制可以通过多少个请求,相当于限制了10qpsThreshold:10,StatIntervalInMs:1000,//暂时不要关注这些参数TokenCalculateStrategy:flow.Direct,ControlBehavior:flow.Reject,},})最后写测试代码//修改一下看看效果currency:=100fori:=0;i
