2.7 Spring Cloud 微服务 API 的 Hystrix 熔断限流降级| 学习笔记

简介: 快速学习 2.7 Spring Cloud 微服务 API 的 Hystrix 熔断限流降级。

开发者学堂课程【Spring Cloud 微服务架构设计与开发实战 2.7 Spring Cloud 微服务 API 的 Hystrix 熔断限流降级】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/60/detail/1090


2.7 Spring Cloud 微服务 API 的 Hystrix 熔断限流降级

 

内容简介

一、Java Spring Cloud 熔断限流

二、Java Spring Cloud 熔断限流实战

三、总结

 

本节课继续讲解 Spring Cloud 微服务 Java,设计与实战系列课程,主要是学习如何熔断降级和限流。

上节课讲过 Hystrix 做启动监控面板并进行数据的采集,也讲到了一些在实战中所遇到的“坑”,在2·3版本后在默认的安全性方面做了加强,比如:不能私自请求监控隧源,是需要经过特殊的商务设置,需要允许监控面板链接某个隧源才行,此参数在当时已经进行过演示。

 

一、Java Spring Cloud 熔断限流

1、熔断是对于高频发系统,为了保证高可用时采用的重要措施。

(1)详解:

拿淘宝的双十一举例,xxx如果做了一个高频发系统,在服务器集群理论上,是支持每秒一万的变化,在双十一时,如果流量超过一万将近两万时,xxx并不希望系统直接瘫痪或服务器全部崩溃,此时应该做保护措施,这种保护措施指的是,带保险丝在照明系统里安装了很重要的安全开关;起到的作用是,在电路超负荷运行时,会自动跳匝的安全措施,这个概念可以直接引用到 Spring Cloud 里。

(2)如果xxx关注过其他分布式框架,阿里巴巴在早期已经实现了熔断和限流机制,这种现象在淘宝双十一时体现的比较明显,xxx对之前参加的双十一活动还有印象的话,在当时淘宝的服务器比较卡顿,京东也是如此。为什么会出现这种现象?因为这些电商公司在早期没有经历过如此高规模的变化流量,在12306火车网站也一样,现在的限流不会让服务器瘫痪,相比瘫痪时xxx可以去处理其中一半的请求,这种场景在生活中经常看到,比如在上海实行的高峰时间限行,这些都是限流措施,限流措施是施剥离一些请求,并保护服务器,使服务器能够熟悉并以较低的并发,来进行正常的处理。

2Netflix Hystrix

1.Netflix 发布了 Hystrix 熔断器框架,保护系统

2.通过控制那些访问远程系统、服务和第三方库的节点

3.从而对延迟和故障提供更强大的容错能力

4.Fallback 灾备操作,出错以后返回的值

5. Hystrix 中,主要通过线程池来实现资源隔离

6. Hystrix 的信号模式(Semaphores)来隔离资源

7.Hystrix 支持 dashboard 控制面板监控信息

8. Feign 可以和 Hystrix 结合使用,也可以独立使用

9. Hystrix 使用了命令模式,对命令对象抽象了两个抽象

类似: Hystrix Command 和 Hystrix Observable Command 。

详解:

有一技术叫 HystrixHystrix 有控制面板、监控面板和采集数据,数据的采集和熔断、降级限流有关,熔断之后,便可降级,比如之前的并发有一千,现在可以降到五百,起到了限流保护的作用。这是最重要的工作之一,前提是xxx需要监控到请求数据。前期也需要衡量标准,要知道并发能达到多少,比如在并发达到一万,可以自动中断,这种措施在 Hystrix 里已经提供。

在底层 Hystrix 本身喜欢各个工作做到自动隔离工作,因为每个服务器后台的压力不一样,在订单服务里有一百台服务器,但在登录服务器时,或许只有五台,自动服务有五十台,这个差距较大,这是微服务很重要的特点,每个服务器都有差异,xxx才会搞拆分性质。

3、断路器模式

image.png

详解:

一般流动性放在代理层当中做,如果没有代理,也可以在电路中,都可以实现类似机制。

 

二、Java Spring Cloud 熔断限流实战

1、实战直接给xxx看几个 Hystrix 核心参数

1)请求最大次数

circuit Breaker. request Volume Threshold(默认值:20个请求)

(2滚动窗口

metrics .rolling Stats. time ln Milliseconds(默认值:10秒)

(3)失败百分比

circuit Breaker. error Threshold Percentage(默认值:>50%)

详解:

xxx可以基于什么策略,来进行限流,比如基于最高并发,最大并发量是五万,此时可以进行削峰;如果出错较多,可以断掉请求,再发请求便会产生更多错误,如当出错率达到百分之九十时,启动自动熔断;当调动时间超过十秒,就不再进行请求调动,因为调动链太长,对客户端没有太大意义,调动链太长,某一环节是存在一定错误的,例如数据库、检索或者是缓存检索出现问题,或者是代码出现大面积的阻止请求,都有可以出现问题,这些参数很重要。

2、接下来在昨天的项目基础上进行改变

1希望某个服务接口如果调用超时,能出现熔断;可以在以下代码中直接加入多个助解

代码如下:

// timeout In Milliseconds:设置熔断超时的时间

@HystrixCommand(fallbackMethod = "fallback Method", command Properties ={

@HystrixProperty(name = "execution .isolation. thread. timeout In Mi1liseconds", value = "2000"

})

详解:

改变熔断限流的代码,主要是模拟熔断,xxx以后可以在代理层做,熔断主要是在调用端进行操作的,xxx的调用端是没有任何熔断机制和降低措施。昨天只做了监控,现在需要添加助解的代码。

(2)模拟 fallback 降低方法

代码如下:

//微服务 Fallback 熔断降级

public String fallback Method(){

return "Spring Cloud 微服务 Fallback 熔断降级";

}

详解:

在熔断之后给客户端返回错误信息,或者是日志,有可能是返回另一个结果,告诉用户在几分钟之后再尝试,这样可以把压力往后推,体现的是统计规则,比如统计错误发生数量或接收服务器调动的时间,作为触发条件,可以给出补救措施,给出备胎 fallback 降低方法。可以是独立方法,用于给客户端返回提出信息,还可以打日志和调用一次信息。

3、模拟服务器超过两秒就被驱除

(1)服务1里加 thread sleep(3000

代码如下:

@RequestMapping( " / hello")

public string get order() throws Interrupted Exception {

Thread. sleep( 3000) ;

return "Hello Spring Cloud 1";

}

详解:

指的是休眠三秒,这样设置可以达到触发条件的要求,这样一定能触发熔断降级。一会实战中,把服务1到服务3,三台机器都启动;先启动数据中心、然后启动微服务,再启动调用端,启动一个服务是可以演示的,但是要避免只启动一个服务不能保证真理,有时调用正常。有时候调用不正常;不正常时会熔断,正常时还会返回。比如xxx有订单服务集群,其他服务返回正常,但是返回的服务1却出错。

4、模拟一个集群

(1)集群也可以在指定端口多启动,为了演示方便,此处直接复制的三个项目。在模拟监控时,需要区分是哪家服务器,启动结果是哪个,可以在三个服务器的字符串后面加上1、2、3来区别。现在打开 lo call host:8761里面查看服务是否上限,如图:

image.png

已经有两台服务器了,正常是三个服务器,三个服务器全部显示在页面,其中一号服务器是超时三秒。

(2)接下来启动调用服务,此时不再需要监控,在 lo call host:8761页面刷新等待结果,如图:

image.png

Status 已经出结果,需要经过 lo call host:9002来调用,通过 lo call host:9002/hi 调用不会触发请求,通过 lo call host:9002/test 调用才会触发,因为没有对 hi 进行熔断超时时间的设置。

通过 lo call host:9002/hi 调用结果

Spring Cloud3

通过 lo call host:9002/test 调用结果

Spring Cloud2

Spring Cloud3

Spring Cloud 微服务 Fallback 熔断降级

详解:

在调到 Spring Cloud1 时,触发到了微服务的熔断降级,触发了熔断并降级了备胎方案,这是触发了超时的熔断策略。

 

三、总结

这个过程只放了一个条件,还有几个其他条件,比如最大并发,设置的数字太大;错误比例,能达到百分之九十;控制休眠窗口,过几秒之后在恢复正常,这些都是触发条件,可以放在代码里,或者助解里面。一般使用默认条件会出问题,在正常生产条件下,每个公司的服务变化和发展是不一样的,服务器的配置也是不一样的,所以限流设置要根据业务和架构设置的目标进行灵活调整。主要的目的是为了增加可用性,xxx都希望高频发,但不是什么时候都有高频发,机器的服务器也有自己的天花板或者瓶颈,因此根据实际可以配置保护值,来保护xxx的系统。

下节课会继续讲微服务、代理、安全和机制,xxx有空时可以了解下有哪几个衡量指标和监控指标,所采用的隔离方式是什么,有空可以去看看源码,看如何实现。

相关文章
|
11月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
1081 117
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
705 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
539 0
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
525 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
10月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
Java 数据安全/隐私保护 微服务
微服务——SpringBoot使用归纳——Spring Boot中使用监听器——Spring Boot中自定义事件监听
本文介绍了在Spring Boot中实现自定义事件监听的完整流程。首先通过继承`ApplicationEvent`创建自定义事件,例如包含用户数据的`MyEvent`。接着,实现`ApplicationListener`接口构建监听器,用于捕获并处理事件。最后,在服务层通过`ApplicationContext`发布事件,触发监听器执行相应逻辑。文章结合微服务场景,展示了如何在微服务A处理完逻辑后通知微服务B,具有很强的实战意义。
831 0
|
缓存 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot中使用监听器——监听器介绍和使用
本文介绍了在Spring Boot中使用监听器的方法。首先讲解了Web监听器的概念,即通过监听特定事件(如ServletContext、HttpSession和ServletRequest的创建与销毁)实现监控和处理逻辑。接着详细说明了三种实际应用场景:1) 监听Servlet上下文对象以初始化缓存数据;2) 监听HTTP会话Session对象统计在线用户数;3) 监听客户端请求的Servlet Request对象获取访问信息。每种场景均配有代码示例,帮助开发者理解并应用监听器功能。
793 0
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
485 0
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1944 0