spring cloud熔断器是分布式的断路器,其实都是一个意思。
为何使用熔断器?
在分布式中,我们将根据业务或功能将项目分为多个服务单元,通过服务注册和订阅相互依赖和呼叫功能,随着项目和业务的不断扩大,服务单元数量逐渐增加,相互依赖越来越复杂,此时,可能是服务单元问题或网络原因依赖呼叫错误或延迟,如果呼叫依赖要求增加,如果后续的连锁反应越来越多,需要调用服务的服务将会等待或出现故障,Servlet消耗了容器的线程资源,导致服务瘫痪。对服务的依赖会导致服务之间的故障传播,从而迎来雪崩效应。服务与服务的依赖会导致服务之间的故障传播,导致雪崩效应。为了解决每个点或多个点的故障,保险丝出现了。
熔断器是什么?
熔断器相当于电路中的保险丝和保护器。它可以实现快速失败。如果它在一定时间内发现许多类似的错误,它将不再访问远程服务器,将迫使未来的访问快速失败,以防止服务继续尝试执行可能失败的操作。它将使服务继续执行,而无需等待纠正错误或浪费CPU长时间等待加班,从而进入回路方法。熔断器还可以使服务能够诊断错误是否已经修正,如果已经修正,服务将再次尝试调用。
1.依靠调用服务方加入熔断器jar包:
// https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix'
2.在Controller中:
@Controller
//@EnableWebSecurity 安全检查controller还要继承extends WebSecurityConfigurerAdapter
public class PageController {
public static Logger logger=LoggerFactory.getLogger(PageController.class);
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "toIndex1")///断路器进入回路的方法
@RequestMapping("/toIndex1")
public String toIndex(Model model){
System.out.println("进入toIndex");
logger.info("执行调用");
String msg=restTemplate.getForEntity("http://project-solr/SolrSearch",String.class).getBody();//project-solr在注册中心调用名称
logger.info("调用结束");
model.addAttribute("msg",msg);
return "index";
}
public String toIndex1(Model model){
System.out.println("进入回路法");
model.addAttribute("msg","服务不可用,请稍后重试");
return "index";
}
}
注:服务于调用方Controller添加方法@HystrixCommand(fallbackMethod = "回路方法")
在这里,我让回路方法调用toIndex1.注意回路方法的返回值,参数应与原方法一致
故障发生在被调用方法中:
3.注意调用方的启动类@EnableCircuitBreaker启动熔断器
启动:
可以看到进入回路的方法
当然,调用方也可以配置:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 #请求响应时间 如果过了这段时间,就会进入回路方法
circuitBreaker:
requestVolumeThreshold: 2 # 服务降级:这个请求反应过慢或崩溃多少次 系统默认将其视为崩溃的方法 在一定时间内调用此方法将直接进入回路 这样执行得更快 默认值是20 请求这种方法20次 如果崩溃或反应过慢,超过80% 默认是一种崩溃方法
#timeout:
#enabled: false #取消超时检查 不管线程运行多久 只要不崩溃,就不会进入回路 一般不使用
配置后操作:
操作几次后,发现前两次会访问并等待相应的结果,然后直接回应结果进入回路方法
当然,这是基于配置:
spring cloud熔断器到此为止,想知道spring cloud其他内容,请浏览我以前的博客
以上是本文的全部内容,希望对大家的学习有所帮助,也希望大家多支持脚本之家。