从零开始搭建spring cloud(六)Hystrix断路器实现容错

Hystrix简介

Hystrix是一个实现了超时机制和断路器模式的工具类库。用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错。

1.包裹请求,使用HystrixCommand(或者HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立的线程中执行。

2.跳闸机制,当某个服务的错误率超过一定阔值的时候,Hystrix可以选择自动或者手动跳闸,停止请求该服务一段时间。

3.资源隔离,Hystrix为每个依赖都维护了一个小的线程池。如果该线程池已满,发往该依赖的请求立刻被拒绝,而不是等待,加速失败判定。

Feign使用Hystrix

spring cloud已经默认为Feign整合了Hystrix,只要Hystrix在项目的classpath中,Feign就会默认使用Hystrix断路器包裹所有方法。

1.打开consumer项目,在启动类上添加注解开启Hystrix断路器

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix //开启hystrix断路器
@EnableCircuitBreaker //开启hystrix 注解
public class MaojEurekaConsumerApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(MaojEurekaConsumerApplication.class, args);
    }
}

2.更改配置文件,开启hystrix,配置ribbon和 hystrix的超时时间

server:
  port: 8010

spring:
  application:
    name: maoj-eureka-consumer

eureka:
  client: 
    service-url:
      default-zone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
feign:
  hystrix:
    enabled: true

ribbon:
  readTimeOut: 6000
  connectTimeOut: 6000
hystrix:
  metrics:
    enabled: true
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

3.更改UserFeignClien接口,在注解中添加fallback属性。添加备用方法,当请求失败的时候,hystrix会调用UserFeignClientFallback的方法。


@FeignClient(value = "maoj-eureka-provider", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    User findUser(@PathVariable("id") Long id);
}

@Component
class UserFeignClientFallback implements UserFeignClient{

    @Override
    public User findUser(Long id) {
        User user = new User();
        user.setId(-1L);
        user.setName("默认用户");
        return user;
    }
}

4.添加Feign配置文件

@Configuration
@EnableDiscoveryClient
@EnableFeignClients(basePackageClasses = { UserFeignClient.class })
@ComponentScan(basePackageClasses = { UserFeignClient.class })
public class FeignConfiguration {

    @Bean
    public static Request.Options requestOptions(ConfigurableEnvironment env) {
        int ribbonReadTimeout = env.getProperty("ribbon.ReadTimeout", int.class, 7000);
        int ribbonConnectionTimeout = env.getProperty("ribbon.ConnectTimeout", int.class, 6000);

        return new Request.Options(ribbonConnectionTimeout, ribbonReadTimeout);
    }
}

5.启动eureka, provider, consumer项目,访问http://localhost:8010/consumer/users/1 可以看到如下信息。

关闭provider服务,可以看到如下信息,调用了fallback方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值