SpringCloud Hystrix
1.简介
所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢?当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示,而这个时候如果不想出现这样的错误信息,而希望替换为一个错误时的内容。
本文只做简单的介绍,之前在看简书的时候也看到了一篇写的非常详细的文章,有兴趣的话大家可以看看。
2.配置
Maven
引入spring-cloud-starter-netflix-hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
开启Hystrix
添加@EnableCircuitBreaker
注解来开启Hystrix,当然你可以直接添加@SpringCloudApplication
注解,@SpringCloudApplication
包含@SpringBootApplication
,@EnableDiscoveryClient
,@EnableCircuitBreaker
。
@SpringCloudApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
对方法添加Hystrix
@DefaultProperties(defaultFallback = "defaultFallback")
:设定默认降级方法
@HystrixCommand(fallbackMethod = "fallback")
:设定某个方法的降级方法
其中注解中的@HystrixProperty
中的参数可以在HystrixCommandProperties
类中去查找,关于其属性的含义可以参考官方文档。
在下面示例代码中我们配合了远程调用,实际上一切符合熔断条件的情境我们都可以使用Hystrix。
@DefaultProperties(defaultFallback = "defaultFallback")
@RestController
public class HystrixController {
@GetMapping("/getProductInfoList")
@HystrixCommand(fallbackMethod = "fallback",commandProperties =
{
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String getProductInfoList()
{
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForObject("http://127.0.0.1:8003/product/listForOrder",
Arrays.asList("123") ,
String.class);
}
private String fallback()
{
return "太拥挤了,请稍后再试";
}
private String defaultFallback()
{
return "默认太拥挤了,请稍后再试";
}
}
这样就可以使用Hytrix为我们带来熔断功能了。
3.在Feign中使用Hytrix
Maven
由于在Feign包中已经包含了Hystrix,所以我们不用重新引用Hystrix。
配置文件
开启Hystrix功能,此处注意是enabled!
feign:
hystrix:
enabled: true
配置Hystrix参数
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
代码配置
在FeignClient类的注解上添加fallback并指定所需要降级的类,这个类实现FeignClient的接口即可。在以Jar的方式引用FeignClient的时候需要在配置类上添加@ComponentScan
来扫描
/**
* @author BaoZhou
* @date 2018/8/29
*/
@FeignClient(name = "PRODUCT",fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {
/**
* 获取指定ID对应的商品
* @param productIdList
* @return
*/
@PostMapping("/product/listForOrder")
List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);
/**
* 减库存
* @param decreaseStockInputs
*/
@PostMapping("/product/decreaseStock")
void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputs);
static class ProductClientFallback implements ProductClient{
@Override
public List<ProductInfoOutput> listForOrder(List<String> productIdList) {
return null;
}
@Override
public void decreaseStock(List<DecreaseStockInput> decreaseStockInputs) {
}
}
}
至此我们就配置完毕了。
4.Hystrix DashBoard
Hystrix DashBoard是一款监控Hystrix 情况的组件
Maven
引入spring-cloud-starter-hystrix-dashboard
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
开启Hystrix DashBoard
添加@EnableHystrixDashboard
注解
@ComponentScan(basePackages = {"com.bzcoder.product.client"})
@ComponentScan(basePackages={"com.bzcoder.order.controller"})
@EnableFeignClients(basePackages = {"com.bzcoder.product.client"})
@SpringCloudApplication
@EnableHystrixDashboard
@EnableSwagger2
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
访问Hystrix DashBoard
访问服务地址+hystrix即可访问,例如:http://localhost:8002/hystrix,按照首页的要求填写参数,即可进入监控界面
这个页面能够可视化的查看熔断状态,请求状态。
Hystrix DashBoard详情页面
那么有关于SpringCloud Hystrix的简单介绍就到这里了。