目录

雪崩问题

解决雪崩问题的方法:

我们使用sentinel组件实现微服务的保护

 一:下载sentinel

二.启动sentinel

三.访问:localhost:8080 默认的账号和密码都是sentinel

 微服务整合sentinel

一.导入sentinel依赖

二.在application.yml配置文件中编写配置sentinel控制台的地址

第三步:启动微服务项目,并访问微服务的某一个接口

Sentinel设置流控

使用jmeter工具测试接口

jmeter介绍

jmeter安装

 启动

​编辑 使用

测试计划添加线程组

添加http请求行为​编辑

​编辑 添加响应结果监听器

 启动线程组

查看结果树,有一个成功,因为设置了sentinel流控设置了一秒只能访问一次这个接口

查看聚合报告

​编辑 流控模式

直接模式

关联模式


雪崩问题

微服务调用链路中的某一个服务故障,引起整个链路中所有微服务都不可用,就会造成雪崩

举个例子:一个微服务就是一个tomcat服务器,而一个tomcat服务器只有几百个线程可用,这个A服务在访问另一个B微服务时,需要60秒才能响应,那么这个A服务的所有线程都会因为B服务的长时间不响应而阻塞,最后导致A服务不可用,进而导致调用A微服务的所有微服务都不可用,这就是雪崩问题

解决雪崩问题的方法:

1.超时处理:设置超时时间,请求超过一定时间没有响应就直接返回错误信息,这样一来就不会无休止等待

2.舱壁模式:限定每一个微服务能使S用的线程数,从而避免耗尽整个tomcat的资源,因此也叫做线程隔离

3.熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该服务,拦截访问该业务的一切请求。就是一个微服务出现内部异常,一旦超过一定比例,就会有一段时间其他服务都不能访问整个出现问题的微服务,过了一段时间后才尝试进行访问,如果还是不行就继续熔断

4.流量控制:限制业务访问的QPS(每秒的访问数量),避免服务因为流量激增而故障。就是如果有几万个请求同时访问一个服务,需要把这些请求分批次少量的发送服务

我们使用sentinel组件实现微服务的保护

 一:下载sentinel

下载地址

Release v1.8.1 · alibaba/Sentinel

下载sentinel的jar包

二.启动sentinel

java -jar sentinel-dashboard-1.8.1.jar 

三.访问:localhost:8080 默认的账号和密码都是sentinel

 

如果想改端口号

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

 微服务整合sentinel

一.导入sentinel依赖

<!--        导入sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

这里我没有指定版本号,因为我在父工程已经导入了spring-cloud-alibaba的父工程来管理spring-cloud-alibaba的所有组件的版本号

<!--            SpringCloudAlibaba的父工程,管理依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

二.在application.yml配置文件中编写配置sentinel控制台的地址

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:9090 #控制台地址

第三步:启动微服务项目,并访问微服务的某一个接口

可以发现sentinel已经监控到了这个order-service微服务

簇点链路:就是项目内的调用链路,链路中被监控的每一个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),一个端点就是一个接口,因此SpringMVC的每一个端点就是调用链路中的每一个资源流控,熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击后面的按钮来设置规则

Sentinel设置流控

流控设置:点击接口后面的流控按钮

选择阈值类型未QPS(每秒中的访问次数),然后阈值设置为1

这样一来这个接口的流控为:每秒中只能访问一次

 效果

一秒内访问多次就会显示被sentinel阻塞,直接报错

使用jmeter工具测试接口

jmeter介绍

JMeter是由Apache组织开发的一款基于Java的压力测试工具。它最初设计用于Web应用测试,但随着时间的推移,JMeter的功能已经扩展到了其他的测试领域。JMeter能够模拟大量用户对服务器、网络或对象进行负载测试,从而测试它们在不同压力下的性能,并进行整体性能分析。 

jmeter安装

官网下载链接Apache JMeter - Download Apache JMeter 

 

 启动

解压以后进入bin目录,打开jmeter.properties文件,修改语言为中文

点击jmeter.bat文件启动jemter工具 

 使用

测试计划添加线程组

在线程组中设置线程数为200,ramp-up为在多长时间内创建这200个线程,时间越短越高并发

循环次数为每个线程的执行次数 

添加http请求行为

设置请求路径和编码格式 (utf8)

 添加响应结果监听器

 

 启动线程组

查看结果树,有一个成功,因为设置了sentinel流控设置了一秒只能访问一次这个接口

 

查看聚合报告

 流控模式

  1. 直接模式:统计当前资源的请求,触发阈值对当前资源直接限流,也就是默认的模式
  2. 关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  3. 链路模式:统计从指定链路访问到本资源的请求,触发阈值时,对指定的链路限流

直接模式

对这个接口每秒钟只能访问五次 

设置在2秒内创建20个线程,即一秒10个线程,期望的结果就是每秒钟有五个线程访问这个接口成功 

 

关联模式

 统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改会争抢数据库锁,就会产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务进行限流

 写资源优先,一旦写资源达到阈值,就会对读资源的操作进行限流,因为写资源优先

例子:

写两个接口,一个查询,一个更新

@GetMapping("query")
    public String query() {
        return "查询订单";
    }
    @GetMapping("update")
    public String update(){
        return "更新订单";
    }

 配置流控规则:当/order/update 资源被访问的QPS超过5时,对/order/query资源进行限流

在/order/query的流控按钮中编写 

 在jmeter中测试,一秒创建10个线程去访问/order/update,这样一来已经超过了QPS阈值(一秒只能访问5次),最后sentinel对/order/query进行限流

 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部