spring cloud(七):Hystrix的應用
熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。除了熔斷的功能還有服務降級、線程和信號隔離、請求緩存、請求合並以及服務監控等強大功能。
2、集成
a、工程的 pom.xml 的 dependency 節點中引入 spring-cloud-starter-hystrix 依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
b、在啟動類中通過註解@EnableCircuitBreaker ,啟動熔斷器
/**
* 使用@EnableCircuitBreaker註解開啟斷路器功能
* @author eacdy
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class HystrixApplication {
/**
* 實例化RestTemplate,通過@LoadBalanced註解開啟均衡負載能力.
* @return restTemplate
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
c、編寫服務類,寫個回退方法,通過命令模式,指定發生異常需要回退的方法
@Service
public class HystrixService {
@Autowired
private RestTemplate restTemplate;
private static final Logger LOGGER = LoggerFactory.getLogger(RibbonHystrixService.class);
@HystrixCommand(fallbackMethod = "fallback")
public User findById(Long id) {
return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
}
public User fallback(Long id) {
User user = new User();
user.setId(-1L);
user.setUsername("default username");
user.setAge(0);
return user;
}
}
d、編寫控制器類,調用服務類
@RestController
public class HystrixController {
@Autowired
private HystrixService hystrixService;
@GetMapping("/ribbon/{id}")
public User findById(@PathVariable Long id){
return this.hystrixService.findById(id);
}
}
e、編寫application.yml
server:
port: 9413
spring:
application:
name: microservice-hystrix
eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/
instance:
hostname: hystrix
3、啟動應用,同時啟動兩個相同的應用,只是端口不同,訪問http://hystrix:9413/hystrix/1,則正常顯示內容,當把服務設置超時,則會調用回退方法。
4、總結
熔斷器有效的解決了因為服務故障,請求積壓,導致服務崩潰,同時提高了用戶的體驗;上面的集成是使用了熔斷器的命令模式,如果項目裏面用的是feign,則自帶了回退機制,不過個人推薦還是用命令模式,參數設置靈活,api更強大。
spring cloud(七):Hystrix的應用