Spring Cloud Alibaba Sentinel 支持對(duì) RestTemplate 的服務(wù)調(diào)用使用 Sentinel 進(jìn)行保護(hù)挟冠, 在構(gòu)造 RestTemplate Bean的時(shí)候需要加上@SentinelRestTemplate注解激才。
整合RestTemplate
第一步: 創(chuàng)建 Spring Boot web應(yīng)用工程离斩,編寫pom.xml配置文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
第二步:編寫啟動(dòng)類和 RestTemplate 配置 :
@EnableDiscoveryClient
@SpringBootApplication
public class RestTemplateApplication {
public static void main(String[] args) {
SpringApplication.run(RestTemplateApplication.class, args);
}
}
@Configuration
public class WebConfig {
@Bean
@SentinelRestTemplate(fallback = "fallback", fallbackClass = ExceptionUtil.class, blockHandler="handleException",blockHandlerClass=ExceptionUtil.class)
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- blockHandlerClass:限流后處理的類
- blockHandler: 限流后處理的方法
- fallbackClsss:熔斷后處理的類
- fallback:熔斷后處理的方法
@SentinelRestTemplate 注解的屬性支持限流(blockHandler, blockHandlerClass)和降級(jí)(fallback, fallbackClass)的處理。
其中 blockHandler 或 fallback 屬性對(duì)應(yīng)的方法必須是對(duì)應(yīng) blockHandlerClass 或 fallbackClass 屬性中的靜態(tài)方法迄沫。
該方法的參數(shù)跟返回值跟 org.springframework.http.client.ClientHttpRequestInterceptor#interceptor 方法一致膘怕,其中參數(shù)多出了一個(gè) BlockException 參數(shù)用于獲取 Sentinel 捕獲的異常捞烟。
我們這里統(tǒng)一放在一個(gè)異常工具類處理(后期可根據(jù)具體項(xiàng)目修改返回值數(shù)據(jù))
public class ExceptionUtil {
/**
* 限流后處理方法
* @param request
* @param body
* @param execution
* @param ex
* @return
*/
public static SentinelClientHttpResponse handleException(HttpRequest request,
byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
System.err.println("block: " + ex.getClass().getCanonicalName());
return new SentinelClientHttpResponse("custom block info");
}
/**
* 熔斷后處理的方法
* @param request
* @param body
* @param execution
* @param ex
* @return
*/
public static SentinelClientHttpResponse fallback(HttpRequest request,
byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
System.err.println("fallback: " + ex.getClass().getCanonicalName());
return new SentinelClientHttpResponse("custom fallback info");
}
}
@SentinelRestTemplate 注解的限流(blockHandler, blockHandlerClass)和降級(jí)(fallback, fallbackClass)屬性不強(qiáng)制填寫赎瑰。
當(dāng)使用 RestTemplate 調(diào)用被 Sentinel 熔斷后王悍,會(huì)返回 RestTemplate request block by sentinel 信息,或者也可以編寫對(duì)應(yīng)的方法自行處理返回信息乡范。這里提供了 SentinelClientHttpResponse 用于構(gòu)造返回信息配名。
若我們?cè)陂_發(fā)期間,不希望Sentinel對(duì)服務(wù)提供者的接口進(jìn)行容錯(cuò)晋辆,可以通過以下配置進(jìn)行開關(guān):
開啟或關(guān)閉@SentinelRestTemplate注解:
resttemplate:
sentinel:
enabled: true
Sentinel實(shí)現(xiàn)與RestTemplate整合的相關(guān)源碼:
org.springframework.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor