1. 程式人生 > >SpringCloud--06、熔斷器Hystrix

SpringCloud--06、熔斷器Hystrix

 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);
    }
}

啟動測試: