微服务——Sentinel限流熔断入门

1.(拓展)模拟服务的注册与发现(多线程)

  • ConcurrentHashMap 线程安全 底层是桶状结构
  • HashTable 排他锁
  • 读写锁的使用 悲观写 乐观读
  • 考虑安全与性能
  • HashMap通常用于单线程或者方法内部使用 因为线程不安全

2.Sentinel限流熔断

2.1准备工作

2.1.1下载并启动Sentinel

启动命令

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

微服务——Sentinel限流熔断入门_第1张图片

2.1.2登录Sentinel

微服务——Sentinel限流熔断入门_第2张图片

2.2入门案例

2.2.1在provider中添加sentinel依赖

 <!--添加sentinel依赖-->
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-sentinel
        

添加sentinel依赖 会在项目中添加一个拦截器对象,这个对象会对服务发出的请求进行拦截,拦截到请求以后,会与sentinel控制台定义的规则进行比对,假如在允许的范围之内,则继续访问,否则进行限流或者降级

2.2.2修改yml文件

2.2.3新建Controller层

package com.jt.provider.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/provider")
public class ProviderSentinelController {
    @GetMapping("/sentinel01")
    public String sentinel01(){
        return "sentinel 01 text";
    }
}

实现效果
微服务——Sentinel限流熔断入门_第3张图片
微服务——Sentinel限流熔断入门_第4张图片

2.2.4测试限流

微服务——Sentinel限流熔断入门_第5张图片
微服务——Sentinel限流熔断入门_第6张图片

sentinel限流的基本原理

  • 底层拦截请求,通过流控规则限定对资源的访问
  • 拦截器
    在这里插入图片描述

2.3流控模式

链路限流/关联限流

2.3.1关联模式

微服务——Sentinel限流熔断入门_第7张图片
微服务——Sentinel限流熔断入门_第8张图片

2.3.2链路模式

  • @SentinelResource作用:使用此注解描述的方法,在此方法被访问时
    会在sentinel的簇点链路中显示,此注解中指定的名字就是资源名,我们可以对这个资源进行访问, 按照指定的链路进行限流设计.

创建Service层

package com.jt.provider.service;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;
@Service
public class ResourceService {
    @SentinelResource("doGetResource") /*使用此注解描述的方法,在此方法被访问时
    会在sentinel的簇点链路中显示,此注解中指定的名字就是资源名,我们可以对这个资源进行访问,
    按照指定的链路进行限流设计*/
    public String doGetResource(){
        return "do get resource";
    }
}

更新Controller层

/*测试链路模式*/
    @Autowired
    private ResourceService resourceService;
    @GetMapping("/sentinel03")
    public String sentinel03(){
        resourceService.doGetResource();
        return "sentinel 03 text";
    }

微服务——Sentinel限流熔断入门_第9张图片
微服务——Sentinel限流熔断入门_第10张图片
实现效果
微服务——Sentinel限流熔断入门_第11张图片

3.@SentinelResource异常处理

package com.jt.provider.service;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;
@Service
public class ResourceService {
    /*使用此注解描述的方法,在此方法被访问时
    会在sentinel的簇点链路中显示,此注解中指定的名字就是资源名,我们可以对这个资源进行访问,
    按照指定的链路进行限流设计
    指定异常处理类中的方法(此方法的返回值类型、参数要与@SentinelResource注解描述的方法参数一致,
     参数类型可以加异常类型,而且方法必须是静态的)*/
    @SentinelResource(value="doGetResource",
                      blockHandler ="call" ,
                      blockHandlerClass =ResourceBlockHandler.class )
    public String doGetResource(){
        return "do get resource";
    }
}

异常处理类

  • 注意:此方法中的异常类型必须为BlockException,所有限流降级的父类
package com.jt.provider.service;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/*异常处理类*/
@Service
@Slf4j
public class ResourceBlockHandler {
    public static String call(BlockException e){
        log.error("block ",e.getMessage());
        return "访问太频繁了,请稍等片刻";
    }
}

修改service

package com.jt.provider.service;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;
@Service
public class ResourceService {
    /*使用此注解描述的方法,在此方法被访问时
    会在sentinel的簇点链路中显示,此注解中指定的名字就是资源名,我们可以对这个资源进行访问,
    按照指定的链路进行限流设计
    blockHandler指定异常处理类中的方法(此方法的返回值类型、参数要与@SentinelResource注解描述的方法参数一致,
     参数类型可以加异常类型,而且方法必须是静态的)*/
    @SentinelResource(value="doGetResource",
                      blockHandler ="call" ,
                      blockHandlerClass =ResourceBlockHandler.class)
    public String doGetResource(){
        return "do get resource";
    }
}
  • fallback、fallbackClass 处理业务异常 方法加Throwable类型参数
  • blockHandler、blockHandlerClass 方法加BlockException类型参数

总结

  • 限流作用:系统的处理能力有限,保证系统的可靠运行
  • 限流模式:直接、关联、链路
  • sentinel限流的基本原理:底层拦截请求,通过流控规则限定对资源的访问
  • sentinel限流算法:滑动窗口算法(默认算法:把时间分成若干块)、计数、令牌桶、漏桶
  • sentinel限流效果:快速失败、预热、排队

你可能感兴趣的:(微服务,微服务,java,microservices)