Microservices - MSE V2
MSE快速入门
- MSE产品包含以下模块:微服务注册配置中心、微服务治理、云原生网关
- 您在构建自己的微服务体系时,既可单独使用某个模块,也可搭配使用以便获得微服务生态的最佳实践
概览
简介
本教程覆盖微服务引擎MSE的核心能力,帮助您快速上手并理解MSE产品,预计体验时长20分钟。主要分为如下四个步骤,建议您按照顺序进行体验
- 在容器(ACK或ACK Serverless集群)部署示例的微服务应用,并将服务注册到Nacos
- 通过注册配置中心实现统一配置管理
- 利用云原生网关将服务暴露到公网
- 通过服务治理实现全链路灰度发布
适用对象
本教程适用于Spring Cloud&Dubbo等微服务框架的开发者、IT基础架构师、管理员和DevOps人员等计划在阿里云上实现或扩展云原生架构的相关人员
整体架构
- 注册配置中心:支持注册和配置中心全托管(兼容Nacos/ZooKeeper/Eureka),可实现对服务节点和配置信息的维护和统一管理,具备丰富完善的监控报警、控制台运维操作和引擎类型,相比开源组件,具有更高性能、SLA保障和配置能力
- 云原生网关:提供安全高效的符合K8s Ingress标准的下一代网关,将Ingress流量网关、微服务、安全网关三合一
- 微服务治理:无侵入增强主流Spring Cloud、Apache Dubbo等开源微服务框架,提供丰富的服务治理和流量防护功能,将中间件与业务解耦,可实现熔断限流降级、无损上下线、全链路灰度等多种治理能力,提升开发效率和线上稳定性
ACK + ACS
您可以将部署在容器服务 Kubernetes 版和容器计算服务中的Spring Cloud和Dubbo等微服务应用接入MSE治理中心,使用MSE提供的一系列服务治理能力,大幅提升线上微服务的稳定性和开发效率,本文介绍如何将ACK和ACS微服务应用接入MSE治理中心
为单个应用开启MSE微服务治理 - Deployment - spec.template.metadata.labels
| label | value |
|---|---|
| msePilotAutoEnable: “on” | 开启MSE微服务治理 |
| mseNamespace: default | 设置MSE命名空间 |
| msePilotCreateAppName: “your-deployment-name” | 设置应用名称,需替换为实际Deployment名称 |
1 | spec: |
配置流控规则
配置流控规则的原理是监控应用或服务流量的QPS指标,当指标达到设定的阈值时立即拦截流量,避免应用被瞬时的流量高峰冲垮,从而保障应用高可用性。本文介绍如何配置管理流控规则,以及常用场景的流控配置规则。
背景信息
- 流量控制在网络传输中是一个常用的概念,常用于调整网络包的发送数据
- 系统需处理的请求是随机不可控的,而系统的处理能力是有限的,因此就需要根据系统的处理能力对流量进行控制
常用场景:削峰填谷,使流量匀速通过
- 请求流量具有波峰波谷的特点,流控的原理是将前面的峰值流量延迟(排队时长)到后面再处理,既能最大化满足所有请求,又能保证用户体验
- 在新增流控防护规则或新增规则对话框中配置以下规则信息
- 配置匀速模式下请求单机QPS阈值为5
- 流控效果选择排队等待
- 超时时间为5s
- 系统则每 200ms 处理一条请求,多余的处理任务将排队;同时设置了等待时长为5s,则预计排队时长超过5s的处理任务将快速失败,直接返回默认流控信息,如文本、静态页面等
graph TB
PEAK["波峰流量<br/>瞬时QPS超过阈值"] --> RULE["流控规则(匀速模式)<br/>单机QPS阈值 = 5<br/>流控效果: 排队等待<br/>超时时间: 5s"]
RULE --> CHECK{"预计排队时长<br/>是否不超过5s?"}
CHECK -->|"是: 延迟排队(削峰)"| QUEUE["进入排队队列"]
CHECK -->|"否: 预计排队超时"| FAIL["快速失败<br/>返回默认流控信息<br/>(文本/静态页面)"]
QUEUE --> UNIFORM["匀速放行<br/>每200ms处理一条请求"]
UNIFORM --> BIZ["业务系统平稳处理<br/>(填谷: 峰值流量延后消化)"]
style PEAK fill:#ffe0b2
style RULE fill:#e1f5fe
style CHECK fill:#fff9c4
style QUEUE fill:#c8e6c9
style UNIFORM fill:#a5d6a7
style BIZ fill:#f3e5f5
style FAIL fill:#ffcdd2
深入原理:匀速排队对应漏桶算法
- 排队等待的匀速语义对应漏桶算法(Leaky Bucket),Sentinel官方文档明确说明:匀速排队方式会严格控制请求通过的间隔时间,让请求以均匀的速度通过,对应的是漏桶算法
- 令牌桶与漏桶的关键差异就在匀速二字上
| 特征 | 令牌桶 | 漏桶(排队等待) |
|---|---|---|
| 放行速率 | 平均速率恒定,允许突发 | 严格恒定,输出被整形 |
| 突发流量 | 桶里攒的令牌可被瞬间取走,一波请求同时通过 | 不允许,每个请求间隔固定200ms |
| 请求超量时 | 取不到令牌直接拒绝(不排队) | 进队列排队等待,等太久才拒绝 |
- 文中三个特征——每200ms处理一条、多余任务排队、预计超过5s快速失败——分别对应漏桶的恒定出水速率、排队缓冲、溢出拒绝;令牌桶算法下请求不排队,且攒满令牌时会放行突发流量,与匀速矛盾
graph TB
subgraph TOKEN["令牌桶: 允许突发"]
T_GEN["恒定速率生成令牌<br/>(1000ms投放5个)"] -. "持续投放" .-> T_TAKE
T_REQ["请求到达"] --> T_TAKE{"桶中有令牌?"}
T_TAKE -->|"有: 取走令牌"| T_PASS["立即通过<br/>攒满的令牌可放行突发流量"]
T_TAKE -->|"无"| T_REJ["直接拒绝<br/>(不排队)"]
end
subgraph LEAKY["漏桶: 匀速整形 (MSE排队等待)"]
L_REQ["请求到达"] --> L_CAP{"预计排队时长<br/>是否不超过5s?"}
L_CAP -->|"是: 削峰"| L_Q["排队等待"]
L_CAP -->|"否: 溢出"| L_REJ["快速失败"]
L_Q --> L_OUT["恒定速率流出<br/>每200ms处理一条 (填谷)"]
end
style T_GEN fill:#ffe0b2
style T_TAKE fill:#fff9c4
style T_PASS fill:#c8e6c9
style T_REJ fill:#ffcdd2
style L_REQ fill:#ffe0b2
style L_CAP fill:#fff9c4
style L_Q fill:#c8e6c9
style L_OUT fill:#a5d6a7
style L_REJ fill:#ffcdd2
- MSE的排队等待对应开源Sentinel的
RateLimiterController,它没有真实的队列数据结构,只用一个latestPassedTime时间戳做虚拟排队,文中200ms的来源即1000 / QPS阈值 = 1000 / 5(简化后的核心逻辑)
1 | long currentTime = TimeUtil.currentTimeMillis(); |
- Sentinel中真正借鉴令牌桶的是Warm Up(预热)模式——用桶中积攒的令牌决定放行斜率,从冷水位平滑爬升到阈值;快速失败则是滑动窗口计数,达到阈值立即拒绝
| 流控效果 | Controller | 限流算法 | 行为 |
|---|---|---|---|
| 快速失败 | DefaultController |
滑动窗口计数 | 达到阈值立即拒绝 |
| Warm Up 预热 | WarmUpController |
令牌桶(参考Guava SmoothWarmingUp,冷启动因子3) |
冷启动时缓慢放量爬升到阈值 |
| 排队等待 | RateLimiterController |
漏桶(虚拟队列) | 匀速放行、可排队、超时拒绝 |
- 注意:排队等待只对QPS阈值类型生效,不支持并发线程数模式
更多信息
新增流控防护规则或新增规则对话框参数说明如下:
| 参数 | 描述 |
|---|---|
| 接口名称 | 待流控的资源名称 |
| 是否开启 | 打开开关表示启用该规则,关闭开关表示禁用该规则,开关修改之后会立即生效 |
| 单机 QPS 阈值 | 触发对流控接口的统计维度对象的QPS阈值 |
| 流控效果 | 选择流控方式来处理被拦截的流量 1. 快速失败:达到阈值时,立即拦截请求,按照应用系统设置中的适配模块配置信息,进行内容返回 2. 排队等待:请求匀速通过,允许排队等待,通常用于请求调用削峰填谷等场景,需设置具体的超时时间,达到超时时间后请求会快速失败 |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.












