動手試一試
在開始使用Spring Cloud Hystrix實現(xiàn)斷路器之前,我們先拿之前實現(xiàn)的一些內(nèi)容作為基礎(chǔ),其中包括:
電子商務(wù)社交平臺源碼請加企鵝求求:三五三六二四七二五九
eureka-server工程:服務(wù)注冊中心,端口:1001
eureka-client工程:服務(wù)提供者守屉,兩個實例啟動端口分別為2001
下面我們可以復(fù)制一下之前實現(xiàn)的一個服務(wù)消費者:eureka-consumer-ribbon,命名為eureka-consumer-ribbon-hystrix。下面我們開始對其進(jìn)行改在:
第一步:pom.xml的dependencies節(jié)點中引入spring-cloud-starter-hystrix依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
第二步:在應(yīng)用主類中使用@EnableCircuitBreaker或@EnableHystrix注解開啟Hystrix的使用:
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
注意:這里我們還可以使用Spring Cloud應(yīng)用中的@SpringCloudApplication注解來修飾應(yīng)用主類入客,該注解的具體定義如下所示。我們可以看到該注解中包含了上我們所引用的三個注解腿椎,這也意味著一個Spring Cloud標(biāo)準(zhǔn)應(yīng)用應(yīng)包含服務(wù)發(fā)現(xiàn)以及斷路器桌硫。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
第三步:改造服務(wù)消費方式,新增ConsumerService類啃炸,然后將在Controller中的邏輯遷移過去铆隘。最后,在為具體執(zhí)行邏輯的函數(shù)上增加@HystrixCommand注解來指定服務(wù)降級方法南用,比如:
@RestController
public class DcController {
@Autowired
ConsumerService consumerService;
@GetMapping("/consumer")
public String dc() {
return consumerService.consumer();
}
class ConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
public String fallback() {
return "fallback";
}
}
}
下面我們來驗證一下上面Hystrix帶來的一些基礎(chǔ)功能膀钠。我們先把涉及的服務(wù)都啟動起來,然后訪問localhost:2101/consumer裹虫,此時可以獲取正常的返回肿嘲,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]。
為了觸發(fā)服務(wù)降級邏輯筑公,我們可以將服務(wù)提供者eureka-client的邏輯加一些延遲雳窟,比如:
@GetMapping("/dc")
public String dc() throws InterruptedException {
Thread.sleep(5000L);
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}
重啟eureka-client之后,再嘗試訪問localhost:2101/consumer十酣,此時我們將獲得的返回結(jié)果為:fallback涩拙。我們從eureka-client的控制臺中,可以看到服務(wù)提供方輸出了原本要返回的結(jié)果耸采,但是由于返回前延遲了5秒兴泥,而服務(wù)消費方觸發(fā)了服務(wù)請求超時異常,服務(wù)消費者就通過HystrixCommand注解中指定的降級邏輯進(jìn)行執(zhí)行虾宇,因此該請求的結(jié)果返回了fallback搓彻。這樣的機制,對自身服務(wù)起到了基礎(chǔ)的保護(hù)嘱朽,同時還為異常情況提供了自動的服務(wù)降級切換機制旭贬。電子商務(wù)社交平臺源碼請加企鵝求求:三五三六二四七二五九