OrderAddClient.java @FeignClient(value = "order-add",fallback = OrderAddClientFallBack.class) public interface OrderAddClient { //对于post请求 默认发送body参数 一个方法只能有一个body参数 @PostMapping("order/add") public ResultVO addOrder(Order order, @RequestParam("str")String str); //虽然这里是用get方法 但是如果没有加RequestParam,会人为orderId是以请求体的方式传参,get方法会被强转了post方法传参 @GetMapping("order/get") public Order getOrder(@RequestParam("orderId") String orderId); }
OrderAddClientFallBack.java
@Component public class OrderAddClientFallBack implements OrderAddClient { @Override public ResultVO addOrder(Order order, String str) { System.out.println("addorder的降级"); return ResultVO.success("addorder的降级",null); } @Override public Order getOrder(String orderId) { System.out.println("getorder的降级"); return new Order(); } }
@Service public class OrderAddServiceImpl implements OrderAddService { @Autowired private OrderAddClient orderAddClient; @Override public ResultVO saveOrder(Order order) { ResultVO resultVO = orderAddClient.addOrder(order,"测试数据"); Order id = orderAddClient.getOrder("测试id"); return resultVO; } }
引入依赖(这里其实应该放在前面的步骤才合理。即先引入依赖 才能用后面的各种标签)
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-hystrix
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableHystrix //启动类必须加的启动标签 public class ApiOrderAddApplication { public static void main(String[] args) { SpringApplication.run(ApiOrderAddApplication.class, args); } }
yml文件!!!重点就是这里了!!一开始一直用的旧版本的启动方式 导致一直报java.net.SocketTimeoutException: Read timed out
也没有其他资料记录了这个问题 真的花了整整一天时间踩的坑!!!!!
feign:
circuitbreaker:
enabled: true
# 注意:feign的fallback, ↑ 新版用这种方式开启。↓ 旧版用这个
# hystrix:
# enabled: true
feign: circuitbreaker: enabled: true
client: config: default: ConnectTimeOut: 1000 ReadTimeOut: 5000
//ConnectTimeOut 指的是建立连接所用的时间不能超过这个时间,否则熔断
//ReadTimeOut 指的是程序执行过程所用的时间不能超过这个时间,否则熔断
//可以用
try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }
的方式进行测试~
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 8000