Spring Cloud

spring cloud alibaba - Sentinel哨

2020-03-25  本文已影响0人  _大叔_

Sentinel 以 流量 为切入点,在流量控制,断路和负载保护等多个领域工作,以保护服务可靠性。官网地址

一、Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

Sentinel 功能和设计理念

流量控制

什么是流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

流量控制设计理念

流量控制有以下几个角度:

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级

什么是熔断降级

除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。

Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。

熔断降级设计理念

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

Hystrix 通过 线程池隔离 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。

Sentinel 对这个问题采取了两种手段:

和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。

除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

二、实战

导包
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 监控控制台 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
</dependency>

注解形式

  注解的形式要做限流的话需要和 Sentinel 控制台 搭配才能做到,这里我们先说注解的形式使用。

    @GetMapping("/sentinelTest")
    @SentinelResource("sentinelTest")
    public String sentinelTest(){
        return "hello Sentinel";
    }

  对于 @SentinelResource 参数解释 看这里

  下载 sentinel-dashboard.jar 并启动

java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8810 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

  建议 Dserver.port 和 Dcsp.sentinel.dashboard.server的port不要一样,否则自己也会被监控,没有必要。也可以启动不加 Dcsp.sentinel.dashboard.server,其意义是为了让在 dashbord 被发现。

   sentinel-dashboard并不用考虑负载和并发问题,因为sentinel-dashboard是主动去请求你的client端的,会把配置的规则发给client,client在执行的时候自己做校验,只有在client 被执行的时候 会向 sentinel-dashboard 通信,看是否在 sentinel-dashboard 注册,或者说是看 sentinel-dashboard 是否记录了我的IP peort applicationName等信息。

   刚启动的控制台实则什么也没有,需要 client 被执行后才能注册到 sentinel-dashboard 上。

启动 client
-Dcsp.sentinel.dashboard.server=192.168.31.34:8888

   spring boot 项目中可以使用以下让其发现client端

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8888

  访问接口

测试接口限流

三、日志

   sentinel的日志在请求之后,默认用户路径下生成,在windows下是在C盘,mmp(C盘本来就不大),改掉日志的存储需要在项目中加入以下,就会在当前项目下创建 /sentinel/log 日志。

# sentinel 日志
spring.cloud.sentinel.log.dir=./sentinel/log
上一篇 下一篇

猜你喜欢

热点阅读