spring cloud Hystix熔断机制--基本熔断配置和Fegin client熔断配置

所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢?

当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示,而这个时候如果不想出现这样的错误信息,而希望替换为一个错误时的内容。

一个服务变慢了,后续的其他调用者服务跟着不能用了,这就是雪崩效应

 对于熔断技术的实现需要考虑以下几种情况:

 · 出现错误之后可以 fallback 错误的处理信息;

 · 如果要结合 Feign 一起使用的时候还需要在 Feign(客户端)进行熔断的配置。

一、基于ribbon的Hystrix 基本配置

1、复制项目重命名为springcloud-moveServer-hystrix修改调用方 pom.xml 配置文件,追加 Hystrix 配置类:

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-hystrix</artifactId> 
</dependency>

 

2.修改程序 controller

package com.pupeiyuan.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.pupeiyuan.bean.NhReportStatusHistory;

@RestController
@RefreshScope
public class ConfigClientController {

     //spring 提供用于访问rest接口的模板对象
    @Autowired
    @Qualifier(value = "remoteRestTemplate")
    private RestTemplate restTemplate;
    @HystrixCommand(fallbackMethod = "findByIdFallback")
      @GetMapping("/balance/{id}")
      public List<NhReportStatusHistory> getBalance(@PathVariable Long id) {
          return this.restTemplate.getForObject("http://MULTIPLE/getDate/"+id, List.class);
            
      }
    public List<NhReportStatusHistory> findByIdFallback(Long id) {
        NhReportStatusHistory nhreportstatushistory = new NhReportStatusHistory();
        nhreportstatushistory.setId("000000000000");
        List<NhReportStatusHistory> list = new ArrayList<>();
        list.add(nhreportstatushistory);
        return list;
      }
}

这里需要注意的是,fallback方法的参数和类型要和原方法保持一致,否则会出现异常

3、在主类之中启动熔断处理

package com.pupeiyuan.config;


import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.client.RestTemplate;

import feign.Logger;

@Configuration
//扫描bean
@ComponentScan(basePackages = "com.pupeiyuan.*")
//不用自动配置数据源
@EnableDiscoveryClient
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
@EnableFeignClients(basePackages="com.pupeiyuan.feignClient")
@EnableCircuitBreaker
public class MainApplication extends SpringBootServletInitializer {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
     //相当于xml中的bean标签 用于调用当前方法获取到指定的对象
    @Bean(name="remoteRestTemplate")
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(MainApplication.class);
    }
}

 

到此,一个简单基于ribbon的Hystix熔断机制就配置好了。

 

二、基于Feign client的Hystrix 配置

1、复制项目重命名为springcloud-moveServer-hystrix修改调用方 pom.xml 配置文件,追加 Hystrix 配置类:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>

2、增加配置启用

feign.hystrix.enabled=true

3、启动类增加注解

@EnableCircuitBreaker

4、增加FeignClient2业务接口,并配置fallback 

package com.pupeiyuan.feignClient;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.config.FeignConfiguration;
import com.pupeiyuan.bean.NhReportStatusHistory;

import feign.Param;
import feign.RequestLine;

@FeignClient(name = "MULTIPLE",configuration = FeignConfiguration.class,fallback=HystrixClientFallback.class)
public interface FeignClient2 {

    @RequestMapping(value = "/getDate/{id}", method = RequestMethod.GET)
    public List<NhReportStatusHistory> dataList(@PathVariable("id") Long id);
}

5.增加HystrixClientFallback类

package com.pupeiyuan.feignClient;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

import com.pupeiyuan.bean.NhReportStatusHistory;

@Component
public class HystrixClientFallback implements FeignClient2{

    @Override
    public List<NhReportStatusHistory> dataList(Long id) {
        NhReportStatusHistory nhreportstatushistory = new NhReportStatusHistory();
        nhreportstatushistory.setId("99999999999999");
        List<NhReportStatusHistory> list = new ArrayList<>();
        list.add(nhreportstatushistory);
        return list;
    }

}

 

演示如下,停调multiple服务,请求结果

 

请求健康状态接口显示断路器已经在打开状态

 

三、如何禁用单个FegionClient的Hystrix的支持

在自定义Feign Client配置文件FeignConfiguration.java中新增配置即可

package com.pupeiyuan.feignClientConfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import feign.Contract;
import feign.Feign;
import feign.Logger;
@Configuration
public class FeignConfiguration {

    @Bean
    public Contract feignContract() {
        //这里可以配置默认配置
        return new feign.Contract.Default();
    }

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
    
    @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}

使用这个feign client配置文件的feign client都不会启用熔断器

fcd432e307bd4d52f899ac1dec3bd5cd7ce.png

四、Feign使用fallbackFactory属性打印fallback异常

1、基本配置略

2、配置UserFeignClient 

 

@FeignClient(name = "microservice-provider-user",  fallbackFactory = HystrixClientFallbackFactory.class)
public interface UserFeignClient {
    // @GetMapping("/sample/{id}")
    @RequestMapping(method = RequestMethod.GET, value = "/sample/{id}")
    public User findById(@PathVariable("id") Long id);
}

 

注意:配置了fallbackFactory ,如果同时设置fallback和fallbackfactory不可以有冲突,只能设置一个,fallbackFactory 是fallback的一个升级版

3、fallbackFactory 的类设置HystrixClientFallbackFactory

 

@Component
public class HystrixClientFallbackFactory implements FallbackFactory<UserFeignClient> {
    private static final Logger logger = LoggerFactory.getLogger(HystrixClientFallbackFactory.class);

    @Override
    public UserFeignClient create(Throwable arg0) {
        HystrixClientFallbackFactory.logger.info("fallback reason was:{}", arg0.getMessage());
        return new UserFeignClientWithFactory() {
            @Override
            public User findById(Long id) {
                User user = new User();
                user.setId(-1L);
                return user;
            }
        };
    }
}

 

4、UserFeignClientWithFactory设置

public interface UserFeignClientWithFactory extends UserFeignClient {

}
1. Ribbon配置 Ribbon是一个负载均衡组件,可以实现客户端的负载均衡。在Spring Cloud项目中,可以通过以下方式配置Ribbon: (1)引入Ribbon依赖 ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> ``` (2)配置Ribbon 在application.properties文件中配置Ribbon的相关属性: ``` # Ribbon负载均衡的服务名 ribbon.eureka.enabled=true ribbon.client.name=服务名 # Ribbon超时时间 ribbon.ReadTimeout=5000 ribbon.ConnectTimeout=5000 # Ribbon重试次数和间隔时间 ribbon.MaxAutoRetries=1 ribbon.MaxAutoRetriesNextServer=2 ribbon.ServerListRefreshInterval=2000 ``` 2. 熔断配置 熔断是一种保护机制,当系统的某个服务出现故障或异常时,可以通过熔断机制暂时关闭该服务,防止故障或异常扩散到整个系统。在Spring Cloud项目中,可以通过以下方式配置熔断: (1)引入Hystrix依赖 ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> ``` (2)配置熔断 在application.properties文件中配置熔断的相关属性: ``` # 熔断开关 hystrix.command.default.circuitBreaker.enabled=true # 熔断触发的最小请求数 hystrix.command.default.circuitBreaker.requestVolumeThreshold=20 # 熔断触发的错误率阈值 hystrix.command.default.circuitBreaker.errorThresholdPercentage=50 # 熔断触发后的休眠时间 hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000 ``` (3)添加@HystrixCommand注解 在需要熔断的方法上添加@HystrixCommand注解,定义熔断的fallback方法: ``` @HystrixCommand(fallbackMethod = "fallback") public String method(){ // ... } public String fallback(){ return "服务不可用,请稍后再试!"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值