如何接入Sentinel

1,438 阅读2分钟

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

什么是sentinel

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景

  • 服务限流 :当系统资源不够,不足以应对大量请求,对系统按照预设的规则进行流量限制或功能限制
  • 服务熔断:当调用目标服务的请求和调用大量超时或失败,服务调用方为避免造成长时间的阻塞造成影响其他服务,后续对该服务接口的调用不再经过进行请求,直接执行本地的默认方法
  • 服务降级:为了保证核心业务在大量请求下能正常运行,根据实际业务情况及流量,对部分服务降低优先级,有策略的不处理或用简单的方式处理

image.png

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

与Hystrix的比较:

image.png

Sentinel 两种使用方式:

  • 入侵式与业务代码耦合(不推荐)
// 资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。
try (Entry entry = SphU.entry("resourceName")) {
  // 被保护的业务逻辑
  // do something here...
} catch (BlockException ex) {
  // 资源访问阻止,被限流或被降级
  // 在此处进行相应的处理操作
}
  • 与主流框架的适配解耦
支持Servlet
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-web-servlet</artifactId>
    <version>x.y.z</version>
</dependency>
支持dubbo
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-dubbo-adapter</artifactId>
    <version>x.y.z</version>
</dependency>
支持springcloud
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

Sentinel 性能报告

测试环境 CPU: Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz (32 cores) OS: Linux 2.6.32-220.23.2.ali927.el5.x86_64 Java 版本:

java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

JVM 参数:-Xmn256m -Xmx1024m -XX:+UseConcMarkSweepGC 测试单线程模式下接入 Sentinel 与不接入 Sentinel 吞吐量的对比。我们通过执行一些 CPU 密集型操作(如小数组排序)来模拟不同 QPS 下的情况 。

image.png

可以看到在单机 QPS 非常大的时候(20W+),Sentinel 带来的性能损耗会比较大。这种情况业务逻辑本身的耗时非常小,而 Sentinel 一系列的统计、检查操作会消耗一定的时间。常见的场景有缓存读取操作。

开源与付费

功能对比:

image.png

image.png

image.png

商用AHAS费用

image.png

image.png

image.png