专栏首页捉虫大师Sentinel-Go 源码系列(一)|开篇
原创

Sentinel-Go 源码系列(一)|开篇

大家好呀,打算写一个 Go 语言组件源码分析系列,一是为了能学习下 Go 语言,看下别人是怎么写 Go 的,二是也掌握一个组件。

本次选择了 Sentinel-Go,一是对 Java 版本的 Sentinel 算是有一些了解,也在生产上落地过,二是感觉他的代码应该不会太复杂(仅仅是感觉),三是在云原生越来越热的趋势下,用 Go 实现的限流降级容错应该是比较通用的。

源码阅读本身是枯燥的,我尽量用容易理解的语言来描述,希望大家也多支持我的文章,点个在看关注就是对我最大的支持。


背景

Sentinel 简介

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

Sentinel 是阿里2018年开源的项目,最初是 Java 版本,截止目前有 17.6k 的star,项目地址为

https://github.com/alibaba/Sentinel/

2020年又开源了 Go 的版本,目的是朝云原生方向演进,截止目前 1.7k star,项目地址为

https://github.com/alibaba/sentinel-golang

Sentinel 的作用

在上面简介中也说了,Sentinel 是微服务时代保障稳定的神兵利器

举个例子:电商系统中用户浏览商品详情页,通常会通过 RPC 调用多个微服务,查询商品信息的同时还会查询用户的信息,也会展示优惠信息,通常下拉列表还会展示推荐,广告等信息,如下图

img1.png

如果流量较大时,CouponService 容量不足,或者某种原因导致 RecomService 不可用,此时 AggrService 会被拖死,导致商品详情服务不可用,但仔细想想这些服务不是那么重要,可以进行限流或者直接降级(不再调用),总比直接服务不用要好吧

又或者流量实在太高,ProductService 也顶不住了,那是否可以采取限流措施,保住部分用户的请求时正常的,也比全部不可用要好

这些问题,Sentinel 都能解决

Sentinel 提供的能力

Sentinel 将要保护的对象(可以是某个服务或一段代码)抽象为资源,通过动态下发的规则,对资源进行

  • 流量控制
  • 熔断降级

针对这两个主要功能又有很多的玩法,比如限流是针对QPS还是并发数,控制的效果是直接拒绝还是排队等等。

当然 Sentinel 也提供一个开箱即用的 Dashboard,可扩展配中心进行下发规则,展示监控指标,调用关系链等等

快速开始

源码阅读环境准备

  • fork 源码到自己仓库,便于增加注释
  • 拉取源码到本地

git clone git@github.com:lkxiaolou/sentinel-golang.git

  • 导入 IDE,由于我既要写 Java 又要写 Go,所以用 IntelliJ IDEA 比较方便,只要装一个 Go plugin 就可以了
  • 导入后,一般 IDE 会自动下载依赖,如果没有自动下载,试试执行( Go 安装就不说了)

go mod download

目录结构介绍

  • sentinel-golang
    • api:对外暴露的接口
    • core:核心实现
    • example:使用例子
    • exporter:Prometheus的exporter
    • ext:扩展接口,主要是动态规则配置中心扩展接口
    • logging:日志模块
    • pkg:第三方插件的实现,比如各个组件适用 Sentinel 的 adapter,以及 Sentinel 对接各种第三方配置中心的扩展实现
    • tests:测试类代码,包括单元测试、benchmark
    • util:工具类

样例跑通

在 /example 目录下新建 mytests 目录,并创建一个 quick_start.go 文件,按照官网给出的例子,先用最简单的默认方式初始化

if err := sentinel.InitDefault(); err != nil {
	// 初始化失败
	panic(err.Error())
}

再用写死的方式加载规则

// 资源名
resource := "test-resource"

// 加载流控规则,写死
_, err := flow.LoadRules([]*flow.Rule{
	{
		Resource: resource,
		// Threshold + StatIntervalInMs 可组合出多长时间限制通过多少请求,这里相当于限制为 10 qps
		Threshold: 10,
		StatIntervalInMs: 1000,
		// 暂时不用关注这些参数
		TokenCalculateStrategy: flow.Direct,
		ControlBehavior: flow.Reject,
	},
})

最后写测试代码

// 修改这个看看效果吧
currency := 100

for i := 0; i < currency; i++ {
	go func() {
		e, b := sentinel.Entry(resource, sentinel.WithTrafficType(base.Inbound))
		if b != nil {
			// 被流控
			fmt.Printf("blocked %s \n", b.BlockMsg())
		} else {
			// 通过
			fmt.Println("pass...")
			// 通过后必须调用Exit
			e.Exit()
		}
	}()
}

这里限制了 10 qps,我们用 100 个协程并发测试跑一下,刚好通过10个请求

img2.png

测试代码已上传到我的仓库

https://github.com/lkxiaolou/sentinel-golang/tree/master/example/mytests

总结

本文介绍了 Sentinel 的和它能解决的问题,以及源码阅读的一些准备工作,并跑通了一个最简单的例子,见识到了 Sentinel 限流的效果,本文先到这里,我们下一节见。


搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 4.Sentinel源码分析— Sentinel是如何做到降级的?

    在我的第二篇文章里面2. Sentinel源码分析—Sentinel是如何进行流量统计的?里面介绍了整个Sentinel的主流程是怎样的。所以降级的大致流程可以...

    luozhiyun
  • 4.Sentinel源码分析— Sentinel是如何做到降级的?

    在我的第二篇文章里面2. Sentinel源码分析—Sentinel是如何进行流量统计的?里面介绍了整个Sentinel的主流程是怎样的。所以降级的大致流程可以...

    luozhiyun
  • go-admin在线开发平台学习-2[程序结构分析]

    首先对项目所使用的第三方库进行分析,了解作者使用的库是否是通用的官方库可以有助于我们更快地阅读程序。接着对项目的main()方法进行分析,因为程序使用cli的方...

    happlyfox
  • 流量防控该如何选型?

    临近双十一,从 2009 年第一届双十一开始,成交量只有 5000 万,到去年 2019 年,成交量达到了 2684 亿。今年迎来了第十二届双十一,想想都挺激动...

    悟空聊架构
  • 轻松两步,在 SpringBoot 服务上实现接口限流

    在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数;或者按照某种规则进行限流,如限制ip的单位时间访问次数等。

    java进阶架构师
  • 结合 Sentinel 专栏谈谈我的源码阅读方法

    Sentinel 系列共包含15篇文章,主要以源码分析为手段,图文并茂的方式对 Sentinel 的架构设计理念、核心实现要点进行了一一剖析,并加以实战分析与思...

    丁威
  • 没有 “流量防控”,还玩什么双11

    临近双十一,从 2009 年第一届双十一开始,成交量只有 5000 万,到去年 2019 年,成交量达到了 2684 亿。今年迎来了第十二届双十一,想想都挺激动...

    xjjdog
  • Spring Boot 如何快速集成 Redis 哨兵?

    前面的分享栈长介绍了如何使用 Spring Boot 快速集成 Redis,上一篇是单机版,也有粉丝留言说有没有 Redis Sentinel 的集成教程,这篇...

    Java技术栈
  • Codis Proxy初始化篇

    这篇文章会重点讲述Codis Proxy的初始化,即启动的过程,其实也不完全是Codis Proxy的初始化,应该说是Codis面向用户请求链路的初始化,即经过...

    心平气和
  • Sentinel: 使用注解限流

    在前面我们对Sentinel做了一个详细的介绍,可以手动的通过Sentinel提供的SphU类来保护资源。

    猿天地
  • Spring Cloud Alibaba 系列之 Sentinel 介绍

      随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Se...

    Demo_Null
  • 源码分析 Sentinel 之 Dubbo 适配原理

    在Alibaba Sentinel 限流与熔断初探(技巧篇) 的示例中我选择了 sentinel-demo-apache-dubbo 作为突破点,故本文就从该项...

    丁威
  • 探索Redis设计与实现13:Redis集群机制及一个Redis架构演进实例

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • go-admin在线开发平台学习-2[程序结构分析]

    首先对项目所使用的第三方库进行分析,了解作者使用的库是否是通用的官方库可以有助于我们更快地阅读程序。接着对项目的main()方法进行分析,因为程序使用cli的方...

    happlyfox
  • 比Python还好用的Go语言要出2.0了,你想怎么设计?

    在昨天的 Go contributor 年度峰会上,与会者对错误处理和泛型的设计草案有了一个初步的了解。Go 2 的开发项目是去年宣布的,今天谷歌公布了这一语言...

    机器之心
  • Sentinel规则Pull模式持久化

    前一篇【使用Nacos存储Sentinel的限流规则】讲了基于Nacos的Push模式持久化,这里讲下基于本地文件的Pull模式持久化。在网上看到一篇讲这个讲得...

    java乐园
  • 3. Sentinel源码分析— QPS流量控制是如何实现的?

    Sentinel源码解析系列: 1.Sentinel源码分析—FlowRuleManager加载规则做了什么? 2. Sentinel源码分析—Sentin...

    luozhiyun
  • 限流神器Sentinel,不了解一下吗?

    书接上回: 你来说说什么是限流? ,限流的整体概述中,描述了 限流是什么,限流方式和限流的实现。在文章尾部的 分布式限流,没有做过多的介绍,选择了放到这篇文章中...

    九灵
  • 快速入门Redis系列(6)——Redis当中的Sentinel架构

    作为快速入门Redis系列的第六篇博客,本篇为大家带来的是Redis当中的Sentinel架构。

    大数据梦想家

扫码关注云+社区

领取腾讯云代金券