详细介绍查看 官网文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
1、Hystrix与Sentinel差异
- 隔离策略:
1、引入jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
下载服务端jar包:https://github.com/alibaba/Sentinel/releases,根据spring-cloud-starter-alibaba-sentinel的版本下载对应的jar包。
本次引用的starter是 2.2.5.RELEASE ,其对应的服务端需要下载1.8.0版本的。
3、直接启动dashboard即可,java -jar sentinel-dashboard-1.8.0.jar —server.port=8333
账户密码默认:sentinel / sentinel
整个页面采用懒加载的方式,必须有请求进来才会显示相应的属性。
进行简单的设置之后
截止到这边所有的设置都是保存在内存中的,服务重启后一切设置都会失效。
流控生效之后
配置文件添加 management.endpoints.web.exposure.include=*
方便sentinel统计信息。
Endpoint 支持
在使用 Endpoint 特性之前需要在 Maven 中添加
spring-boot-starter-actuator
依赖,并在配置中允许 Endpoints 的访问。
- Spring Boot 1.x 中添加配置
management.security.enabled=false
。暴露的 endpoint 路径为/sentinel
- Spring Boot 2.x 中添加配置
management.endpoints.web.exposure.include=*
。暴露的 endpoint 路径为/actuator/sentinel
Sentinel Endpoint 里暴露的信息非常有用。包括当前应用的所有规则信息、日志目录、当前实例的 IP,Sentinel Dashboard 地址,Block Page,应用与 Sentinel Dashboard 的心跳频率等等信息。
自定义返回信息
@Configuration
public class SentinelConfig {
public SentinelConfig() {
WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json");
httpServletResponse.getWriter().write("服务器扛不住啦,休息中。。。");
}
});
}
}
3、单机预热模式
4、排队等待
阈值为10,超过部分进行排队等待,排队时间超过500ms则报错。
5、熔断降级
一般在调用方手动指定远程服务的熔断策略,
也可以在提供方做限制,返回的都是默认的降级数据。
RT:响应时间
当1秒内持续进入5个请求,这些请求对应时刻的平均响应时间均超过阀值(上图中为5ms),那么在接下来的时间窗口(10s)之内,对这个方法的调用都会自动熔断。
6、自定义受保护的资源
@GetMapping("hello2/{name}")
public String hello2(@PathVariable String name) {
print();
return name;
}
private void print() {
// ----------
try (Entry print = SphU.entry("print")) {
System.out.println("hello world!");
} catch (BlockException e) {
System.out.println("资源被限制" + e.getMessage());
}
}
7、基于注解自定义配置
@Service
public class testService {
@SentinelResource(value = "testService", blockHandler = "blockHandler", fallback = "fallback")
public void print() {
System.out.println("testService.......");
}
public void blockHandler(BlockException e) {
System.out.println("testService.blockHandler:" + e.getMessage());
}
public void fallback() {
System.out.println("fallback..........");
}
}
@GetMapping("hello4/{name}")
public String hello4(@PathVariable String name) {
service.print();
return name;
}
注意 blockHandler
函数会在原方法被限流/降级/系统保护的时候调用,而 fallback
函数会针对所有类型的异常。请注意 blockHandler
和 fallback
函数的形式要求
8、自定义其他blockHandler类和fallback
public class BlockHandler {
public static String helloWorld(BlockException blockException) {
System.out.println("太快了.........,请慢点");
return "1";
}
}
public class FallbackHandler {
public static String helloWorld3() {
System.out.println("FallbackHandler.helloWorld.........");
return "";
}
}
@SentinelResource(value = "helloWorld", blockHandler = "helloWorld", blockHandlerClass = BlockHandler.class)
public String helloWorld() {
System.out.println("helloWorld.........");
return null;
}
@SentinelResource(value = "helloWorld3", fallbackClass = FallbackHandler.class, fallback = "helloWorld3")
public String helloWorld3() {
int a = 1 / 0;
System.out.println("helloWorld.........");
return "";
}