将 Go 应用接入 AHAS 应用防护后,可以对其配置流控、降级和系统规则来保证系统稳定性。本文将帮助您了解如何使用 SDK 方式将 Go 应用接入应用防护。

前提条件

确保 Go 应用的版本为 1.12 或以上,并通过 Go Modules 管理依赖。

Go 应用接入步骤

  1. 登录 AHAS 控制台,然后在页面左上角选择地域
  2. 在左侧导航栏选择流量防护 > 应用防护
  3. 应用接入页面右上角单击新应用接入,然后接入语言选择GO接入方式选择 SDK 接入
  4. 自定义埋点 页面查看 License 信息(非公网地域不需要)。
    查看license
  5. 自定义埋点页面单击下载 AHAS Go SDK,然后将安装包解压到本地。
  6. 打开您的 Go 工程,并在 go.mod 文件中添加以下依赖。
    说明 /path/to/aliyun-ahas-go-sdk 是示例路径,请替换为 Go SDK 的解压路径。
    require github.com/aliyun/aliyun-ahas-go-sdk v1.0.0
    replace github.com/aliyun/aliyun-ahas-go-sdk => /path/to/aliyun-ahas-go-sdk
  7. 添加 AHAS Sentinel 初始化命令,并在应用启动时生效。
    import (
        ahas "github.com/aliyun/aliyun-ahas-go-sdk"
    )
    
    // 在应用的初始化逻辑中加入以下代码。
    // Sentinel core 的初始化包含在了这里面。如果之前有调用过 Sentinel 的初始化函数,需要去掉。
    err := ahas.InitAhasDefault()
    if err != nil {
        log.Fatalf("Failed to init AHAS: %+v", err)
    }
  8. 使用以下代码包住您的业务逻辑,埋点方法及示例请参见Sentinel Go 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 中获取限流详情。
    } else {
        // 请求可以通过,在此处编写您的业务逻辑。
        // 务必保证业务逻辑结束后 Exit。
        e.Exit()
    }
  9. 使用以下任意一种方式配置 AHAS Sentinel。
    • Yaml 文件配置。

      AHAS 支持的 Yaml 配置项如下:

      说明
      • 若通过 InitAhasFromFile(path) 初始化 AHAS,则会从 path 指定的 Yaml 文件中读取配置项。
      • 若通过 InitAhasDefault() 初始化 AHAS,则会尝试从 SENTINEL_CONFIG_FILE_PATH 环境变量读取 path 并读取对应的文件。若未指定则默认从项目目录下的 sentinel.yml 文件读取配置。
      • 若均不存在,AHAS 则会通过环境变量读取基础的配置(如项目名称),其他配置项采用默认值。注意环境变量配置会覆盖配置文件的配置。
      Key 对应的 Yaml 配置项 含义 备注
      SENTINEL_APP_NAME sentinel.app.name 项目名称 必需的配置项,若不配置则标为 unknown_go_service
      SENTINEL_CONFIG_FILE_PATH Yaml 配置文件路径 若未指定则默认从项目目录下的 sentinel.yml 文件读取配置。
      AHAS_LICENSE ahas.license AHAS License 公网环境必需,Region 环境不需要。
      AHAS_NAMESPACE ahas.namespace AHAS 命名空间 默认为 Default。需在控制台预先添加后配置,不可随便指定。
      SENTINEL_LOG_DIR 日志路径 默认路径为 ~/logs/csp
      SENTINEL_LOG_USE_PID 日志文件是否带 Pid 默认为 False。

      配置文件示例:

      sentinel:
        app:
          # 应用名,会显示在 AHAS 控制台,必须指定。
          name: sentinel-go-service
      sentinel:
        app:
          # 应用名,会显示在 AHAS 控制台,必须指定。
          name: sentinel-go-service
      # license 公网环境需要,阿里云 Region 的应用不需要。
      ahas:
        license: "xxx"
    • 配置环境变量。
      SENTINEL_APP_NAME=应用名
      AHAS_LICENSE=${license}; SENTINEL_APP_NAME=应用名
  10. 重启您的应用。

Sentinel Go API

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

埋点 API 位于 API 包中,一般为 Entry(resource string, opts ...Option) (*base.SentinelEntry, *base.BlockError),其中 resource 代表埋点资源名,opts 代表埋点配置。目前支持以下埋点配置:

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

埋点 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 中获取限流详情。
} else {
    // 请求可以通过,在此处编写您的业务逻辑。
    // 务必保证业务逻辑结束后 Exit。
    e.Exit()
}
说明 若该次调用被拒绝,则 Entry API 会返回 BlockError 代表被 Sentinel 限流。BlockError 提供了限流原因以及触发的规则等信息,可以方便开发者获取相关信息进行记录和处理。

执行结果

启动应用并调用配置埋点的方法。若该应用出现在 AHAS 控制台流量防护 > 应用防护页面,且在该应用的监控详情页面有能看到配置埋点的方法,则说明接入成功。

相关操作

给 Go SDK 应用配置规则,目前只支持流控规则、隔离规则和系统规则: