Sentinel(服务限流,熔断,降级,热点规则,@SentinelResource,整合openfeign,sentnel持久化)个人笔记

Sentinel(服务限流,熔断,降级,@SentinelResource,整合openfeign,sentnel持久化)个人笔记

1.服务限流

在这里插入图片描述
链路
在这里插入图片描述
关联
在这里插入图片描述

若果是直接的话,代表的意思就是,若果访问/testa的线程数大于二则直接响应默认错误信息。

在这里插入图片描述

冷加载 代表着如果在开始的时只能吃力10/3个请求,超过则报默认错误,5秒后增加到每秒处理10个请求,这个时候在每秒超过10个请求依旧报错。

排队等待在这里插入图片描述

服务熔断降级策略

  1. 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用
    RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
    状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  2. 异常比例
    (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
    状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% -
    100%。
  3. 异常数
    (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
    状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

在这里插入图片描述
代表 在统计时间1秒内,若果有超过5个请求且百分之白的请求的响应时间都超过0.2秒则熔断降级,时间为5秒

在这里插入图片描述
表示, 在统计时间1秒内,若果有超过5个请求,且50%都的请求出现错误则熔断降级,熔断时间为5秒

在这里插入图片描述

表示, 在统计时间1秒内,若果有超过5个请求,且有4个请求出现异常则熔断降级,时间为5秒

    @GetMapping("/hotspot")
    @SentinelResource(value = "hotspot",blockHandler = "blockHotspot")
    public String hotspot(@RequestParam(value = "id1",required = false) String id1,
                          @RequestParam(value = "id2",required = false) String id2){
        return "..........hotspot";
    }

    /**
     * 兜底的方法(参数要和被兜底的方法一样且 有BlockException exception)
     * @param id1
     * @param id2
     * @param exception
     * @return
     */
    public String blockHotspot(String id1, String id2, BlockException exception){
        return "┭┮﹏┭┮";
    }
 @SentinelResource(value = "byResource",blockHandlerClass = MyBlockHandel.class,blockHandler = "handleException2")

value:值唯一,一般个请求路径一直
blockHandler :为兜底的方法名
blockHandlerClass:为全局兜底方法的类.class
fallback :负责业务异常(java代码异常)(参数为自定义异常方法)
blockHandler:只负责sentinel控制台配置违规 (参数为自定义违规方法)

@GetMapping("/consumer/fallback/{id}")
    @SentinelResource(value = "fallback",fallback = "handlerFallback",blockHandler = "blockHandler")
    public CommonResult<Payment> fallback(@PathVariable Long id) {
        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id, CommonResult.class,id);

        if (id == 4) {
            throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常....");
        }else if (result.getDate() == null) {
            throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异常");
        }
        return result;
    }
    //fallback
    public CommonResult handlerFallback(@PathVariable  Long id,Throwable e) {
        Payment payment = new Payment(id,"null");
        return new CommonResult<>(444,"兜底异常handlerFallback,exception内容  "+e.getMessage(),payment);
    }
    //blockHandler
    public CommonResult blockHandler(@PathVariable  Long id, BlockException blockException) {
        Payment payment = new Payment(id,"null");
        return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException  "+blockException.getMessage(),payment);
    }

这样的话就都可以起到作用,且如果同时有java异常和违规的话执行违规的兜底方法

意思为若果不符合定义的规则,找到MyBlockHandel这个类的handleException2这个静态方法执行。
必须是静态。

热点规则在这里插入图片描述

代表访问这个/byResource中的第一个参数它的类型是String且他的值是5的时候
那么他可以每秒访问200次,若不是5则只能每秒访问1次。

访问url和资源名的区别

访问url若不符合规则那么会掉用默认的错误处理方法。
Blocked by Sentinel (flow limiting)
访问资源名若不符合规则那么会掉用自己定义的方法,若自己没有定义那么还是会调用默认的错误处理方法。

OpenFeign与sentinel的整合

##1. 导入相关jar包

 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 </dependency>

##2. 开启sentinel对feign的支持(在yaml中)

feign:
  sentinel:
    enabled: true

##3. 主启动上标注上相关注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients

##4. 编写feign接口

@FeignClient(value = "nacos-payment-provider",fallback = MyFeignImpl.class)
public interface MyFeign {
    @GetMapping(value = "/paymentSQL/{id}")
    public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id);
}

@FeignClient注解属性

value 填写微服务名
fallback 为兜底的方法MyFeignImpl此类要实现MyFeign
@GetMapping(value = “/paymentSQL/{id}”)必须和服务提供者一样
@PathVariable(“id”) Long id参数也是
方法名可以不相同但建议相同

##5. 编写feign实现类

@Component
public class MyFeignImpl implements MyFeign {
    /**
     * feign的异常处理兜底方法
     * @param id
     * @return
     */
    @Override
    public CommonResult<Payment> paymentSQL(Long id) {
        return new CommonResult<Payment>(4444,"兜底异常处理",new Payment(1L,"333333"));
    }
}

此类需要注入到ioc容器中(若果在调用出错了,或者异常,或者违规都会调用次兜底的方法)

##6. 使用feign

	@Resource//java自带的依赖注入(和@Autowired作用相同)
    private MyFeign feign;

    @GetMapping(value = "/consumer/paymentSQL/{id}")
    public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id){
        return feign.dasddasd(id);
    }

sentinel持久化

  ## 1.导入jar
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
## 2.修改yaml文件

将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上Sentinel上的流控规则持续有效

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848  #nacos服务器地址
            dataId: ${spring.application.name} #微服务名
            groupId: DEFAULT_GROUP #默认的组
            data-type: json  #数据类型
            rule-type: flow #流控规则
      transport:
        port: 8719
        dashboard: localhost:8080
    nacos:
      discovery:
        server-addr: localhost:8848
management:
  endpoints:
    web:
      exposure:
        include: '*'

datasource:
ds1:
nacos:
server-addr: localhost:8848 #nacos服务器地址
dataId: ${spring.application.name} #微服务名
groupId: DEFAULT_GROUP #默认的组
data-type: json #数据类型
rule-type: flow #流控规则

## nacos中添加配置

在这里插入图片描述

[
    {
         "resource": "/testa",
         "limitApp": "default",
         "grade":   1,
         "count":   1,
         "strategy": 0,
         "controlBehavior": 0,
         "clusterMode": false    
    },
    {
         "resource": "/testb",
         "limitApp": "default",
         "grade":   1,
         "count":   1,
         "strategy": 0,
         "controlBehavior": 0,
         "clusterMode": false    
    }
]

类容解释
在这里插入图片描述

表示对/teata和/testb进行以下配置
在这里插入图片描述

未解决的问题

目前还不知道rest风格的请求方式如何限流
@GetMapping("/testc/{id}")

问题解决:
使用openFeign进行远程调用的时候
sentinel上出现这个簇点在这里插入图片描述
可以进行限流以及其他操作

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值