Spring Cloud:限流熔断 - 整合阿里Sentinel

Sentinel介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel 把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。

  • 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

Sentinel 的主要特性:

Spring Cloud:限流熔断 - 整合阿里Sentinel_第1张图片

同类组件功能对比

 

Sentinel

Hystrix

resilience4j

隔离策略

信号量隔离(并发控制)

线程池隔离/信号量隔离

信号量隔离

熔断降级策略

基于慢调用比例、异常比例、异常数

基于异常比例

基于异常比例、响应时间

实时统计实现

滑动窗口(LeapArray)

滑动窗口(基于 RxJava)

Ring Bit Buffer

动态规则配置

支持近十种动态数据源

支持多种数据源

有限支持

扩展性

多个扩展点

插件的形式

接口的形式

基于注解的支持

支持

支持

支持

单机限流

基于 QPS,支持基于调用关系的限流

有限的支持

Rate Limiter

集群流控

支持

不支持

不支持

流量整形

支持预热模式与匀速排队控制效果

不支持

简单的 Rate Limiter 模式

系统自适应保护

支持

不支持

不支持

热点识别/防护

支持

不支持

不支持

多语言支持

Java/Go/C++

Java

Java

Service Mesh 支持

支持 Envoy/Istio

不支持

不支持

控制台

提供开箱即用的控制台,可配置规则、实时监控、机器发现等

简单的监控查看

不提供控制台,可对接其它监控系统

如何使用 Sentinel

本文以Spring Cloud为例,其他框架对接如dubbo请参考Github:spring-cloud-alibabae的examples教程。

首先,修改 pom.xml 文件,引入 Sentinel starter。


	com.alibaba.cloud
	spring-cloud-starter-alibaba-sentinel

下面这个例子就是一个最简单的使用 Sentinel 的例子:

@SpringBootApplication
public class Application {
  
  public static void main(String[] args) {
    	SpringApplication.run(ServiceApplication.class, args);
  }
}

@Service
public class TestService {
  
  	@SentinelResource(value = "sayHello")
  	public String sayHello(String name) {
      	return "Hello, " + name;
    }
}

@RestController
public class TestController {
  
  	@Autowired
  	private TestService service;
  
  	@GetMapping(value = "/hello/{name}")
  	public String apiHello(@PathVariable String name) {
      	return service.sayHello(name);
    }
}

@SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 sayHello 表示资源名。

@SentinelResource 还提供了其它额外的属性如 blockHandler,blockHandlerClass,fallback 用于表示限流或降级的操作(注意有方法签名要求),更多内容可以参考 Sentinel 注解支持文档。若不配置 blockHandler、fallback 等函数,则被流控降级时方法会直接抛出对应的 BlockException;若方法未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException。

注:一般推荐将 @SentinelResource 注解加到服务实现上,而在 Web 层直接使用 Spring Cloud Alibaba 自带的 Web 埋点适配。Sentinel Web 适配同样支持配置自定义流控处理逻辑,参考 相关文档。

以上例子都是在 Web Servlet 环境下使用的。Sentinel 目前已经支持 Spring WebFlux,需要配合 spring-boot-starter-webflux 依赖触发 sentinel-starter 中 WebFlux 相关的自动化配置。

Fegin支持

Sentinel 适配了 Feign 组件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2 个步骤:

  • 配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true

  • 加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:


	org.springframework.cloud
	spring-cloud-starter-openfeign

这是一个 FeignClient 的简单使用示例:

@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    String echo(@PathVariable("str") String str);
}

class FeignConfiguration {
    @Bean
    public EchoServiceFallback echoServiceFallback() {
        return new EchoServiceFallback();
    }
}

class EchoServiceFallback implements EchoService {
    @Override
    public String echo(@PathVariable("str") String str) {
        return "echo fallback";
    }
}

Feign 对应的接口中的资源名策略定义:httpmethod:protocol://requesturl。@FeignClient注解中的所有属性,Sentinel 都做了兼容。

其他服务调用适配支持请参考:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6%E7%9A%84%E9%80%82%E9%85%8D

Sentinel 控制台

Sentinel 控制台提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。

注意: 集群资源汇总仅支持 500 台以下的应用集群,有大概 1 - 2 秒的延时。

Spring Cloud:限流熔断 - 整合阿里Sentinel_第2张图片

 

开启该功能需要3个步骤:

获取控制台

您可以从 release 页面 下载最新版本的控制台 jar 包。

您也可以从最新版本的源码自行构建 Sentinel 控制台:

  • 下载 控制台 工程

  • 使用以下命令将代码打包成一个 fat jar: mvn clean package

启动控制台

Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

如若8080端口冲突,可使用 -Dserver.port=新端口进行设置。

客户端接入控制台

引入JAR包

客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。您可以通过 pom.xml引入 JAR 包:

如已引入spring-cloud-starter-openfeign则默认依赖。


    com.alibaba.csp
    sentinel-transport-simple-http
    x.y.z

配置控制台信息

application.yml

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
		dashboard: localhost:8080

这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。默认是8719,有冲突会尝试向后探测。

更多 Sentinel 控制台的使用及问题参考: Sentinel 控制台文档 以及 Sentinel FAQ

确保客户端有访问量,Sentinel会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。

通过控制台查看机器列表和健康情况

Spring Cloud:限流熔断 - 整合阿里Sentinel_第3张图片

未完待续

后续补充sentinel整合spring gateway,以及集群功能...

 

参考资料

  • spring-cloud-alibaba

  • alibaba/Sentinel

  • 官网

 

你可能感兴趣的:(Spring,Cloud,spring,boot,spring,cloud,spring,cloud,alibaba,阿里云)