微服务架构中的断路器模式源于一文源于的
在微服务架构中,我们将系统划分为服务单元,每个单元通过服务注册和订阅相互依赖。由于各个单元运行在不同的进程中,并且依赖是通过远程调用来执行的,因此可能会因为网络原因或者依赖服务本身的问题而导致调用失败或延迟,而这些问题会直接导致调用者的外部服务。也有延迟。如果此时调用方的请求继续增加,最终会因为等待故障依赖方的响应而导致任务积压,最终导致自身服务瘫痪。
例如,在一个电子商务网站中abb框架断路器订货规范,我们可能会将系统拆分为用户、订单、库存、积分、评论等一系列服务单元。当用户创建订单时,调用订单服务创建订单时,会请求库存服务发货(判断是否有足够的库存发货)。此时,如果由于网络原因无法访问库存服务,则订单创建服务的线程进入,等待库存应用服务的响应。等待很长一段时间后,用户会因为请求库存失败而得到订单创建失败的结果。在高并发的情况下,因为这些等待的线程在等待库存服务的响应而无法释放,所以后续创建订单的请求会被阻塞,
在微服务架构中,有这么多的服务单元。如果一个单元发生故障,故障会因依赖而蔓延,最终导致整个系统瘫痪。这种架构比传统架构更不稳定。为了解决这些问题,创建了 断路器 模式。
什么是 断路器
断路器模式起源的文章。“断路器”本身就是一个开关器件,用来保护电路不过载。当线路出现电气短路时,“断路器”能及时切断故障电路,防止出现过载、发热甚至火灾等严重后果。
在分布式架构中,断路器 模式的作用是类似的。当服务单元发生故障(类似于电器短路)时,断路器 的故障监控(类似于熔断保险丝)会向调用方返回错误响应,而不是长时间等待。这样就不会因为调用故障服务而导致线程长时间被占用而不被释放abb框架断路器订货规范,避免了故障在分布式系统中的蔓延。
用于实现断路器的功能。它是开源微服务框架套件之一,旨在通过控制那些访问远程系统、服务和第三方库的节点来为延迟和故障提供更大的容错能力。它具有带回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置功能。
让我们看看如何使用它。
准备
在开始加入断路器之前,我们会使用之前搭建的两个微服务作为基础进行如下操作,主要使用以下项目:
-1-2
如果没有使用经验,可以先阅读《服务注册与发现》和《服务消费者》,对搭建的微服务有一个初步的了解。
介绍于
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat Jun 25 21:16:59 CST 2016
There was an unexpected error (type=Internal Server Error, status=500).
I/O error on GET request for "http://COMPUTE-SERVICE/add?a=10&b=20": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
dependency>
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class RibbonApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}
@Service
public class ComputeService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "addServiceFallback")
public String addService() {
return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
}
public String addServiceFallback() {
return "error";
}
}
@RestController
public class ConsumerController {
@Autowired
private ComputeService computeService;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String add() {
return computeService.addService();
}
}
有关使用的更多信息,请参阅如何使用
利用
注意这里说的是“使用”,没有错,项目中不需要引入,已经依赖了,我们可以在做任何修改之前先试试下面的操作:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat Jun 25 22:10:05 CST 2016
There was an unexpected error (type=Internal Server Error, status=500).
add timed-out and no fallback available.
如果你足够细心,你会发现和报的错误不一样,看到语句add -out and no,也许你已经猜到了什么,看看我们的控制台,可以看到报错信息来自-core -1.5 .2.jar,所以在这个项目中,我们需要学习的是如何使用集成。
@FeignClient(value = "compute-service", fallback = ComputeClientHystrix.class)
public interface ComputeClient {
@RequestMapping(method = RequestMethod.GET, value = "/add")
Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
}
@Component
public class ComputeClientHystrix implements ComputeClient {
@Override
public Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b) {
return -9999;
}
}
有关如何使用它的更多信息,请参阅:
完整示例:-1-3
过去的文章
本文由程序员DD-翟永超创作,CC BY 3.0 CN协议授权。可自由转载和引用,但须署名作者并注明文章出处。如需转载至江苏人民公众号,请在文末添加作者公众号二维码。