SpringCloud--06、熔断器Hystrix

版权声明:转载 请注明 原始链接 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);
    }
}

启动测试:

猜你喜欢

转载自blog.csdn.net/sswqzx/article/details/84782079