1、雪崩效应
java
如上图可见,A服务做为基础服务,当他挂掉以后,致使级联故障,BCD都挂掉,致使雪崩效应。spring
2、如何容错app
方法一:设置超时
ide
一般状况下一次远程链接就对应这一个线程或者进程,若是响应太慢,这个线程或者进程得不到释放,资源就会逐渐消耗致使服务不可用。此时设置超时,让资源尽快释放。this
方法二:使用断路器模式线程
在设置超时的状况下,若是对某个服务已经不可用时,全部新的请求都须要等待设置的超时时间,但此时这些等待时间已经毫无心义。
rest
断路器应该事先快速失败,若是在一段时间检测到许多相似的错误,就会对该服务快速失败,中止请求已停掉的服务。断路器也应该能够自动诊断依赖的服务是否已经恢复正常。blog
断路器逻辑:进程
一、正常状况下,断路器关闭,可正常访问;资源
二、在一段时间内请求失败率达到阈值,断路器打开;
三、打开后进入“半开”状态。此时可容许一个请求访问依赖的服务,若成功则关闭断路器,若失败则继续保持打开状态。
3、使用Hystrix实现容错
Hystrix:是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败。
实现方式:
包裹请求
跳闸机制:当服务错误率达到必定阈值时,自动跳闸或者手动跳闸
资源隔离:Hystrix为每一个依赖都维护了一个小型的线程池,当线程池已满,会当即拒绝该依赖的请求,加速失败断定。
监控
回退机制:发生错误时,执行回退机制,相似缺省值;
自我修复:断路器打开后的自动恢复机制
整合Hystrix
一、为movie添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.3.RELEASE</version> </dependency>
二、在启动类上加上以下注解:
@EnableHystrix
三、修改controller:
@RequestMapping(value = "/movie/findById", method = RequestMethod.GET) @HystrixCommand(fallbackMethod = "findByIdFallback") public Map findById(Integer userId) { log.info("/movie/findById被访问,参数:userId=" + userId); //使用端口调用 /*ResponseEntity<HashMap> forEntity = this.restTemplate.getForEntity(findByUserIdUrl + userId, HashMap.class);*/ //使用Eureka+ribbon return this.restTemplate.getForObject("http://user/user/getUserInfo?userId=" + userId, HashMap.class); } public Map<String, String> findByIdFallback(Integer userId){ Map<String, String> user = new HashMap<>(3); user.put("name","默认用户"); user.put("id","-1"); user.put("age","18"); return user; }
启动注册中心和【movie】服务,不启动【user】,访问 /movie/findById?userId=1
响应为缺省值。