SpringCloudAlibaba中Sentinel如何实现微服务容错机制?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1733个文字,预计阅读时间需要7分钟。
4.1 高并发带来的挑战:在微服务架构中,我们将业务成独立的服务单元,服务间可互相调用。但受限于网络原因或自身因素,服务可用性无法保证100%,单个服务出现问题时,会影响整体稳定性。
4.1 高并发带来的问题在微服务中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
接下来我们模拟一个高并发的场景
-
编写java代码
@RestController @Slf4j public calss OrderController2{ @Autowired private OrderService orderSerivce; @Autowired private ProductService productService; @RequestMapping("/order/prod/{pid}") public Order order(@Pathvariable("pid") Integer pid){ Product product = productService.findByPid(pid); Try{ Thread.sleep(100) }catch(InterruptedException e){ e.printStackTrace(); } Order order = new Order(); order.setUid(1); order.setUsername("测试账号"); order.setPid(pid); order.setPname(product.getPname()); order.setPprice(product.getPprice()); order.setNumber(1); return order; } @RequestMapping("/order/message") public String message(){ return "高并发下的问题测试"; } } -
配置tocmat 并发数
server: port:8091 tomcat: max-threads: 10 -
接下来使用压测工具,对请求进行压测
下载地址:jmeter.apache.org
第一步:修改配置,并启动软件
进入bin目录,修改jmeter.properties 文件中的语言支持为language=zh_CN,然后县级jmeter.bat 启动软件。
第二步:添加线程组
第三步:配置线程并发数
第四步:添加github.com/alibaba.Sentinel/releases
-
启动控制台
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-xxx.jar -
修改shop-order,在里面加入有关控制台的配置
spring: cloud: sentinel: transport: port: 9999 dashboard: localhost:8080 -
通过浏览器访问localhost:8080 进入控制台(默认用户名密码是:sentinel/sentinel)
-
补充:
Sentinel的控制台其实就是一个Soringboot编写的程序。我们需要将我们的微服务程序注册到控制台上,即在微服务中指定控制台的地址,并且还要开一个跟控台传递数据的端口,控制台也可以通过次端口调用微服务中的监控程序获取微服务的各种信息。
- 通过控制台为message1添加一个流控规则
- 通过控制台快速频繁访问,观察效果
-
资源
资源就是Sentinel要保护的东西,资源是Sentinel的关键概念。它可以是java应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至是一段代码。
我们入门案例中的message1方法就可以认为是一个资源
-
规则
规则就是用来定义如何进行保护资源的,作用在资源之上,定义以什么样的方式保护资源,主要包括里流量控制规则,熔断降级规则以及系统保护规则。
我们入门案例中就是message1资源设置了一种流控规则,限制了进入message1的流量。
Sentinel的主要功能就是容错,主要体现为一下3个方面:
-
流量控制
流量控制在网络传输中是有一个常用的概念, 它用于调整网络包的数据,任意时间来到请求往往是随机不可控的,而系统的处理能力是有限的的,我们需要根据系统的处理能力对流量进行控制,Sentinel作为一个调配器,可以根据需要把随机的请求调整为合适的形状。
-
熔断降级
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或者比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联故障
Sentinel对这个问题采取了两种手段
-
通过并发线程数进行控制
Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其他资源的影响,当某个资源出现不稳定的情况下,例如响应时间过长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接受请求。
-
通过响应谁极爱你对资源进行降级
除了对并发线程进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源,当依赖对资源出现响应时间过长后,所有对改资源的访问都会被直接拒绝,知道过了指定的时间窗口之后才重新恢复。
Sentinel 和 Hystrix 的区别
两者的原则是一直的,都是当一个资源出现问题时,让其快速失败,不要波及到其他服务,但是限制的手段上,却采用了完全不一样的方法
- Hystrix 采用的是线程池隔离的方法,优点是做到了资源之间的隔离,缺点是增加了线程切换的成本
- Sentinel采用的是通过并发线程的数量和响应时间来对资源做限制
-
系统负载保护
Sentinel同事提供了系统维度的自适应保护能力,当系统负载较高的时候,如果还持续让请求进入可能会导致系统奔溃,无法响应。在集群环境下,会把本应该这台机器承载的流量转发到其他的机器上去,如果这个时候其他的机器出在一个边缘状态的时候,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求
总之一句话:我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。
本文共计1733个文字,预计阅读时间需要7分钟。
4.1 高并发带来的挑战:在微服务架构中,我们将业务成独立的服务单元,服务间可互相调用。但受限于网络原因或自身因素,服务可用性无法保证100%,单个服务出现问题时,会影响整体稳定性。
4.1 高并发带来的问题在微服务中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
接下来我们模拟一个高并发的场景
-
编写java代码
@RestController @Slf4j public calss OrderController2{ @Autowired private OrderService orderSerivce; @Autowired private ProductService productService; @RequestMapping("/order/prod/{pid}") public Order order(@Pathvariable("pid") Integer pid){ Product product = productService.findByPid(pid); Try{ Thread.sleep(100) }catch(InterruptedException e){ e.printStackTrace(); } Order order = new Order(); order.setUid(1); order.setUsername("测试账号"); order.setPid(pid); order.setPname(product.getPname()); order.setPprice(product.getPprice()); order.setNumber(1); return order; } @RequestMapping("/order/message") public String message(){ return "高并发下的问题测试"; } } -
配置tocmat 并发数
server: port:8091 tomcat: max-threads: 10 -
接下来使用压测工具,对请求进行压测
下载地址:jmeter.apache.org
第一步:修改配置,并启动软件
进入bin目录,修改jmeter.properties 文件中的语言支持为language=zh_CN,然后县级jmeter.bat 启动软件。
第二步:添加线程组
第三步:配置线程并发数
第四步:添加github.com/alibaba.Sentinel/releases
-
启动控制台
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-xxx.jar -
修改shop-order,在里面加入有关控制台的配置
spring: cloud: sentinel: transport: port: 9999 dashboard: localhost:8080 -
通过浏览器访问localhost:8080 进入控制台(默认用户名密码是:sentinel/sentinel)
-
补充:
Sentinel的控制台其实就是一个Soringboot编写的程序。我们需要将我们的微服务程序注册到控制台上,即在微服务中指定控制台的地址,并且还要开一个跟控台传递数据的端口,控制台也可以通过次端口调用微服务中的监控程序获取微服务的各种信息。
- 通过控制台为message1添加一个流控规则
- 通过控制台快速频繁访问,观察效果
-
资源
资源就是Sentinel要保护的东西,资源是Sentinel的关键概念。它可以是java应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至是一段代码。
我们入门案例中的message1方法就可以认为是一个资源
-
规则
规则就是用来定义如何进行保护资源的,作用在资源之上,定义以什么样的方式保护资源,主要包括里流量控制规则,熔断降级规则以及系统保护规则。
我们入门案例中就是message1资源设置了一种流控规则,限制了进入message1的流量。
Sentinel的主要功能就是容错,主要体现为一下3个方面:
-
流量控制
流量控制在网络传输中是有一个常用的概念, 它用于调整网络包的数据,任意时间来到请求往往是随机不可控的,而系统的处理能力是有限的的,我们需要根据系统的处理能力对流量进行控制,Sentinel作为一个调配器,可以根据需要把随机的请求调整为合适的形状。
-
熔断降级
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或者比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联故障
Sentinel对这个问题采取了两种手段
-
通过并发线程数进行控制
Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其他资源的影响,当某个资源出现不稳定的情况下,例如响应时间过长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接受请求。
-
通过响应谁极爱你对资源进行降级
除了对并发线程进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源,当依赖对资源出现响应时间过长后,所有对改资源的访问都会被直接拒绝,知道过了指定的时间窗口之后才重新恢复。
Sentinel 和 Hystrix 的区别
两者的原则是一直的,都是当一个资源出现问题时,让其快速失败,不要波及到其他服务,但是限制的手段上,却采用了完全不一样的方法
- Hystrix 采用的是线程池隔离的方法,优点是做到了资源之间的隔离,缺点是增加了线程切换的成本
- Sentinel采用的是通过并发线程的数量和响应时间来对资源做限制
-
系统负载保护
Sentinel同事提供了系统维度的自适应保护能力,当系统负载较高的时候,如果还持续让请求进入可能会导致系统奔溃,无法响应。在集群环境下,会把本应该这台机器承载的流量转发到其他的机器上去,如果这个时候其他的机器出在一个边缘状态的时候,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求
总之一句话:我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。

