SpringCloud--06、熔斷器Hystrix
阿新 • • 發佈:2018-12-11
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);
}
}
啟動測試: