概述
断路器是一种处理分布式系统故障的重要工具,可以增强系统的容错能力。在SpringCloud中,Hystrix是一种非常流行的断路器实现。同时,Hystrix Dashboard也提供了对Hystrix断路器进行监控的工具。
Hystrix断路器
什么是Hystrix断路器?
Hystrix是Netflix开源的一款用于处理分布式系统的失败,实现断路器的工具。在分布式系统中,许多服务相互依赖,因此一个服务的问题可能会引起联级故障,影响整个系统的可用性。Hystrix通过隔离服务之间的依赖关系、降级机制、熔断机制和实时监控来增强服务的稳定性和容错能力。
Hystrix断路器的使用
在SpringCloud应用中使用Hystrix断路器非常简单,只需要在依赖的服务上添加@EnableHystrix
注解,并在需要熔断的方法上添加@HystrixCommand
注解即可。
@Service
public class UserService {
@HystrixCommand(fallbackMethod = "findByIdFallback")
public User findById(Long id) {
// 查询用户信息
}
public User findByIdFallback(Long id) {
return new User(id, "Default User");
}
}
在上例中,findByid
方法是需要进行熔断保护的方法,在方法上添加了@HystrixCommand
注解,并指定了对应的降级方法findByIdFallback
。当findById
的访问失败时,就会调用findByIdFallback
方法返回自定义的默认值。
Hystrix断路器的配置
对于Hystrix断路器的配置,可以在application.yml
中进行配置,如下所示:
hystrix:
command:
default:
execution.isolation.thread.timeoutInMilliseconds: 5000 # 超时时间
execution.isolation.strategy: SEMAPHORE # 线程隔离策略,默认为THREAD
circuitBreaker.requestVolumeThreshold: 20 # 请求总数阈值
circuitBreaker.errorThresholdPercentage: 50 # 错误百分比阈值
circuitBreaker.sleepWindowInMilliseconds: 5000 # 短路器休眠时间
Hystrix Dashboard
什么是Hystrix Dashboard?
Hystrix Dashboard是一个监控Hystrix断路器的可视化工具,可以实时监控断路器的请求和熔断的情况,为开发者提供有价值的运维数据。Hystrix Dashboard的基本原理是根据Hystrix Stream中的数据进行可视化展示。
Hystrix Dashboard的使用
在SpringCloud应用中使用Hystrix Dashboard也非常简单,只需要在依赖的服务上添加@EnableHystrixDashboard
注解并在应用启动后访问http://<ip>:<port>/hystrix
即可进入Hystrix Dashboard首页。
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class, args);
}
}
在Dashboard首页输入需要监控的服务地址(通常是Hystrix Stream的地址),如http://localhost:8080/actuator/hystrix.stream
,然后点击“Monitor Stream”按钮,就可以开启监控了。
示例说明
下面通过一个简单的示例来说明Hystrix断路器和Dashboard的使用。
假设有两个服务,一个用户服务和一个订单服务。订单服务需要调用用户服务获取用户信息。为了增强服务的稳定性和容错能力,需要对订单服务的调用进行熔断保护。代码实现如下:
@RestController
public class OrderController {
@Autowired
private UserService userService;
@GetMapping("/order/{id}")
@HystrixCommand(fallbackMethod = "findByIdFallback")
public User findById(@PathVariable Long id) {
return userService.findById(id);
}
public User findByIdFallback(Long id) {
return new User(id, "Default User");
}
}
@Service
public class UserService {
public User findById(Long id) {
// 查询用户信息
}
}
这里通过在findById
方法上添加了@HystrixCommand
注解,并指定了与之对应的降级方法findByIdFallback
。当findById
的访问失败时,就会调用findByIdFallback
方法返回自定义的默认值。
然后在订单服务中添加一个Hystrix Stream的endpoint:
@SpringBootApplication
@EnableHystrixDashboard
@EnableCircuitBreaker
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
@Bean
public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean<HystrixMetricsStreamServlet> registrationBean = new ServletRegistrationBean<>(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
并在UserService中添加一个手动抛出异常的接口:
@RestController
public class UserController {
@GetMapping("/user")
public User findById(Long id) {
throw new RuntimeException("用户查询失败");
}
}
启动应用后,访问http://localhost:8080/order/1
可以正常返回用户信息。再访问http://localhost:8080/order/0
会触发熔断保护,返回自定义的默认值。最后访问http://localhost:8080/actuator/hystrix.stream
可以看到断路器的监控信息。
在此基础上,我们可以添加Hystrix Dashboard的依赖,修改代码并启动Dashboard,来实现断路器的可视化监控。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringCloud中的断路器(Hystrix)和断路器监控(Dashboard) - Python技术站