微服务架构在之前的一篇文章《高并发系统如何设计》中介绍过,是对复杂系统按分而治之的思路,将单体架构拆分成多个微服务,方便服务治理和提升开发运维效率。但无疑也引入了复杂性,需要特别关注。今天介绍微服务治理相关的内容:微服务流控、熔断和降级方案。 微服务架构在处理用户请求时,需要依赖多个外部服务,通过RPC调用完成处理,如下图所示 当某些原因,下游服务响应变慢或不可用时,上游服务因等待下游返回而短时间堆积大量线程,直到到达超时时间才释放,流量到达一定数量后,上游服务器内存被占满,导致服务不可用,而且故障会继续向上传导,服务雪崩就出现了。如下图演示的过程。 这种情况下,通常有两种策略:服务熔断、服务降级。 服务熔断:当下游响应变慢或不可用时,上游感知到后主动不去调用下游服务,返回业务预设的数据,从而保证自身的服务稳定,等待下游服务恢复后重新调用。 熔断状态图:初始Closed状态,错误达到阈值进入Open状态,到达resettimeout后进入HalfOpen状态,尝试处理部分流量,如果正常,进入Closed状态,如果还是异常,进入Open状态,继续熔断。 服务降级:因bug或服务资源不足,导致服务响应变慢,而主动放弃资源占用大的计算或对下游的调用,来增加响应速度和处理能力,服务熔断是服务降级的一种策略。 那么如何解决服务雪崩的问题呢?这里介绍阿里开源的Sentinel。Sentinel:随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。 Sentinel具有以下特征:丰富的应用场景、完备的实时监控、广泛的开源生态、完善的SPI扩展机制。 Sentinel是阿里巴巴根据多年大型商业系统的运维实践开发,支持双十一大促、秒杀。可以定义灵活的限流、熔断策略,并可通过控制台远程动态控制。现在已经开源供大家学习使用。 使用方式: 1。引入pom依赖dependencygroupIdcom。alibaba。cspgroupIdsentinelcoreartifactIdversion1。8。5versiondependency 2。定义资源,支持嵌入代码和注解两种方式 嵌入代码:1。5。0版本开始可以利用trywithresources特性资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。try(EntryentrySphU。entry(resourceName)){被保护的业务逻辑dosomethinghere。。。}catch(BlockExceptionex){资源访问阻止,被限流或被降级在此处进行相应的处理操作} 注解:SentinelResource(blockHandlerblockHandlerForGetUser)publicUsergetUserById(Stringid){thrownewRuntimeException(getUserByIdcommandfailed);}blockHandler函数,原方法调用被限流降级系统保护的时候调用publicUserblockHandlerForGetUser(Stringid,BlockExceptionex){returnnewUser(admin);} 3。定义规则,通过规则来指定允许该资源通过的请求次数,例如下面的代码定义了资源resourceName每秒最多只能通过20个请求。privatestaticvoidinitFlowRules(){ListFlowRulerulesnewArrayList();FlowRulerulenewFlowRule();rule。setResource(resourceName);rule。setGrade(RuleConstant。FLOWGRADEQPS);SetlimitQPSto20。rule。setCount(20);rules。add(rule);FlowRuleManager。loadRules(rules);} 完成! 最后,跟大家推荐阿里云团队主导编写的《微服务治理技术白皮书》,对于深入了解和学习微服务治理很有帮助,有需要pdf版本的,请下方留言。