Hystrix熔断器使用-创建托底方法返回托底数据

本文介绍如何在Spring Cloud项目中集成Feign与Hystrix实现服务间调用及故障转移。首先通过pom文件引入所需依赖,然后在启动类上启用Feign与Hystrix,并配置应用以支持文本压缩传输。接着定义发送请求的接口并实现托底方法,最后通过Controller层调用这些接口。
摘要由CSDN通过智能技术生成

首先在pom文件中添加坐标。

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

        <!-- Hystrix坐标 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

接着, 在启动类上使用  @ EnableHystrix 激活Hystrix , 使用@EnableFeignClients激活openFeign

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients  //开启openFeign
@EnableHystrix       //开启Hystrix
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class , args);
    }
}

配置application.yml , 控制消费者向注册中心发送拉取服务的时间间隔。  控制feign支持请求传输的文本压缩。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ #注册中心地址
    register-with-eureka: false  #是否将自己注册到注册中心, 默认是true
    registry-fetch-interval-seconds: 10 #表示Erueka Client 间隔多久去服务器拉取注册信息 , 默认30秒

server:
  port: 9090

spring:
  application:
    name: consumer-server
#feign请求支持文本压缩传输
feign:
  compression:
    request:
      enable: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048
    response:
      enable: true
      useGzipDecoder: true
  hystrix:
    enabled: true

新建IFeignProvider包,包中定义发送请求的接口。

package com.consumer.FeignInterface;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

//绑定 消费者的服务名称
@FeignClient(value = "PROVIDER-SERVER" , fallback = IFeignProvider.HystrixClientFallback.class )
public interface IFeignProvider {

    //请求PROVIDER-SERVER服务提供者的getInfo()方法
    @RequestMapping(method = RequestMethod.GET , value = "/providerServer/demo/privider")
    public String getProviderInfo();

    //使用托底方法时,必须要将方法实现@Bean  或者  @Component
    @Component
    static class HystrixClientFallback implements IFeignProvider {
        @Override
        public String getProviderInfo()
        {
            return "这是一个托底方法,无法发送合格的响应时返回托底方法的数据。";
        }
    }
}

在这里, @FeignClient中value指定的服务名称必须在注册中心中存在并且有心跳, 如果注册中心中该服务被保护起来, 则项目无法启动, 会报错:无法连接到PROVIDER-SERVER 服务。 托底方法由HystrixClientFallback类来实现, HystrixClientFallback类继承了IFeignProvider接口,意味着HystrixClientFallback类必须实现IFeignProvider接口的所有方法。就是说, 托底类中必须对接口的每个方法都进行托底数据的处理。  最重要的, 官网上一笔带过的一句话: 托底类必须被@Bean注解。 这个很重要,不然会报错。后者也可以使用@Component注解,总之托底类一定要交给spring管理。

最后写Controller层。示例代码如下:

package com.consumer.controller;

import com.consumer.FeignInterface.IFeignProvider;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("feign")
public class FeignController {
    @Autowired
    IFeignProvider iFeignProvider;

//    @HystrixCommand(fallbackMethod = "getDefaultInfo")
    @GetMapping("/getInfo")
    public String getInfo()
    {
        String str = iFeignProvider.getProviderInfo();
        System.out.println(str + " ----------------------------------------- ");
        return str;
    }

    public String getDefaultInfo()
    {
        return  "由fallbackMethod指定的托底方法";
    }
}

第一次,项目所依赖的服务启动, 请求该接口, 返回数据正常。

第二次, 关掉项目依赖的服务, 请求该接口, 返回托底数据。

如果不进行托底配置, 当服务挂掉的情况下, 会报错请求超时。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值