Sentinel主流框架的适配

简介: Sentinel Apache Dubbo Adapter (for 2.7.x+)

目录

注:模组模块仅提供相应适配功能,若要求接入哨兵,请避免参考哨兵指示文档

云原生微服务体系

春云

Spring Cloud 阿里巴巴提供微服务开发的解决方案。Sentinel 与 Spring Boot/Spring Cloud 的整合见Sentinel Spring Cloud Starter

Spring Cloud 阿里巴巴默认为 Sentinel 整合了 Servlet、RestTemplate、FeignClient 和 Spring WebFluxSentinel 在 Spring Cloud 生态中,心灵补全 Hystrix 在 Servlet 和 RestTemplate 这一块的空白,而且还完全了 Hystrix 在 FeignClient 中限流降级的使用,并且支持运行时动态地配置和调整限流降级规则。

Spring Cloud Alibaba Sentinel 的示例可以参考sentinel-guide-spring-cloud

夸库斯

注:从 1.8.0 版本开始支持,需要 Java 8 及以上版本。

Sentinel 提供针对 Quarkus 微服务的适配模块(支持原生镜像),可以很方便地 JAX-RS Web 服务接入并进行高防护,同时支持注解方式自定义埋点(基于 CDI)。

相关模块:

  • sentinel-jax-rs-quarkus-adapter
  • sentinel-annotation-quarkus-adapter

网络适配

注意:当前标记自带的适配器仅Dubbo 方法埋点带了热点参数,其他适配模块(如Web)默认不支持关注规则,可通过自定义埋点方式指定新的资源名称并期望的参数。注意自定义埋点的资源名不要和适配模块生成的资源名重复,否则会导致重复统计。

网络服务小程序

Sentinel 提供针对 Servlet 的原生接入流量进行控制,可以对 Web 进行控制。使用时需引入以下模块(以 Maven 为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-web-servlet</ artifactId >

   <版本>xyz</版本>

</依赖>

您只需要在Web容器中的web.xml配置文件中进行如下配置开启哨兵支持:

<过滤器>

< filter-name >SentinelCommonFilter</ filter-name >

<过滤器类>com.alibaba.csp.sentinel.adapter.servlet.CommonFilter</过滤器类>

</过滤器>


<过滤器映射>

< filter-name >SentinelCommonFilter</ filter-name >

< url-pattern >/*</ url-pattern >

</过滤映射>

复制 SpringBoot 应用可以通过FilterRegistrationBean类进行配置,例如:

@Configuration

公共FilterConfig {


   @Bean

   public FilterRegistrationBean sentinelFilterRegistration () {

        FilterRegistrationBean< Filter > registration = new FilterRegistrationBean<> ();

       注册setFilter( new CommonFilter ());

       注册addUrlPatterns( " /* " );

       注册setName( " sentinelFilter " );

       注册设置顺序( 1 );


       退货登记;

   }

}

接入滤波之后,所有访问的网页的URL就会被自动统计为哨兵的资源,可以针对单个URL维度进行流控。若希望区分不同的HTTP方法,将可以HTTP_METHOD_SPECIFY这个初始化参数设为true,则给每个URL资源加上前缀,例如GET:/foo

限流处理逻辑:默认情况下,当请求被限流时会返回默认的提示页面Blocked by Sentinel (flow limiting)。您也可以通过 JVM 参数-Dcsp.sentinel.web.servlet.block.page或代码中调用WebServletConfig.setBlockPage(blockPage)方法设置自定义的跳转 URL,当请求被限流时会自动跳转到设置好的 URL。同样你也可以实现UrlBlockHandler接口并写自定义化的限流处理逻辑,然后将其注册到WebCallbackManager中。

提示:1.7.0 版本开始默认的限流页面 HTTP 返回码是429。您可以通过csp.sentinel.web.servlet.block.status配置项自定义限流页面的 HTTP 状态码。

按来源限流:若希望对HTTP请求按照来源限流,可以则实现自己RequestOriginParser接口从HTTP请求中解析起源并注册至WebCallbackManager。中注意来源数目不能太多,若太多请自定义埋点作为参数传入并使用热点规则。

注意:Snel Web Filter 某个特定的 URL 作为不同的资源处理,因此对于 REST 风格的 API,需要自己实现UrlCleaner接口查找一下资源(比如/foo/:idURL 都归到/foo/*资源下),然后将WebCallbackManager否则会导致资源注册数量过多,超出资源上限值(当前是6000)时多出的资源规则将不会生效

1.6.3版本开始,UrlCleaner自从从网络过滤掉不希望统计的URL,只需要在UrlCleaner中将不希望统计的URL转换成空字符串("")分类。示例:

网络回调管理器setUrlCleaner(UrlCleaner(){

    @覆盖

   公共字符串干净字符串originUrl){

       如果(originUrl ==|| originUrl 的isEmpty()){

           回报originUrl;

       }


       //比如将满足/富/ {ID}的URL都归到/富/ *

       如果(originUrl startsWith( /富/ )){

           返回 /富/ * ;

       }

       //不希望统计* .ICO的资源文件,可以将其转换为空字符串(因为1.6.3)

       如果(originUrl的endsWith( .ICO )){

           返回 ;

       }

       返回originUrl;

   }

});

如果您正在使用 Spring Boot / Spring Cloud,则可以通过 Spring Cloud 阿里巴巴 Sentinel 来更方便地整合 Sentinel,详情请参阅Spring Cloud 阿里巴巴文档

弹簧 WebFlux

注:从 1.5.0 版本开始支持,需要 Java 8 及以上版本。

Sentinel 提供与 Spring WebFlux 的整合模块,从而实现 Reactive Web 应用也可以利用 Sentinel 的流控降级来稳定。该集成模块基于 Sentinel Reactor Adapter 实现。

使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-spring-webflux-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

使用时对应的SentinelWebFluxFilter实例以及SentinelBlockExceptionHandler实例。例如:

@Configuration

公共WebFluxConfig {


   私有最终列表< ViewResolver > viewResolvers;

   私有最终ServerCodecConfigurer serverCodecConfigurer;


   公共WebFluxConfigObjectProvider <列表<的ViewResolver > > viewResolversProvider

                         ServerCodecConfigurer serverCodecConfigurer){

       viewResolvers = viewResolversProvider getIfAvailable(集合:: emptyList);

       这个serverCodecConfigurer = serverCodecConfigurer;

   }


   @Bean

   @Order ( - 1 )

    public SentinelBlockExceptionHandler sentinelBlockExceptionHandler () {

        //为 Spring WebFlux 注册块异常处理程序。

       返回新的SentinelBlockExceptionHandler (viewResolvers, serverCodecConfigurer);

   }


   @Bean

   @Order ( - 1 )

    public SentinelWebFluxFilter sentinelWebFluxFilter () {

        //注册 Sentinel WebFlux 过滤器。

       返回新的SentinelWebFluxFilter ();

   }

}

您可以在WebFluxCallbackManager注册页面进行定制:

  • setBlockHandler:注册函数用于实现自定义的逻辑处理被限流的请求,对应接口BlockRequestHandler。默认实现为DefaultBlockRequestHandler,当被限流时会返回下面的错误信息:Blocked by Sentinel: FlowException
  • setUrlCleaner:注册函数用于 Web 资源名的归一化。函数类型为(ServerWebExchange, String) → String,对应为(webExchange, originalUrl) → finalUrl
  • setRequestOriginParser:注册函数用于从请求中解析请求来源。函数类型为ServerWebExchange → String

相关示例:sentinel-demo-spring-webflux

JAX-RS (Java EE)

注:从 1.8.0 版本开始原生支持。若您的服务是 Spring Web 服务,可参考 Spring Web 适配文档接入。

哨兵-jax-rs-适配器

RPC适配

达博

Sentinel 提供 Dubbo 的相关适配Sentinel Dubbo Adapter,主要包括针对 Service Provider 和 Service Consumer 实现的 Filter。 相关模块:

  • sentinel-apache-dubbo-adapter(Apache Dubbo2.7.x及以上版本,自Sentinel1.5.1开始支持)
  • sentinel-dubbo-adapter(dubbo 2.6.x版本)

对于Apache Dubbo 2.7.x及以上版本,使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-apache-dubbo-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

对于 Dubbo 2.6.x及以下版本,使用时需引入以下模块(以 Maven 为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-dubbo-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

引入此依赖后,Dubbo 的服务接口和方法(包括调用端和服务端)将成为 Sentinel 中的资源,在配置了规则后就可以自动获得 Sentinel 的防护能力。

注:若只希望接入仪表板,请参考接入Dubbo适配器接入接入D的步骤

如果不希望开启 Sentinel Dubbo Adapter 中的某个过滤器,可以手动关闭对应的过滤器,例如:

<!--关闭 Sentinel 对应的服务消费者过滤器-->

< dubbo : consumer filter = " -sentinel.dubbo.consumer.filter " />

限流粒度是服务接口和服务方法粒度:

  • 服务接口:resourceName 为接口全限定名,如com.alibaba.csp.sentinel.demo.dubbo.FooService
  • 服务方法:resourceName 为接口全限定名:方法签名,如com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)

Sentinel Dubbo Adapter 还支持配置的后备函数,可以在 Dubbo 服务被限流/降级/负载保护的时候进行相应的后备处理。用户只需要实现自定义的DubboFallback接口,并通过DubboFallbackRegistry注册。默认情况会直接将BlockException包装后抛出。同时,我们还可以配合达博的回退机制来为降级的服务提供替代的实现。

我们提供了 Dubbo 的相关示例,请查看sentinel-demo-dubbo

关于 Sentinel 在 Dubbo 中的最佳实践,请参考Sentinel: Dubbo 服务的流量哨兵

关于 Dubbo Filter 的更多信息,请参考Dubbo Filter 文档

gRPC

Sentinel 提供与gRPC Java的整合,以 gRPC ServerInterceptorClientInterceptor的形式保护 gRPC 服务资源。使用时限以下模块(以 Maven 为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-grpc-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

在使用 Sentinel gRPC Adapter 时,非常适合对应的Interceptor注册到对应的客户端或服务端中。其中客户端的示例如下:

公共ServiceClient {


   私人最终ManagedChannel频道;


   ServiceClient字符串主机int端口){

        this . 频道= ManagedChannelBuilder forAddress(主机,端口)

           .intercept( new SentinelGrpcClientInterceptor ()) //在此处注册拦截器

           。建造();

       //在此处初始化客户端stub类

   }

}

服务端的示例如下:

导入io.grpc.Server


服务器服务器= ServerBuilder forPort(端口)

    .addService( new MyServiceImpl ()) //添加自己的服务实现

    .intercept( new SentinelGrpcServerInterceptor ()) //在此处注册拦截器

    .build();

注意:Sentinel gRPC Adapter 目前只支持一元调用。

假装

Feign适配整合在Spring Cloud Alibaba中,可以参考Spring Cloud Alibaba Sentinel文档进行接入。

SOFARPC

从1.7.2版本开始,Sentinel提供了SOFARPC的适配模块sentinel-sofa-rpc-adapter,主要包括针对Service Provider和Service Consumer实现的Filter。使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-sofa-rpc-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

引入此依赖后,Sentinel 会自动统计 SOFARPC 的服务接口和方法调用(包括调用端和服务端),在配置了规则后就可以自动获得 Sentinel 的防护能力。

HTTP 客户端适配

Apache HttpClient

注:从 Sentinel 1.8.0 版本开始支持。

Sentinel提供Apache HttpClient的适配模块sentinel-apache-httpclient-adapter,可以针对HTTP客户端请求进行流控和熔断。使用时需引入以下模块(Maven示例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-apache-httpclient-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

注意目前暂不支持 AsyncHttpClient。

OkHttp

注:从 Sentinel 1.8.0 版本开始支持。

Sentinel提供OkHttp的适配模块sentinelok http-adapter,可以针对HTTP客户端请求进行流控和熔断。使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-okhttp-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

无功适配

反应堆

注:从 1.5.0 版本开始支持,需要 Java 8 及以上版本。

前哨提供反应器的适配,可以方便地在反应性应用中接入前哨使用时需引入以下模块(以Maven的为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-reactor-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

Sentinel Reactor Adapter 分别针对MonoFlux实现了对应的 Sentinel Operator,从而在各种事件时触发汇入 Sentinel 的逻辑。同时 Sentinel 在相关阶段提供SentinelReactorTransformer对应的操作符,用户使用时只需要通过transform操作符来进行渐变。

一些服务doSomething() //返回类型:Mono<T> or Flux<T>

  .transform( new SentinelReactorTransformer<> (resourceName)) //在此处进行变换

  .subscribe();

API网关适配

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。

春云网关

从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:

  • route 维度:即在 Spring 中配置的路由入口,资源文件名称对应的 routeId
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 表现

使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-spring-cloud-gateway-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

使用时对应的SentinelGatewayFilter实例以及SentinelGatewayBlockExceptionHandler实例。例如:

@Configuration

公共GatewayConfiguration {


   私有最终列表< ViewResolver > viewResolvers;

   私有最终ServerCodecConfigurer serverCodecConfigurer;


   公共GatewayConfigurationObjectProvider <列表<的ViewResolver > > viewResolversProvider

                                ServerCodecConfigurer serverCodecConfigurer){

       viewResolvers = viewResolversProvider getIfAvailable(集合:: emptyList);

       这个serverCodecConfigurer = serverCodecConfigurer;

   }


   @Bean

   @Order ( Ordered . HIGHEST_PRECEDENCE )

    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler () {

        //注册 Spring Cloud Gateway 的块异常处理程序。

       返回新的SentinelGatewayBlockExceptionHandler (viewResolvers, serverCodecConfigurer);

   }


   @Bean

   @Order ( - 1 )

    public GlobalFilter sentinelGatewayFilter () {

        return new SentinelGatewayFilter ();

   }

}

演示示例:sentinel-demo-spring-cloud-gateway

详细文档可以参考网关限流 - Spring Cloud Gateway 文档

祖尔 1.x

Sentinel 提供了 Zuul 1.x 的适配模块,为 Zuul Gateway 提供了两种资源维度的限流:

  • route对应的维度:即在Spring中配置的条目,资源名称对应的路由ID(RequestContext中的proxy字段)
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 表现

使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-zuul-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

详细文档可以参考网关限流 - Zuul 1.x

如果您正在使用 Spring Cloud Zuul Starter,那么可以通过引入spring-cloud-alibaba-sentinel-zuul来更方便地整合 Sentinel。请参考对应的文档

祖尔 2.x

注:从 1.7.2 版本开始支持,需要 Java 8 及以上版本。

Sentinel 提供了 Zuul 2.x 的适配模块,为 Zuul Gateway 提供了两种资源维度的限流:

  • 路线维度:对应SessionContext中的 routeVIP
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 表现

使用时需引入以下模块(以Maven为例):

<依赖>

   < groupId >com.alibaba.csp</ groupId >

   < artifactId >sentinel-zuul2-adapter</ artifactId >

   <版本>xyz</版本>

</依赖>

详细文档可以参考网关限流 - Zuul 2.x

Apache RocketMQ

在 Apache RocketMQ 中,当去消费消费消息的时候,无论是通过拉的方式还是推的方式,都可能会出现大时候的消息突刺。如果此时要处理所有消息可能会导致系统负载过时高,稳定性。但实际上可能有几秒之内都消息投递,如果没有直接把消息丢掉则可以充分利用系统的消息能力,我们希望把消息突袭均匀摊到可以处理内,让系统。坚持保持在消息处理水位的同时,还有更多消息,即将到来的“削峰填谷”的效果:

我们可以看到消息突发的部分总是短暂的、没有开始的,后系统通常有其资源。我们希望把红色的消息处理能力的一部分。哨兵专门为场景提供了某种速度的特性,可以让系统突然出现大量的大量信息。请求以同速的形式均匀,以固定的时间间隔让请求,以稳定的速度逐步处理通过这些请求突,流量的“削峰填谷”效果,从而避免造成系统过度消耗。将不会主动,逐步进行处理;当请求对方时间过长则直接拒绝,是拒绝全部请求。

比如在 RocketMQ 的场景下配置了同速模式下 QPS 为 5,每 200 毫秒处理一条消息,额外的处理任务将请求请求;同时设置了超时时间为 5 秒,生产时间长超过 5 的处理任务将直接被拒绝。如下图所示:

RocketMQ 用户可以根据不同的组和不同的主题分别设置限流规则,限流控制模式设置为同速器模式(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),例如:

private void initFlowControlRule() {

    FlowRule rule = new FlowRule ();

   规则设置资源();//对应的key为`groupName:topicName`

   规则setCount( 5 );

   规则setGrade( RuleConstant . FLOW_GRADE_QPS );

   规则setLimitApp( 默认 );


   //同速器模式下,设置的QPS为5,则请求每200毫秒允许通过1个

   规则setControlBehavior( RuleConstant . CONTROL_BEHAVIOR_RATE_LIMITER );

   //如果更多的请求到达,这些请求会被置于虚拟的等待队列中。等待队列有一个最大超时,如果请求预计的等待时间超过这个时间会直接被块

   //在这里,超时为5秒

   规则. setMaxQueueingTimeMs( 5 * 1000 );

   流规则管理器loadRules( Collections . singletonList(rule));

}

结合RocketMQ客户端使用Sentinel时,用户需要在处理消息时手动埋点。详情请见Sentinel RocketMQ Demo。相关博客见Sentinel为RocketMQ保驾护航

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
监控 Dubbo 搜索推荐
Spring Cloud Alibaba——Sentinel流量控制框架
Sentinel被称为分布式系统的流量防卫兵,是阿里开源流控框架,从服务限流、降级、熔断等多个维度保护服务,Sentinel提供了简洁易用的控制台,可以看到接入应用的秒级数据,并且可以在控制台设置一些规则保护应用,它比Hystrix支持的范围广,如Spring Cloud、Dubbo、gRPC都可以整合。 资源是Sentinel最关键的概念,遵循Sentinel API的开发规范定义资源,就能将应用保护起来。 而规则可以通过控制面板配置,也可以和资源联合起来,规则可以在控制台修改并且即时生效。
499 4
|
Dubbo Java 应用服务中间件
Sentinel服务框架对接Dubbo服务框架整合开发指南
开源框架适配 为了减少开发的复杂程度,Sentinel 对大部分的主流框架都进行了适配,例如:Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux 和 Reactor 等。
|
Java Sentinel 微服务
Sentinel-微服务保护框架(中)
Sentinel-微服务保护框架(中)
144 0
|
SpringCloudAlibaba Go Sentinel
「SpringCloudAlibaba系列」分布式限流框架Sentinel基本引用|
分布式限流框架Sentinel基本引用 Sentinel的基本引用 使用Sentinel的核心库实现限流,主要分以下几个步骤: 定义资源 定义限流规则 校验规则是否生效
|
存储 自然语言处理 监控
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(1): sentinel 介绍以及服务集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(1): sentinel 介绍以及服务集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(1): sentinel 介绍以及服务集成
|
Rust 自然语言处理 Cloud Native
|
存储 Java 应用服务中间件
Sentinel-微服务保护框架(下)
Sentinel-微服务保护框架(下)
164 0
|
监控 Dubbo Java
Sentinel-微服务保护框架(上)
Sentinel-微服务保护框架(上)
224 0
|
存储 开发框架 Nacos
SpringCloud微服务实战——搭建企业级开发框架(十七):Sentinel+Nacos配置持久化
Sentinel Dashboard中添加的规则是存储在内存中的,我们的微服务或者Sentinel一重启规则就丢失了,现在我们将Sentinel规则持久化配置到Nacos中,在Nacos中添加规则,然后同步到Sentinel Dashboard服务中。Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。具体可查看官网 Sentinel 规则
417 57
SpringCloud微服务实战——搭建企业级开发框架(十七):Sentinel+Nacos配置持久化
|
开发框架 Sentinel 微服务
SpringCloud微服务实战——搭建企业级开发框架(十六):集成Sentinel高可用流量管理框架【自定义返回消息】
Sentinel限流之后,默认的响应消息为Blocked by Sentinel (flow limiting),对于系统整体功能提示来说并不统一,参考我们前面设置的统一响应及异常处理方式,返回相同的格式的消息。 1、在自定义Sentinel返回消息之前,需要调整一下代码结构,因为这里要用到统一返回异常的格式,考虑到后期可能的使用问题,
330 57
SpringCloud微服务实战——搭建企业级开发框架(十六):集成Sentinel高可用流量管理框架【自定义返回消息】