版权声明:转载 请注明 原始链接 https://blog.csdn.net/sswqzx/article/details/84782079
1、概述
Hystrix:当消费者向服务提供者访问时、如果长时间得不到响应、这时熔断器就起作用了、直接进行失败回滚、服务降级处理、不会直接报错、而是返回一个友好的提示。
2、实例
熔断器是作用在消费者上的。所以在user-consumer上加入Hystrix依赖
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在user-consumer启动类上开启熔断 ConsumerDemoApplicaiton.java
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix //开启熔断器
public class ConsumerDemoApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
public static void main(String[] args) {
SpringApplication.run(ConsumerDemoApplication.class, args);
}
}
user-consumer. UserDao.java
@Component
public class UserDao {
@Autowired
private RestTemplate restTemplate;
private static final Logger logger = LoggerFactory.getLogger(UserDao.class);
@HystrixCommand(fallbackMethod = "queryUserByIdFallback")
public User queryUserById(Long id){
long begin = System.currentTimeMillis();
String url = "http://user-service/user/" + id;
User user = this.restTemplate.getForObject(url, User.class);
long end = System.currentTimeMillis();
// 记录访问用时:
logger.info("访问用时:{}", end - begin);
return user;
}
public User queryUserByIdFallback(Long id){
User user = new User();
user.setId(id);
user.setName("用户信息查询出现异常!");
return user;
}
}
@HystrixCommand(fallbackMethod="queryUserByIdFallback"):声明一个失败回滚处理函数
queryUserByIdFallback,当queryUserById执行超时(默认是1000毫秒),就会执行fallback函数,返回错误提示。
修改user-service的UserService 随机休眼一段时间、以触发熔断
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) throws InterruptedException {
// 为了演示超时现象,我们在这里然线程休眠,时间随机 0~2000毫秒
Thread.sleep(new Random().nextInt(2000));
return this.userMapper.selectByPrimaryKey(id);
}
}
启动测试: