spring cloud断路器的原理?
2 个回答
想多了全是问题,想开了全是答案。Rose的肉丝儿### Spring Cloud 断路器的原理 在微服务架构中,多个微服务之间相互调用,例如微服务A调用微服务B和C,而微服务B和C又可能调用其他微服务,这种情况称为“扇出”。如果某个微服务的响应时间过长或不可用,就会导致占用系统资源,进而引发系统崩溃,这就是“雪崩效应”。 ### 1. Hystrix 简介 Hystrix是一个用于处理分布式系统延迟和容错的开源库。在分布式系统中,服务调用失败是无法避免的,如超时、异常等。Hystrix可以保证某个服务出现问题时,不会导致整体服务的失败,避免级联故障,提高系统弹性。 Hystrix的核心思想是“断路器”模式。当某个服务发生故障时,Hystrix会向调用方返回一个可处理的默认响应(即Fallback),而不是长时间等待或直接返回异常信息。这种机制称为“服务熔断”。 ### 2. 服务熔断和服务降级 服务熔断机制是应对雪崩效应的一种保护机制。当某个微服务不可用或响应时间过长时,会进行服务降级,快速熔断该节点微服务的调用,返回默认响应信息。当检测到该节点微服务恢复正常后,熔断器会恢复调用。 服务降级是在客户端完成的,与服务端无关。就像银行的窗口服务一样,当某个窗口暂停服务时,用户会自动去其他窗口办理业务。 ### 3. Hystrix 的使用 接下来,我们通过一个示例来展示如何使用Hystrix进行服务熔断和降级。 **3.1 依赖导入** 在项目的 `pom.xml` 文件中添加Hystrix和Eureka客户端的依赖: ```xml <dependencies> <!-- hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <!-- eureka-client客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> ``` **3.2 启动类注解** 在启动类中添加 `@EnableCircuitBreaker` 注解,启用Hystrix断路器功能: ```java @SpringBootApplication @EnableEurekaClient @MapperScan("com.itcodai.springcloud.dao") @EnableCircuitBreaker public class OrderProvider01Hystrix { public static void main(String[] args) { SpringApplication.run(OrderProvider01Hystrix.class, args); } } ``` **3.3 对接口的改动** 在Controller层的方法上使用 `@HystrixCommand` 注解,指定Fallback方法: ```java @RestController @RequestMapping("/provider/order") public class OrderProviderController { @Resource private OrderService orderService; private static final Logger LOGGER = LoggerFactory.getLogger(OrderProviderController.class); @GetMapping("/get/{id}") @HystrixCommand(fallbackMethod = "processGetOrderHystrix") public TOrder getOrder(@PathVariable Long id) { TOrder order = orderService.findById(id); if (order == null) { throw new RuntimeException("数据库没有对应的信息"); } return order; } public TOrder processGetOrderHystrix(@PathVariable Long id) { return new TOrder().setId(id) .setName("未找到该ID的结果") .setPrice(0d) .setDbSource("No this datasource"); } } ``` ### 4. 测试一下 启动Eureka集群和带有熔断机制的订单提供服务 `microservice-order-provider01-hystrix`,然后在浏览器中访问: - http://localhost:9001/consumer/order/get/100 返回结果应为: ```json { "id": 100, "name": "未找到该ID的结果", "price": 0.0, "dbSource": "No this datasource" } ``` ### 5. 优化 Hystrix 使用 为了解决在每个Controller方法上添加 `@HystrixCommand` 注解导致的代码臃肿问题,可以将Hystrix与Feign客户端绑定。这样,Hystrix处理逻辑在一个单独的类中实现。 **5.1 定义 Hystrix 处理类** 定义一个Hystrix处理类 `OrderClientServiceFallbackFactory` 实现 `FallbackFactory<OrderClientService>` 接口: ```java @Component public class OrderClientServiceFallbackFactory implements FallbackFactory<OrderClientService> { @Override public OrderClientService create(Throwable throwable) { return new OrderClientService() { @Override public TOrder getOrder(Long id) { return new TOrder().setId(id) .setName("未找到该ID的结果") .setPrice(0d) .setDbSource("No this datasource"); } @Override public List<TOrder> getAll() { return null; } }; } } ``` **5.2 给 Feign 指定 Hystrix** 在Feign接口上绑定Hystrix处理类: ```java @FeignClient(value = "MICROSERVICE-ORDER", fallbackFactory = OrderClientServiceFallbackFactory.class) public interface OrderClientService { @GetMapping("/provider/order/get/{id}") TOrder getOrder(@PathVariable(value = "id") Long id); @GetMapping("/provider/order/get/list") List<TOrder> getAll(); } ``` **5.3 开启熔断** 在 `application.yml` 文件中启用熔断: ```yaml # 开启熔断 feign: hystrix: enabled: true ``` ### 总结 通过上述步骤,我们实现了使用Hystrix对微服务进行熔断和降级处理,并将Hystrix与Feign客户端结合,实现了更优雅的熔断处理逻辑。这样,当微服务调用出现问题时,可以快速返回默认值,避免系统崩溃,提升系统的稳定性和弹性。编辑于 2024-05-26 00:47 •IP属地 北京举报评论收藏
生活就是这样,别人看到的是结果,而自己撑的是整个过程。Hobbit霍比特人### Spring Cloud断路器的原理 #### 1. Hystrix Dashboard 监控 Hystrix不仅隔离依赖服务的调用,还提供了准实时的调用监控(Hystrix Dashboard)。Hystrix会持续记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求,有多少成功或者失败等。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。 #### 2. 如何监控?实际落地操作 我们新建一个工程:`microservice-order-consumer-hystrix-dashboard`,用来完成可视化监控。端口号设置为9002。 **2.1 导入监控相关的依赖** 首先要导入dashboard的依赖: ```xml <dependencies> <!-- hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> </dependencies> ``` **2.2 添加启动注解** 在启动类中,需要添加`@EnableHystrixDashboard`注解。 ```java @SpringBootApplication @EnableHystrixDashboard public class OrderConsumerHystrixDashboard { public static void main(String[] args) { SpringApplication.run(OrderConsumerHystrixDashboard.class, args); } } ``` **2.3 服务提供方需要添加监控依赖** 在服务提供方,也需要添加一个Spring Boot监控依赖: ```xml <!-- spring boot actuator 监控信息 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` **2.4 测试一下** 启动新建的监控项目,在浏览器中输入:http://localhost:9002/hystrix,如果出现豪猪图案,说明dashboard配置成功。  ### 3. 如何监控其他服务 接下来,监控其他服务。我们以带有Hystrix的订单服务为例(端口号为8001)。如果要实现被监控,需要在被监控的服务上做一些准备。 **3.1 依赖导入** 在订单服务上添加Hystrix依赖: ```xml <!-- hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> ``` **3.2 启动类注解** 在启动类上添加注解:`@EnableCircuitBreaker` ```java @SpringBootApplication @EnableEurekaClient @MapperScan("com.itcodai.springcloud.dao") @EnableCircuitBreaker public class OrderProvider01 { public static void main(String[] args) { SpringApplication.run(OrderProvider01.class, args); } } ``` **3.3 application.yml 配置文件** 在配置文件中开启指标流端点: ```yaml # 配置hystrix dashboard的url访问 # 开启指标流端点 management: endpoints: web: exposure: include: hystrix.stream ``` **3.4 测试一下** 启动eureka集群,然后启动带有Hystrix的订单服务,确保订单服务正常工作。在浏览器里输入http://localhost:8001/provider/order/get/1可以获取订单服务信息。 然后打开http://localhost:9002/hystrix,输入http://localhost:8001/actuator/hystrix.stream,设置delay为2000(2秒),Title可以自定义。打开后即可在可视化页面监控8001端口的接口调用信息。调用以下两个接口: - http://localhost:8001/provider/order/get/1 - http://localhost:8001/provider/order/get/list 多次刷新后,可以看到可视化界面的信息,如下:  从监控仪表盘中可以清楚地看到服务被调用的状态。 **注意:** Hystrix Dashboard面板正常显示,所监控的接口方法上必须要有`@HystrixCommand`注解,否则会一直显示Loading。编辑于 2024-03-18 04:37 •IP属地 北京举报评论收藏1
公众号进入网站体验更佳

