作者:卜比

概述

随着 Go 言语、云原生的广泛选用,Go 言语在微服务场景中运用的越来越广泛,对 Go 言语微服务的管理、限流降级需求也越来越强。

在 Go 言语中,尽管社区供给了 go.uber.org/ratelimit 等限流库,但其一,对多言语支撑不足,只支撑 Go,其二,功能上,限流降级会细分为流控、阻隔、熔断、热门等功能,也不支撑动态装备,在功能支撑度上不行完善。

阿里云微服务引擎(MSE)结合 Sentinel,给 Go 言语、Java 言语运用带来微服务管理才能。本文将给咱们介绍如何在 Go 言语微服务运用中运用限流降级才能。

什么是限流降级

阿里云 MSE 支持 Go 语言流量防护

在微服务运用中,限流降级首要分为三步:

  • Target: 针对什么样的流量
  • Strategy: 限流降级的策略
  • FallbackAction: 触发后的行为

比如,针对订单创立接口(Target),咱们约束恳求为 1000QPS(Strategy),触发限流后,恳求回来反常(FallbackAction)。

在阿里云 MSE 支撑经过开源 Sentinel 的方法来定义资源,并从 MSE 获取、运用限流降级规矩,整体接入如下:

阿里云 MSE 支持 Go 语言流量防护

如何运用 MSE限流降级

运用接入

  1. 下载 **MSE Go SDK [ 1] **,解压到项目的./pkg-custom/github.com/aliyun/aliyun-mse-go-sdk-v1.0.7 目录。
    1. 可以参阅 SDK 的 example 目录下的比如,来进行接入。
  1. 在 go.mod 文件中,添加如下依靠声明:

require (
  github.com/aliyun/aliyun-mse-go-sdk v1.0.7
)
replace github.com/aliyun/aliyun-mse-go-sdk => ./pkg-custom/github.com/aliyun/aliyun-mse-go-sdk
  1. 在运用的发动过程中,添加 MSE SDK 初始化指令:
import (
  mse_sdk "github.com/aliyun/aliyun-mse-go-sdk"
)
// 在运用的初始化逻辑中加入以下代码。
// Sentinel core的初始化包括在了这里面。假如之前有调用过Sentinel的初始化函数,需求去掉。
err := mse_sdk.InitMseDefault
if err != nil {
    log.Fatalf("Failed to init MSE: %+v", err)
}

运用布置

在云原生布置方法中,一般的布置规范是12 因子 [ 2] ,其中关于装备,引荐将运用的装备存储于环境变量中。这样运用在布置时,只需求切换不同的环境变量,就可以接入不同的环境。

相同的,MSE-Go-SDK 也引荐咱们经过环境变量的方法接入 MSE,运用的环境变量如下:

阿里云 MSE 支持 Go 语言流量防护

依照上述步骤接入后,可以在运用列表页面看到咱们接入的运用:

阿里云 MSE 支持 Go 语言流量防护

资源定义

在文章开端的时候,咱们提到了限流降级=Target+Strategy+FallbackAction。所以第一步便是要定义 Target。

  • Sentinel 定义资源

MSE 支撑用户经过 Sentinel 定义的资源,只需求用如下代码块包裹事务逻辑即可:

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()
}

当然,在日常的事务开发中,开发者常常经过微服务结构供给服务,比如 dubbo-go、Gin、gRPC 等,自然而然的,咱们希望可以将这些服务注册为资源:

  • dubbo-go 方法定义资源

只需求引进 dubbo-go adaptor 即可主动注册资源到 MSE:

import (
    _ "github.com/alibaba/sentinel-golang/adapter/dubbo"
)
  • Dubbo 运用是在代码中经过 import 包的方法引进 Dubbo adapter,其中的 init()函数会主动注入相关 filter。Dubbo-Go 版本需求≥1.3.0。Sentinel Dubbo adapter 会主动计算一切 provider 和 consumer 的调用。

  • gRPC运用接入

import (
  sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/grpc"
  "google.golang.org/grpc"
)
s := grpc.NewServer(grpc.UnaryInterceptor(sentinelPlugin.NewUnaryServerInterceptor()))
  • gRPC 运用在 gRPC 的初始化代码中引进 Sentinel 供给的 interceptor,Sentinel 针对 Server 和 Client 都供给了 unary 和 streaming 两种 interceptor,以上代码以 Server 端为例。默许的限流处理逻辑是回来 Sentinel 的 BlockError。您也可以在创立 interceptor 时供给自定义的 fallback 处理逻辑。

  • Gin Web 运用接入

import (
  sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/gin"
  "github.com/gin-gonic/gin"
)
r := gin.New()
r.Use(sentinelPlugin.SentinelMiddleware())
  • Gin Web 运用在 Gin 的初始化代码中引进 SentinelMiddleware。Sentinel 会对每个 API route 进行计算,资源名称类似于 GET:/foo/:id。默许的限流处理逻辑是回来 429 (Too Many Requests)错误码。

  • Micro运用接入

import (
  sentinelPlugin "github.com/alibaba/sentinel-golang/adapter/micro"
  "github.com/micro/go-micro/v2"
)
svc := micro.NewService(micro.WrapHandler(sentinelPlugin.NewHandlerWrapper()))
  • 在 Go-Micro 的初始化代码中引进 Sentinel 供给的 wrapper。Sentinel 针对 Go-Micro Server 和 Client 都供给了 wrapper。以上代码以 Server端为例。埋点默许会提取服务 method 作为资源名,默许的流控处理逻辑是回来 Sentinel 的 BlockError。您也可以在创立 wrapper 时供给自定义的 fallback 处理逻辑。

如何装备限流降级规矩

经过上述方法接入后,就可以装备流控规矩、阻隔规矩、熔断规矩、热门规矩等规矩了:

  • 查看运用

接入后,可以在运用列表页面看到咱们接入的运用:

阿里云 MSE 支持 Go 语言流量防护

在运用概况页面,也可以看到运用的概览数据:

阿里云 MSE 支持 Go 语言流量防护

可以查看代码中注册的资源:

阿里云 MSE 支持 Go 语言流量防护

  • 装备流控规矩

可以针对每种资源设置流控规矩:

阿里云 MSE 支持 Go 语言流量防护

设置流控规矩后,可以看到拒绝 QPS 添加、经过 QPS 减少:

阿里云 MSE 支持 Go 语言流量防护

挑选流控防护,可以预设服务可承受的 QPS 流量,当流量到达设定阈值时当即阻拦超出部分的恳求,避免运用被瞬时的流量高峰冲垮。

  • 装备阻隔规矩

阿里云 MSE 支持 Go 语言流量防护

挑选阻隔防护,可以经过操控接口或依靠的并发线程数,来确保系统的稳定性。一般适用于运用内部或下游依靠呈现不稳定的场景,例如慢 SQL、下游运用呼应时刻变长等。

  • 装备熔断规矩

阿里云 MSE 支持 Go 语言流量防护

挑选熔断防护,可以监控运用内部或许下游依靠的呼应时刻或反常比例,当到达指定的阈值时当即降低下游依靠的优先级。在指定的时刻内,系统不会调用该不稳定的资源,避免运用受到影响,从而保证运用高可用性。当指定时刻往后,再从头恢复对该资源的调用。

  • 装备热门规矩

阿里云 MSE 支持 Go 语言流量防护

挑选热门参数防护,AHAS 将分析计算参数,即资源调用过程中的调用次数较高的参数,并依据装备的热门规矩对包括热门参数的资源调用进行限流,维护系统稳定性。热门即经常被拜访的数据。例如在以下场景中需求计算某个热门数据中拜访频次最高的 Top 数据,并对其拜访进行约束。

  • 针对一段时刻内最频繁购买的商品 ID 进行约束,避免击穿缓存而导致很多恳求到数据库的情形。
  • 针对一段时刻内频繁拜访的用户 ID 进行约束,避免歹意刷单。

MSE 微服务管理规划

OpenSergo 开源项目联合 Sentinel 项目,正在拟定、完善限流降级规范,方便不同言语运用经过一致操控面来实现一致的微服务管理。

阿里云微服务引擎(MSE)也会逐渐支撑 OpenSergo 规范,让微服务开发者可以运用 OpenSergo 来一致管理不同言语的微服务运用。

一起,阿里云 MSE 也会根据微服务管理进行探究,探究实现流量管理、限流降级、数据库管理、音讯管理等功能,给微服务开发者带来全生命周期的微服务管理。

MSE 注册装备中心专业版首购享 9 折优惠,MSE 云原生网关预付费全标准享 9 折优惠。点击此处,即享优惠!

参阅链接:

[1] MSE Go SDK:

mse-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sdk/go/late…

[2] 12因子:

12factor.net/zh_cn/