SpringCloud在Feign中使用Hystrix熔断器


ps:阅读此文章前,你必须具备实现一个基于Feign的可编程式接口的能力
Feign 的具体应用可以查看这篇文章
https://blog.csdn.net/weixin_43721000/article/details/124214887


前言

Hystrix可以防止微服务链式调用时的雪崩

调用
调用
服务A
服务B
服务C

ps:
1.当C服务崩溃时,通过阻止B到C的通路来保护AB服务
2.熔断器定义在主动调用接口的微服务中【B调用C则B定义熔断器】
3.当B调用C时,如果在一定时间内B的请求失败次数超过了 Hystrix 的阈值,Hystrix 会熔断BC间的服务调用链
4.服务熔断后,经过一定时间 Hystrix 会放行B到C的一部分请求,如果此时请求结果返回正常,Hystrix 会关闭熔断器,恢复BC服务调用链。


一、前置条件

实现两个微服务 A B,并且 A 可以通过 Feign 调用 B
我这里服务 A 的名称叫 order,服务 B 的名称叫 bookschina,是一个图书资源的调用
ps:以下全部修改操作都是针对服务 A 的,服务 B 不需要改动


一、使用方法

1.引依赖

引入 Feign ,由于 Feign 中已经引入了 Hystrix,所以只需要引入 Feign 的依赖即可

<!-- feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在这里插入图片描述


2.application文件新增配置

开启熔断功能

feign:
  hystrix:
    enabled: true   # 开启 hystrix

3.编写Fallback处理类

<1>在服务调用接口的 @FeignClient 注解上增加 fallback 参数

fallback 指定了触发熔断后调用哪个类
在这里插入图片描述

package com.cxstar.client;

import com.alibaba.fastjson.JSONObject;
import com.cxstar.client.fallback.BookschinaClientFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Component
@FeignClient(value = "bookschina-service", fallback = BookschinaClientFallback.class)
public interface BookschinaClient {

    @GetMapping("/bookschina/spiderBookList/{searchkey}/{pageno}")
    JSONObject searchBookschina(
            @PathVariable("searchkey") String searchKey,
            @PathVariable("pageno") Integer pageNo
    );

}

<2>Fallback实现类
在这里插入图片描述

package com.cxstar.client.fallback;

import com.alibaba.fastjson.JSONObject;
import com.cxstar.client.BookschinaClient;
import org.springframework.stereotype.Component;

@Component
public class BookschinaClientFallback implements BookschinaClient {

    @Override
    public JSONObject searchBookschina(String searchKey, Integer pageNo) {
        JSONObject jb = new JSONObject();
        jb.put("msg", "熔断信息");   //直接返回固定的熔断信息即可
        return jb;
    }

}

二、测试

测试类

package com.cxstar;

import com.alibaba.fastjson.JSONObject;
import com.cxstar.client.BookschinaClient;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@Slf4j
@SpringBootTest
class OrderApplicationTests {


    @Autowired
    public BookschinaClient bookschinaClient;

    @Test
    void contextLoads() {

        JSONObject jb = bookschinaClient.searchBookschina("东野圭吾", 1);
        log.info(jb.toString());
        
    }

}

启动服务B
在这里插入图片描述
服务A请求结果
在这里插入图片描述
关闭服务B
在这里插入图片描述

服务A请求结果
在这里插入图片描述


三、补充

我在使用熔断服务的时候,调用接口不能在接口名上添加 @RequestMapping 注解,比如下面这种情况

@Component
@FeignClient(value = "bookschina-service", fallback = BookschinaClientFallback.class)
@RequestMapping("/bookschina")
public interface BookschinaClient {

    @GetMapping("/spiderBookList/{searchkey}/{pageno}")
    JSONObject searchBookschina(
            @PathVariable("searchkey") String searchKey,
            @PathVariable("pageno") Integer pageNo
    );

}

路由虽然是 /bookschina/spiderBookList/{searchkey}/{pageno},但是会报错,下面是报错信息,希望大佬指点原因

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.cxstar.client.BookschinaClient' method 
com.sun.proxy.$Proxy105#searchBookschina(String, Integer)
to {GET /bookschina/spiderBookList/{searchkey}/{pageno}}: There is already 'bookschinaClientFallback' bean method

如果去掉 @RequestMapping ,改成下面这样,就可以正常使用熔断功能了

@Component
@FeignClient(value = "bookschina-service", fallback = BookschinaClientFallback.class)
public interface BookschinaClient {

    @GetMapping("/bookschina/spiderBookList/{searchkey}/{pageno}")
    JSONObject searchBookschina(
            @PathVariable("searchkey") String searchKey,
            @PathVariable("pageno") Integer pageNo
    );

}

路由还是 /bookschina/spiderBookList/{searchkey}/{pageno},这样就不报错了,不知为啥【狗头】

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都干的派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值