• springcloudalibaba架构(12):Feign整合Sentinel实现服务容错


    前言

    Feign远程调用,Sentinel限流。
    如何将Feign整合Sentinel实现服务容错?
    如何获取Feign远程调用时的异常进行问题排查?

    本章代码已分享至Gitee: https://gitee.com/lengcz/springcloudalibaba01.git

    第一节 Feign如何整合Sentinel实现服务容错

    1. 引入依赖
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    1. 开启feign对sentinel的支持
    feign:
      sentinel:
        enabled: true #开启feign对sentinel的支持
    
    • 1
    • 2
    • 3
    1. 设置容错的类@FeignClient(value=“server-product”,fallback = ProductServiceFallback.class)
    /**
     * value用于指定调用的nacos下哪个微服务
    * fallback用于指定当前feign接口容错类 */
    @FeignClient(value="server-product",fallback = ProductServiceFallback.class) public interface ProductService { @RequestMapping("/product/{pid}") Product findById(@PathVariable Integer pid); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    4. 实现容错方法(当远程服务不可用时,进行服务容错,进入fallback指定的类的同名方法)

    /**
     * 容错类,需要实现Feign所在的接口,并去实现接口中的所有方法,一旦Feign远程调用出现问题了,就会进入当前类的同名方法,执行容错逻辑
     */
    @Service
    public class ProductServiceFallback implements ProductService {
        @Override
        public Product findById(Integer pid) {
    
            Product product=new Product();
            product.setPid(-1);
            product.setPname("远程调用微服务异常,进入容错");
            return product;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注:容错类的方法的返回值、方法名、参数必须和原来保持一致。

    1. 修改controller,当pid为-1表示下单失败。
      在这里插入图片描述

    2. 启动order和product对应的微服务,发起请求测试,正常情况下可以查询到 Product的信息。
      在这里插入图片描述
      当将product微服务停止了,再次请求下单接口。
      在这里插入图片描述

    第二节 使用FallbackFactory容错获取异常

    从第一节的内容,我们可以看到,当调用外部微服务发生异常时,我们并不能看到发生了什么异常,这导致我们很难进行问题排查。使用FacllbackFactory接口,就可以获取到Feign远程调用时发生的异常了。如何操作呢?对第一节的demo进行小小的改动。

    1. 实现FallbackFactory
    /**
     * 容错类,需要实现Feign所在的接口,并去实现接口中的所有方法,一旦Feign远程调用出现问题了,就会进入当前类的同名方法,执行容错逻辑
     */
    @Service
    @Slf4j
    public class ProductServiceFallbackFactory implements FallbackFactory<ProductService> {
    
        @Override
        public ProductService create(Throwable throwable) {
            log.error("======"+throwable.getMessage());
            return new ProductService() {
                @Override
                public Product findById(Integer pid) {
                    Product product=new Product();
                    product.setPid(-1);
                    product.setPname("FallbackFactory远程调用微服务异常,进入容错");
                    return product;
                }
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    1. 指定fallbackFactory=ProductServiceFallbackFactory
    /**
     * value用于指定调用的nacos下哪个微服务
    * fallback用于指定当前feign接口容错类 */
    //@FeignClient(value="server-product",fallback = ProductServiceFallback.class) @FeignClient(value="server-product",fallbackFactory = ProductServiceFallbackFactory.class) public interface ProductService { @RequestMapping("/product/{pid}") Product findById(@PathVariable Integer pid); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 只启动order微服务进行请求测试,可以发现能看到Feign调用的异常信息。
      在这里插入图片描述

    通过实现FallbackFactory<要实现的接口类>,我们可以捕获到发生的异常进行记录和处理,进行问题排查。

  • 相关阅读:
    胶囊网络深入理解
    QT下assimp库的模型加载
    Spring - BeanPostProcessors 扩展接口
    【PE806】Nim on Towers of Hanoi(汉诺塔游戏,生成函数)
    c++文件的打开、读写和关闭。缓冲区的使用和控制。
    如何在 GNU Linux 上通过 Nvm 安装 Node 和 Npm?
    八大排序算法(C语言版)之插入排序
    这才是真正的Spring全家桶:Spring+SpringData+MVC+Boot+Cloud
    虚拟机构建单体项目及前后端分离项目
    阿里云RDS关系型数据库详细介绍_多版本数据库说明
  • 原文地址:https://blog.csdn.net/u011628753/article/details/126249459