springcloud组件 ----- Sentinel

介绍

Sentinel是阿里巴巴开源的一款断路由实现。
特征:
丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如:秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
完备的实时监控:Sentinel同时提供实时的监控功能,您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群汇总运行情况
广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的整合模块,例如与SpringCloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并运行简单的配置即可快速地接入Sentinel。
完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel可以简单的分为Sentinel核心库和Dashboard。核心库不依赖Dashboard,但是结合Dashboard可以取得最好的效果。
使用Sentinel来进行熔断保护,主要分为几个步骤:
1.定义资源
2.定义规则
3.检验规则是否生效
资源:可以是任何东西,一个服务,服务里的方法,甚至是一段代码。
规则:Sentinel支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。Sentinel的所有规则都可以在内存动态地查询及修改,修改之后立即生效

Sentinel中的管理控制台

下载启动控制台

(1)获取Sentinel控制台
下载地址:https://github.com/alibaba/Sentinel/releases,找到xxxxx在这里插入图片描述
点击下载就好
(2)启动

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

注意后面的文件名称。
启动控制台后进入:localhost:8080/
访问的用户名/密码:sentinel/sentinel

将所有的服务交给控制台管理

客户端接入Sentinel管理控制台
在客户端(需要管理微服务上)引入坐标

  • 在父工程中引入版本信息:
<dependencyManagement>
    <dependencies>
		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
  	</dependencies>
</dependencyManagement>
  • 在子工程中引入
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

在客户端配置启动参数

spring:
  cloud:
      sentinel:
        transport:
          dashboard: localhost:8080 #sentinel控制台的请求地址

结果就是可以在控制台中看到管理信息(注意,sentinel使用了懒加载模式(默认),需要你进行访问过这个微服务,它才会显示出来):在这里插入图片描述

Sentinel资源保护

 /**
     * @SentinelResource
     *      blockHandler:声明熔断时调用的降级方法
     *      fallback:抛出异常所执行的降级方法
     * 		value:自定义的资源名称
     * */
    @SentinelResource(blockHandler = "getProductBlockHandler",fallback = "getProductFallback")
    @RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
    public String get(@PathVariable Long id){
        return restTemplate.getForObject("http://product-service/product/getProduct/"+id,String.class);
    }

    //sentinel降级方法
    /**
     * sentinel
     *      熔断执行的降级方法
     *      抛出异常执行的降级方法
     * */
    public String getProductFallback(Long id){
        return "抛出了异常执行的降级方法";
    }

    public String getProductBlockHandler(Long id){
        return "触发了熔断的降级方法";
    }

上面用了 @SentinelResource这个注解进行了熔断保护,另外,还指定了两个降级方法,@SentinelResource还有其他的属性可以设置,可以自行百度。

熔断设置

我们上面并没有对产生熔断的值进行设置,那么这个值应该在哪里设置呢?
在sentinel的后台管理界面就可以设置
在这里插入图片描述
在这里就可以进行很多的设置,另外左边栏的那些也可以设置

持久化配置实例:限流规则设置

如果只是手动在控制台中配置,则会出现sentinel重启导致数据丢失的问题,所以,最好能在每个微服务中自行配置规则。

  • 配置文件
spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          file:
            file: classpath: flowrule.json
            data-type: json
            rule-type: flow

著名配置文件的位置,我这里放在与application.yml的同级目录下

  • 创建一个json文件
[
  {
    "resource":"getProduct",
    "controlBehavior":0,
    "count":1,
    "grade":1,
    "limitApp":"default",
    "strategy":0
  }
]

各个参数的含义:
resource:资源名,即限流规则的作用对象(这个即为@SentinelResource的value值或者默认值)
count:限流阈值
grade:限流阈值类型(QPS或并发线程数)
limitApp:流控针对的调用来源,若为default则不区分调用来源
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)

对RestTemplate的支持(配置一个公用的降级方法)

在上面说到的设置熔断保护的方法中,每个资源都要设置@SentinelResource,而且给每个资源配置一个降级方法,就显得太麻烦了,因此,sentinel还提供了对RestTemplate的支持

  • 在构造RestTemplate的时候加上注解@SentinelRestTemplate
/***
     * sentinel支持对restTemplate的服务调用使用sentinel方法,在构造RestTemplate
     * 对象的时候,只需要加载@SentinelRestTemplate即可
     *
     * 资源名:
     *      httpmethod:schema:/host:post/path:协议、主机、端口和路径
     *      httpmethod:schema:host:port:协议、主机和端口
     *
     * @SentinelRestTemplate
     *      异常降级:
     *          fallback:降级方法
     *          fallbackClass:降级配置类
     *      限流熔断:
     *          blockHandler
     *          blockHandlerClass:
     * */
    @Bean
    @LoadBalanced
    @SentinelRestTemplate(fallback = "handleFallBack",fallbackClass = SentinelFallback.class,
            blockHandler = "handleBlock",blockHandlerClass = SentinelFallback.class)
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
  • 降级类
public class SentinelFallback {
    /**
     * 静态方法
     *      返回值:SentinelClientHttpResponse
     *      参数:request,byte[],clientHttpRequestExecution,blockException
     * 注意:SentinelClientHttpResponse传入的返回值应该和Controller方法中返回的返回值一致,即最好所有的接口统一返回值
     * */
    //限流降级方法
    public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution clientHttpRequestExecution, BlockException blockException){
        return new SentinelClientHttpResponse("限流熔断降级");
    }
    //异常降级方法
    public static SentinelClientHttpResponse handleFallBack(HttpRequest request, byte[] body, ClientHttpRequestExecution clientHttpRequestExecution, BlockException blockException){
        return new SentinelClientHttpResponse("异常熔断降级");
    }
}

然后在后台控制页面进行设置就可以了

对Feign的支持

  • 引入依赖
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 开启sentinel支持
feign:
  sentinel:
    enabled: true #开启sentinel的支持
  • 配置FeignClient
/**
 * 声明需要调用的微服务名称
 * @FeignClient
 *          name:服务提供者的名称
 * */
@FeignClient(name="product-service",fallback = ProductFeignClientCallBack.class)
public interface ProductFeignClient {

    /**
     * 配置需要调用的接口
     * */
    @RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
    String getProduct(@PathVariable("id") Long id);

}
  • 配置熔断方法
@Component
public class ProductFeignClientCallBack implements ProductFeignClient {
    @Override
    public String getProduct(Long id) {
        return "抱歉,出错了";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值