Spring Cloud Alibaba Sentinel 支持对 RestTemplate
的服务调用使用 Sentinel
进行保护, 在构造 RestTemplate Bean
的时候需要加上@SentinelRestTemplate
注解。
第一步: 创建 Spring Boot web应用工程,编写pom.xml配置文件:
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR1
pom
import
org.springframework.cloud
spring-cloud-alibaba-dependencies
0.2.2.RELEASE
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-alibaba-sentinel
org.projectlombok
lombok
1.18.2
true
org.springframework.boot
spring-boot-starter-test
test
第二步:编写启动类和 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();
}
}
@SentinelRestTemplate 注解的属性支持限流(blockHandler, blockHandlerClass)和降级(fallback, fallbackClass)的处理。
其中 blockHandler 或 fallback 属性对应的方法必须是对应 blockHandlerClass 或 fallbackClass 属性中的静态方法。
该方法的参数跟返回值跟 org.springframework.http.client.ClientHttpRequestInterceptor#interceptor 方法一致,其中参数多出了一个 BlockException 参数用于获取 Sentinel 捕获的异常。
我们这里统一放在一个异常工具类处理(后期可根据具体项目修改返回值数据)
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)和降级(fallback, fallbackClass)属性不强制填写。
当使用 RestTemplate 调用被 Sentinel 熔断后,会返回 RestTemplate request block by sentinel 信息,或者也可以编写对应的方法自行处理返回信息。这里提供了 SentinelClientHttpResponse 用于构造返回信息。
若我们在开发期间,不希望Sentinel对服务提供者的接口进行容错,可以通过以下配置进行开关:
resttemplate:
sentinel:
enabled: true
Sentinel实现与RestTemplate整合的相关源码: org.springframework.cloud.alibaba.sentinel.custom.SentinelBeanPostProcessor