Sentinel GO API 使用指南

简介: 随着分布式系统的日益普及,服务之间的可靠性比以往任何时候都更加重要。Sentinel以“流量”为切入点,致力于流量控制、断路和系统自适应保护等多个领域,确保微服务的可靠性和弹性。

API 使用指南

用户接入使用 Sentinel Go (后文均用 Sentinel 表示 Sentinel Go) 主要需要需要以下几步:

  1. 对 Sentinel 的运行环境进行相关配置并初始化。API 接口使用细节可以参考:配置方式
  2. 埋点(定义资源),该步骤主要是确定系统中有哪些资源需要防护,资源定义可参考:新手指南
  3. 配置规则,该步骤主要是为每个资源都配置具体的规则,规则的配置可参考:新手指南 以及各个模块的使用文档。
  4. 编写资源防护的入口和出口代码。释放方式可参考:新手指南

通用配置及初始化

使用 Sentinel 需要在应用启动时对 Sentinel 运行环境进行相关配置并触发初始化。api 包下提供如下函数:

  • InitDefault():从环境变量指定的配置文件以及环境变量中读取相应配置来初始化 Sentinel,若环境变量不存在则使用默认值。
  • Init(configPath string):从给定的 YAML 文件中读取相应配置来初始化 Sentinel。
  • InitWithConfig(confEntity *config.Entity): 用户硬编码配置对象*config.Entity来初始化Sentinel。

通用配置项加载策略和配置项请参考 配置方式使用文档

示例代码:

import (
  sentinel "github.com/alibaba/sentinel-golang/api"
)
func initSentinel() {
  err := sentinel.Init(confPath)
  if err != nil {
    // 初始化 Sentinel 失败
  }
}

注意:必须成功调用 Sentinel 的初始化函数以后再调用埋点 API。

埋点(定义资源)

使用 Sentinel 的 Entry API 将业务逻辑封装起来,这一步称为“埋点”。每个埋点都有一个资源名称(resource),代表触发了这个资源的调用或访问。

埋点 API 位于 api 包中:

  • Entry(resource string, opts ...Option) (*base.SentinelEntry, *base.BlockError)

其中 resource 代表埋点资源名,opts 代表埋点配置。这里需要注意的是,返回值参数列表的第一个和第二个参数是互斥的,也就是说,如果Entry执行pass,那么Sentinel会返回(*base.SentinelEntry, nil);如果Entry执行blocked,那么Sentinel会返回(nil, *base.BlockError)。

目前支持以下埋点配置:

  • WithTrafficType(entryType base.TrafficType):标记该埋点资源的流量类型,其中 Inbound 代表入口流量,Outbound 代表出口流量。若不指定,默认为 Outbound。
  • WithResourceType(resourceType base.ResourceType):标记该埋点资源的分类。
  • WithAcquireCount(acquireCount uint32):标记每次触发该埋点计为几次调用(可以理解为 batch count)。若不指定,默认为 1。
  • WithArgs(args ...interface{}):埋点携带的参数列表,为热点参数统计预留。
  • WithSlotChain(chain *base.SlotChain):埋点执行的检查的slotchain,若不指定,默认使用全局slotchain

埋点 API 示例:

import (
  sentinel "github.com/alibaba/sentinel-golang/api"
)
// Entry 方法用于埋点
e, b := sentinel.Entry("your-resource-name", sentinel.WithTrafficType(base.Inbound))
if b != nil {
  // 请求被流控,可以从 BlockError 中获取限流详情
  // block 后不需要进行 Exit()
} else {
  // 请求可以通过,在此处编写您的业务逻辑
  // 务必保证业务逻辑结束后 Exit
  e.Exit()
}

若该次调用被拒绝,则 Entry API 会返回 BlockError 代表被 Sentinel 限流。BlockError 提供了限流原因以及触发的规则等信息,可以方便开发者获取相关信息进行记录和处理。

规则配置

硬编码方式

Sentinel 支持原始的硬编码方式加载规则,可以通过各个模块的 LoadRules(rules) 函数加载规则。以流控规则为例:

_, err = flow.LoadRules([]*flow.Rule{
  {
    Resource:               "some-test",
    Threshold:              10,
    TokenCalculateStrategy: flow.Direct,
    ControlBehavior:        flow.Reject,
  },
})
if err != nil {
  // 加载规则失败,进行相关处理
}

动态数据源

Sentinel 提供动态数据源接口进行扩展,用户可以通过动态文件、etcd、consul、nacos 等配置中心来动态地配置规则。

相关文章
|
2月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
2月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
5天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
21天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
2月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
2月前
|
Go API
Go - 统一定义 API 错误码
Go - 统一定义 API 错误码
45 9
|
2月前
|
测试技术 编译器 Go
依赖注入与控制反转:优化Go语言REST API客户端
依赖注入与控制反转:优化Go语言REST API客户端
|
2月前
|
消息中间件 缓存 API
go-zero微服务实战系列(三、API定义和表结构设计)
go-zero微服务实战系列(三、API定义和表结构设计)
|
2月前
|
NoSQL Go API
简洁、轻量级的 Go API 框架
简洁、轻量级的 Go API 框架
30 0
|
3月前
|
关系型数据库 MySQL Go
go项目实现mysql接入以及web api
go项目实现mysql接入以及web api
30 0
下一篇
无影云桌面