带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 限流降级(中)

简介: 带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 限流降级(中)

《Apache Dubbo微服务开发从入门到精通》——服务治理与生态—— 一、 限流降级(上) https://developer.aliyun.com/article/1224020


3. Sentinel基于Dubbo的最佳实践

 

注:

具体Demo代码请见Dubbo官方示例https://github.com/apache/dubbo-samples/tree/master/99-integration/dubbo-samples-sentinel-dubbo3

 

1) Service Provider

 

注:

对服务提供方的流量控制可分为服务提供方的自我保护能力和服务提供方对服务消费方的请求分配能力两个维度。

 

Service Provider用于向外界提供服务,处理各个消费者的调用请求。为了保护Provider不被激增的流量拖垮影响稳定性,可以给Provider配置QPS模式的限流,这样当每秒的请求量超过设定的阈值时会自动拒绝多的请求。

 

限流粒度可以是服务接口和服务方法两种粒度。若希望整个服务接口的QPS不超过一定数值,则可以为对应服务接口资源(resourceName为接口全限定名)配置QPS阈值;若希望服务的某个方法的QPS不超过一定数值,则可以为对应服务方法资源(resourceName为接口全限定名方法签名)配置QPS阈值。有关配置详情请参考流量控制|Sentinel

 

我们看一下这种模式的限流产生的效果。假设我们已经定义了某个服务接口com.alibaba.csp.sentinel.demo.dubbo.FooService,其中有一个方法sayHello(java.lang.String),Provider端该方法设定QPS阈值为10。在Consumer端在1s之内连续发起15次调用,可以通过日志文件看到Provider端被限流。拦截日志统一记录在~/logs/csp/sentinel-block.log中:

 

image.png

 

在Provider对应的metrics日志中也有记录:

 

image.png

 

根据调用方的需求来分配服务提供方的处理能力也是常见的限流方式。比如有两个服务A和B都向Service Provider发起调用请求,我们希望只对来自服务B的请求进行限流,则可以设置限流规则的limitApp为服务B的名称。Sentinel Dubbo Adapter会自动解析Dubbo消费者(调用方)的application name作为调用方名称(origin),在进行资源保护的时候都会带上调用方名称。若限流规则未配置调用方(default),则该限流规则对所有调用方生效。若限流规则配置了调用方则限流规则将仅对指定调用方生效。

 

注:

Dubbo默认通信不携带对端application name信息,因此需要开发者在调用端手动将application name置入attachment中,provider端进行相应的解析。Sentinel Dubbo Adapter实现了一个Filter用于自动从consumer端向provider端透传application name。若调用端未引入Sentinel Dubbo Adapter,又希望根据调用端限流,可以在调用端手动将application name置入attachment中,key为dubboApplication。

 

在限流日志中会也会记录调用方的名称,如下面的日志中的demo-consumer即为调用方名称:

 

image.png

 

2) Service Consumer

 

注:

对服务提供方的流量控制可分为控制并发线程数和服务降级两个维度。

 

并发线程数限流

 

Service Consumer作为客户端去调用远程服务。每一个服务都可能会依赖几个下游服务,若某个服务A依赖的下游服务B出现了不稳定的情况,服务A请求服务B的响应时间变长,从而服务A调用服务B的线程就会产生堆积,最终可能耗尽服务A的线程数。我们通过用并发线程数来控制对下游服务B的访问,来保证下游服务不可靠的时候,不会拖垮服务自身。基于这种场景,推荐给Consumer配置线程数模式的限流,来保证自身不被不稳定服务所影响。采用基于线程数的限流模式后,我们不需要再显式地去进行线程池隔离,Sentinel会控制资源的线程数,超出的请求直接拒绝,直到堆积的线程处理完成,可以达到信号量隔离的效果。

 

我们看一下这种模式的效果。假设当前服务A依赖两个远程服务方法sayHello(java.lang.String)和doAnother()。前者远程调用的响应时间为1s-1.5s之间,后者RT非常小(30 ms左右)。服务A端设两个远程方法thread count为5。然后每隔50 ms左右向线程池投入两个任务,作为消费者分别远程调用对应方法,持续10次。可以看到sayHello方法被限流5次,因为后面调用的时候前面的远程调用还未返回(RT高);而doAnother()调用则不受影响。线程数目超出时快速失败能够有效地防止自己被慢调用所影响。

 

服务降级

 

当服务依赖于多个下游服务,而某个下游服务调用非常慢时,会严重影响当前服务的调用。这里我们可以利用Sentinel熔断降级的功能,为调用端配置基于平均RT的降级规则。这样当调用链路中某个服务调用的平均RT升高,在一定的次数内超过配置的RT阈值,Sentinel就会对此调用资源进行降级操作,接下来的调用都会立刻拒绝,直到过了一段设定的时间后才恢复,从而保护服务不被调用端短板所影响。同时可以配合fallback功能使用,在被降级的时候提供相应的处理逻辑。

 

3) Fallback

 

从0.1.1版本开始,Sentinel Dubbo Adapter还支持配置全局的fallback函数,可以在Dubbo服务被限流/降级/负载保护的时候进行相应的fallback处理。用户只需要实现自定义的DubboFallback接口,并通过DubboFallbackRegistry注册即可。默认情况会直接将BlockException包装后抛出。同时,我们还可以配合Dubbo的fallback机制来为降级的服务提供替代的实现。


《Apache Dubbo微服务开发从入门到精通》——服务治理与生态—— 一、 限流降级(下) https://developer.aliyun.com/article/1224017


 

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
5月前
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
11月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
389 5
|
7月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
762 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
11月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
8月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
407 0
|
消息中间件 API 持续交付
后端开发中的微服务架构实践####
【10月更文挑战第21天】 本文深入探讨了微服务架构在后端开发中的应用,从基本概念出发,详细阐述了微服务的核心优势、设计原则及关键技术。通过实际案例分析,揭示了微服务如何助力企业应对复杂业务需求,提升系统的可扩展性、灵活性与可靠性。同时,也指出了实施微服务过程中可能面临的挑战,并提供了相应的解决方案和最佳实践。 ####
215 3
|
10月前
|
人工智能 数据可视化 JavaScript
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
Juggle是国内首个开源的微服务编排框架,专注于解决企业微服务进程中接口重复开发、系统对接复杂等问题。它提供零代码、低代码和AI增强功能,通过可视化拖拽快速组装简单API为复杂接口,支持多协议、多语言脚本和流程多版本管理。相比国外框架如Conductor,Juggle更贴合国内需求,具备高效开发、企业级可靠性及信创适配等优势,助力企业实现敏捷创新与数字化转型。
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
|
9月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
1016 0
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
294 32
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####

热门文章

最新文章

推荐镜像

更多