Feign远程调用fallback回调失败,无效果
1.fallback
1.1 fallback介绍
- fallback 是用来为 Feign 远程调用失败的时候设置的回调方法,如果调用远程微服务失败,就会调用并返回服务消费端默认保留的 fallback 回调方法的内容
1.2 fallback用法
首先需要在服务消费端编写和服务提供端提供的服务相同的接口,有点类似于 Dubbo
- 这是服务提供者的controller方法
/**
* @author 云梦归遥
* @date 2022/6/22 10:13
* @description
*/
@RestController
@RequestMapping("/products")
public class ProductsController {
@Autowired
private ProductDao productDao;
@RequestMapping("/all")
public List<Products> findAll() {
List<Products> productsList = productDao.selectList(null);
return productsList;
}
@RequestMapping("/{id}")
public Products findById(@PathVariable("id") Integer id) {
Products products = productDao.selectById(id);
return products;
}
// 注入配置文件中的 IP 和 Port
@Value("${server.port}")
private String port;
@Value("${spring.cloud.client.ip-address}")
private String address;
// 通过 Ribbon 负载均衡来验证是否实现负载均衡
@RequestMapping("/info")
public String getServerInfo(){
try {
Thread.sleep(5000);
} catch (Exception e){
System.out.println("/info 方法出现异常");
}
return address + ":" + port;
}
}
- 这是服务消费端编写的接口
public interface PageFeign {
@RequestMapping("/products/all")
public List<Products> findAll();
@RequestMapping("/products/{id}")
public Products findById(@PathVariable("id") Integer id);
@RequestMapping("/products/info")
public String getServerInfo();
}
- 我们需要在服务消费端的接口上添加注解,name 对应的是服务提供者微服务的名称
@FeignClient(name = "ProductDemo")
- 然后我们编写接口的实现类
package com.lagou.controller;
import com.lagou.entity.Products;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author 云梦归遥
* @date 2022/6/25 10:05
* @description
*/
@Component // 交给 Spring 进行管理
public class PageFallback implements PageFeign {
@Override
public List<Products> findAll() {
return null;
}
@Override
public Products findById(Integer id) {
return null;
}
@Override
public String getServerInfo() {
return "/page/info 接口Feign远程调用响应超时,自动开启回退";
}
}
- 此时我们的 fallback 回调类和对应的回调方法已经编写完成,需要再次修改我们的接口上的注解,完整的接口代码如下
package com.lagou.controller;
import com.lagou.entity.Products;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
* @author 云梦归遥
* @date 2022/6/25 9:56
* @description
*/
@Repository
@FeignClient(name = "ProductDemo", fallback = PageFallback.class)
public interface PageFeign {
@RequestMapping("/products/all")
public List<Products> findAll();
@RequestMapping("/products/{id}")
public Products findById(@PathVariable("id") Integer id);
@RequestMapping("/products/info")
public String getServerInfo();
}
2.请求测试
2.1 第一次浏览器测试
- 请求地址:http://127.0.0.1:9100/page/info
- 请求之后发现请求失效,明明已经超出 Hystrix 超时时间,但是没有回调到 fallback的内容
2.2 处理方法,修改配置文件,要开启 Feign对 Hystrix的支持
# 配置 Feign 远程调用
feign:
hystrix:
# 为 Feign 开启 Hystrix熔断机制,就可以使用回调
enabled: true
2.3 第二次浏览器测试
- 请求地址:http://127.0.0.1:9100/page/info
- 请求效果:
3.总结
- 首先编写接口和对应的回调方法
- 第二步要在配置文件中开启 Feign 对 Hystrix的支持,否则远程调用不可用时无法执行熔断相关的操作,就会导致无法fallback回调