目录
三.访问:localhost:8080 默认的账号和密码都是sentinel
二.在application.yml配置文件中编写配置sentinel控制台的地址
查看结果树,有一个成功,因为设置了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流控设置了一秒只能访问一次这个接口
查看聚合报告
流控模式
- 直接模式:统计当前资源的请求,触发阈值对当前资源直接限流,也就是默认的模式
- 关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
- 链路模式:统计从指定链路访问到本资源的请求,触发阈值时,对指定的链路限流
直接模式
对这个接口每秒钟只能访问五次
设置在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进行限流
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Sentinel微服务保护
发表评论 取消回复