栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Feign远程调用fallback回调失败,无效果 1.fallback 1.1 fallback介绍
  • fallback 是用来为 Feign 远程调用失败的时候设置的回调方法,如果调用远程微服务失败,就会调用并返回服务消费端默认保留的 fallback 回调方法的内容
1.2 fallback用法

首先需要在服务消费端编写和服务提供端提供的服务相同的接口,有点类似于 Dubbo

  • 这是服务提供者的controller方法
@RestController
@RequestMapping("/products")
public class ProductsController {

    @Autowired
    private ProductDao productDao;

    @RequestMapping("/all")
    public List findAll() {
        List 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 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;


@Component // 交给 Spring 进行管理
public class PageFallback implements PageFeign {
    @Override
    public List 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;


@Repository
@FeignClient(name = "ProductDemo", fallback = PageFallback.class)
public interface PageFeign {
    @RequestMapping("/products/all")
    public List 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回调
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号