摘自:蚂蚁课堂学习视频:http://www.mayikt.com/course/video/2392
一、微服务高可用技术
大型复杂的分布式系统中,高可用相关的技术架构非常重要。它中有一个非常重要的环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而以应对分布式系统环境中的各种各样的问题,避免整个分布式系统被某个服务的故障给拖垮。
比如:服务间的调用超时、服务间的调用失败。解决这些问题就涉及到高可用分布式系统中的很多重要的技术,
包括:
资源隔离、限流与过载保护、熔断、优雅降级、容错、超时控制、监控运维等。
二、服务降级、熔断、限流
1、服务降级
在高并发情况下,防止用户一致等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallback方法)。如果调用其他接口超时的时候(默认是1秒时间),即在1秒中没有及时响应时,默认情况下,业务逻辑是可以执行的,但代码会直接执行服务降级的方法返回结果。
2、服务熔断
熔断机制目的是为了保护服务在高并发的情况下,如果请求达到一定极限(可以自己设置阈值),如果流量超出了设置阈值,然后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用。
3、服务隔离
因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat线程池默认极限,可能会导致其他服务无法访问。
解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量)。
(1)线程池方式实现隔离的原理:
相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应。每 个服务接口都有自己独立的线程池,每个线程池互不影响。缺点:CPU占用率非常高。
(2)信号量隔离:
使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时,先判断计数器的数值,若超过设 置的最大线程个数则拒绝该请求,若不超时则通行,这时候计数器+1,请求返回成功后,计数器-1.
4、Hystrix简单介绍
Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。它具有自我保护的能力,它是通过如下机制解决雪崩效应问题。
在微服务架构中,我们把每个业务都拆分成单个服务模块,然后当有业务需求的时候,服务间可相互调用,但是,由于网络原因或其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,其他服务如果继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应导致整个系统宕掉,因此,就提出了用断路器来解决这一问题。
(1)资源隔离:
包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务的调用。
(2)降级机制:
超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
(3)熔断:
当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
(4)缓存:提供了请求缓存、请求合并实现。
5、Hystrix有两种方式配置保护服务,通过注解和接口形式
(1)注解形式:
@HystrixCommand(fallbackMethod=“方法名”) :fallbackMethod方法的作用:服务降级执行。
@HystrixCommand默认开启线程池隔离方式,默认开启服务降级执行方法、默认开启服务熔断机制。
相关配置如下:
(1)pom.xml添加依赖:
<!-- hystrix断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)application.properties添加配置:
##开启hystrix断路器
feign.hystrix.enabled=true
##hystrix禁止服务超时时间
hystrix.command.default.execution.timeout.enabled=false