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方法