openfeign新版3.1.1做服务降级的坑

本文探讨了在使用Spring Cloud OpenFeign进行服务降级时遇到的问题,即服务端关闭但降级未生效。通过分析发现,新版不再包含Hystrix包,解决方法是引入spring-cloud-starter-netflix-hystrix依赖。

项目场景:

利用openfegin客户端做服务降级,关闭服务端,服务降级却不生效。

导入依赖

spring-cloud-starter-feign 2019 年就停更了,现在用 spring-cloud-starter-openfeign

      <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.1</version>
        </dependency>
           <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

配置微服务连接

fallbackFactory是feign的返回提供服务类

//
@Component
//feign 配置微服务连接,fallbackFactory提供降级服务
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
//@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
    @RequestMapping("/dept/add")
    boolean addDept(Dept dept);
    @RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)
    Dept queryById(@PathVariable("id") Long id);
    @RequestMapping("/dept/list")
    List<Dept> queryAll();
}

提供降级服务

@Component
// 降级 
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientService() {
            @Override
            public boolean addDept(Dept dept) {
                return false;
            }

            @Override
            public Dept queryById(Long id) {
                return new Dept()
                        .setDeptId(id)
                        .setDName("id=>"
                                +id+
                                "没有对应的信息,客户端做了降级的服务,这个服务现在已经关闭")
                        .setDb_source("没有这个服务");
            }

            @Override
            public List<Dept> queryAll() {
                return null;
            }
        };
    }
}

启动类配置

@SpringBootApplication
// 开启eureka客户端
@EnableEurekaClient
// 开启feign客户端
@EnableFeignClients
public class DeptConsumer_feign {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_feign.class,args);
    }
}

配置yml

  # 开启熔断器
feign:
  circuitbreaker:
    enabled: true

问题描述

关闭客户端提示

前端爆500错误
后端提示:

java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_291]
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81) ~[na:1.8.0_291]
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476) ~[na:1.8.0_291]
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218) ~[na:1.8.0_291]
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200) ~[na:1.8.0_291]
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162) ~[na:1.8.0_291]
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394) ~[na:1.8.0_291]
	at java.net.Socket.connect(Socket.java:606) ~[na:1.8.0_291]
	at sun.net.NetworkClient.doConnect(NetworkClient.java:175) ~[na:1.8.0_291]
	at sun.net.www.http.HttpClient.openServer(HttpClient.java:463) ~[na:1.8.0_291]
	at sun.net.www.http.HttpClient.openServer(HttpClient.java:558) ~[na:1.8.0_291]
	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:698) ~[na:1.8.0_291]
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593) ~[na:1.8.0_291]
Message(READ_DATA, bytes, -1, buffer).sendToTarget();
	}
	..........

原因分析:

最新版本已经不包含hystrix包了
在这里插入图片描述


解决方案:

什么都不用做,导入hystrix依赖即可

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        <version>2.2.10.RELEASE</version>
    </dependency>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值