Feign远程调用fallback回调失败,无效果

2年前 (2022) 程序员胖胖胖虎阿
356 0 0

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
  • 请求效果:
    Feign远程调用fallback回调失败,无效果

3.总结

  • 首先编写接口和对应的回调方法
  • 第二步要在配置文件中开启 Feign 对 Hystrix的支持,否则远程调用不可用时无法执行熔断相关的操作,就会导致无法fallback回调
版权声明:程序员胖胖胖虎阿 发表于 2022年10月10日 下午10:40。
转载请注明:Feign远程调用fallback回调失败,无效果 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...