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);
}
}
啓動測試: