1、什么是Hystrix
在一个分布式系统中,必然会有部分系统的调用会失败。所以就产生了Hystrix。Hystrix是一个 通过添加超时容错和失败容错逻辑来帮助你控制这些分布式系统的交互。Hystrix通过隔离服务之间的访问,阻止他们之间的级联故障以及提供后背选项来实现这些,所有新而这些都用来提高系统的整体弹性。
如不会搭建springcloud项目的可以参考我的博客:https://editor.csdn.net/md/?articleId=105577097
实现一个容错机制很简单
在消费者项目中创建一个新的类实现service接口:
package com.jbit.service;
import com.jbit.entity.Order;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class OrderFallback implements OrderService {
@Override
public List<Order> selectAll() {
System.out.println("服务异常,稍后重试");
return null;
}
}
这个方法里面自定义错误的处理方式
service类:
package com.jbit.service;
import com.jbit.entity.Order;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@FeignClient(name="provoider",fallback = OrderFallback.class)
public interface OrderService {
@RequestMapping(value = "selectAll")
List<Order> selectAll();
}
这里的fallback属性的值就是你刚刚新建的实现service的类
提供者中的service实现类:
package com.jbit.service.impl;
import com.jbit.dao.OrderDao;
import com.jbit.entity.Order;
import com.jbit.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service
@RestController
public class OrderServiceImpl implements OrderService {
@RequestMapping(value = "selectAll")
@Override
public List<Order> selectAll() {
int a=1/0;
return orderDao.selectAll();
}
定义一个异常,等程序启动时测试
application.yml文件除之前博客中的属性外需额外添加一个:
feign:
hystrix:
enabled: true
消费者的controller:
package com.jbit.controller;
import com.jbit.entity.Order;
import com.jbit.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("selectAll")
public List<Order> selectAll(){
return orderService.selectAll();
}
}
依次启动三个项目---->测试结果如图