作者:卜比

概述

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

在 Go 语言中,虽然社区提供了 go.uber.org/ratelimit 等限流库,但其一,对多语言支持不足,只支持 Go,其二,功能上,限流降级会细分为流控、隔离、熔断、热点等功能,也不支持动态配置,在功能支持度上不够完善。

阿里云微服务引擎(MSE)结合 Sentinel,给 Go 语言、Java 语言应用带来微服务治理能力。本文将给大家介绍如何在 Go 语言微服务应用中使用限流降级能力。

什么是限流降级

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

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

比如,针对订单创建接口(Target),我们限制请求为 1000QPS(Strategy),触发限流后,请求返回异常(FallbackAction)。

在阿里云 MSE 支持通过开源 Sentinel 的方式来定义资源,并从 MSE 获取、应用限流降级规则,整体接入如下:

如何使用 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,使用的环境变量如下:

按照上述步骤接入后,可以在应用列表页面看到我们接入的应用:

资源定义

在文章开始的时候,我们提到了限流降级=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 {// 请求可以通过,在此处编写您的业务逻辑// 务必保证业务逻辑结束后 Exite.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 处理逻辑。

如何配置限流降级规则

通过上述方式接入后,就可以配置流控规则、隔离规则、熔断规则、热点规则等规则了:

  • 查看应用

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

在应用详情页面,也可以看到应用的概览数据:

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

  • 配置流控规则

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

设置流控规则后,可以看到拒绝 QPS 增加、通过 QPS 减少:

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

  • 配置隔离规则

选择隔离防护,可以通过控制接口或依赖的并发线程数,来保证系统的稳定性。通常适用于应用内部或下游依赖出现不稳定的场景,例如慢 SQL、下游应用响应时间变长等。

  • 配置熔断规则

选择熔断防护,可以监控应用内部或者下游依赖的响应时间或异常比例,当达到指定的阈值时立即降低下游依赖的优先级。在指定的时间内,系统不会调用该不稳定的资源,避免应用受到影响,从而保障应用高可用性。当指定时间过后,再重新恢复对该资源的调用。

  • 配置热点规则

选择热点参数防护,AHAS 将分析统计参数,即资源调用过程中的调用次数较高的参数,并根据配置的热点规则对包含热点参数的资源调用进行限流,保护系统稳定性。热点即经常被访问的数据。例如在以下场景中需要统计某个热点数据中访问频次最高的 Top 数据,并对其访问进行限制。

  • 针对一段时间内最频繁购买的商品 ID 进行限制,防止击穿缓存而导致大量请求到数据库的情形。
  • 针对一段时间内频繁访问的用户 ID 进行限制,防止恶意刷单。

MSE 微服务治理规划

OpenSergo 开源项目联合 Sentinel 项目,正在制定、完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理。

阿里云微服务引擎(MSE)也会逐步支持 OpenSergo 标准,让微服务开发者能够使用 OpenSergo 来统一治理不同语言的微服务应用。

同时,阿里云 MSE 也会基于微服务治理进行探索,探索实现流量治理、限流降级、数据库治理、消息治理等功能,给微服务开发者带来全生命周期的微服务治理。

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

参考链接:

[1] MSE Go SDK:

https://mse-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sdk/go/latest/aliyun-mse-go-sdk.zip

[2] 12因子:

https://12factor.net/zh_cn/

阿里云 MSE 支持 Go 语言流量防护相关推荐

  1. 阿里云DDoS 高防 IP、DDoS 防护包

    阿里云DDoS 高防 IP.DDoS 防护包 DDoS 高防 IP 是什么 重要业务连续性的最好保证手段,有效的清洗恶意流量,保护对外 IP 地址不被黑洞, 可以抵抗最高 300G 流量 DDoS 防 ...

  2. 阿里云 MSE 云原生网关助力斯凯奇轻松应对双 11 大促

    客户简介 斯凯奇(SKECHERS)1992 年诞生于美国加州,如今已遍布全球 170 多个国家地区.在美国是仅次于耐克的第二大鞋类品牌.2020 年 11 月斯凯奇宣布与阿里云达成合作,加速数字化升 ...

  3. 阿里云国际站支持的支付方式

    阿里云国际站支持哪些支付方式?根据注册的国家/地区,支持的线上支付方式有所不同.请见下表. 注: 1)其他国家/地区指除了全球除美国,欧洲,马来西亚和印度以外的所有国家或地区,例如中国香港.中国台湾. ...

  4. 注册配置、微服务治理、云原生网关三箭齐发,阿里云 MSE 持续升级

    背景 注册中心是日常使用频率很高的微服务组件,通过较低的资源溢价帮助客户缩短微服务的构建周期.提升可用性: 微服务治理实现了 0 门槛就能接入全链路灰度.无损上下线.限流降级.环境隔离.数据库治理等能 ...

  5. 分销商邀约代充值的阿里云国际站账户怎么设置CC防护

    首先需要邀约注册成功阿里云国际站账户,充值好后订购Web应用防护墙.完成网站接入! 网站接入Web应用防火墙后,CC安全防护功能默认开启,为网站拦截针对页面请求的CC攻击(拦截后返回405拦截提示页面 ...

  6. 云上中国年,阿里云CDN猪年春节高峰流量再创新高

    虽然科技拉近了时空距离,但是大部分中国人还是在春节前穿越了千山万水,为的就是能与家人吃一顿年夜饭,这是中国人不变的情结. 过春节,红包可是少不了的关键词,互联网赋予了红包更多元的意义.各大平台每年都会 ...

  7. 阿里云服务器支持IPV6和CND的详细教程

    「特别注意:阿里云已经提供了 IPV6 的负载均衡,所以尽量直接使用阿里云的服务,避免自己搭建,引发不必要的麻烦」 自从AppStore要求必须支持IPv6后,国民感到震惊的同时,也加速了国内的ipv ...

  8. aliyunpan-sync能让阿里云盘支持同步备份

    什么是 aliyunpan-sync ? aliyunpan-sync 是阿里云盘命令行同步备份客户端,支持备份本地文件到云盘,备份云盘文件到本地,双向同步备份三种模式.支持 JavaScript 插 ...

  9. 阿里云MSE 2.0重磅发布 乘风破浪加速企业微服务化进程

    发布会传送门 点击了解产品详情 近日,阿里云微服务引擎MSE重磅发布2.0版本,在原有注册中心托管的基础上,上线配置中心托管功能,同时实现了0代码改动,就能接入微服务治理能力,并兼容Spring Cl ...

最新文章

  1. 比赛杀器LightGBM常用操作总结!
  2. IP数据报-格式-分片
  3. hdu 2154 跳舞毯 (DP)
  4. python银行系统-Python实现银行账户资金交易管理系统
  5. 中国陶瓷辊棒市场全景调查及供需格局预测报告2022-2028年版
  6. 关于ViewGroup中requestDisallowInterceptTouchEvent的用法
  7. Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) C. Restoring
  8. leetcode 290. 单词规律(hash)
  9. $.ajax()方法
  10. python 库 类_在Python中导入库类
  11. DHCP协议++ClientServer架构
  12. 机器学习与数据挖掘工程师的发展方向总结
  13. 【牛客网-公司真题-前端入门篇】——2021牛客模考-卷1
  14. 非常好用的开源矢量地图切片工具
  15. c# 使用ExcelDataReader读写excel(.xls,.xlsx)
  16. Launch Failed,Binary not found
  17. Scanner in = new Scanner(System.in);是什么意思?
  18. kafka查看topic列表和topic消息
  19. 全面理解隐马尔可夫模型
  20. windows优化大师怎么用_手机内存不够?最好用的存储空间清理工具分享给你!...

热门文章

  1. Mac微信小助手安装2.8.4防撤回闪退的解决方案
  2. 使用ash分析ORA-01652问题(r4笔记第36天)
  3. 个人简历计算机水平如何填写,简历如何写计算机水平
  4. [Luogu P3147] [BZOJ 4576] [USACO16OPEN]262144
  5. 批处理——感叹号和变量延迟扩展
  6. Google Chrome浏览器旧版本下载
  7. JetBrains 又涨价!!用不起了。。
  8. 关于内外网隔离的网络访问解决方案
  9. ROM定制开发入门-linux开发环境安装和准备
  10. PCBA大讲堂:什么是ICT(In-Circuit-Test)?有何优缺点?