/*** Created by mxin5* 验证高并发*/
@RestController
public class SentinelController {@RequestMapping("/sentinel1")public String sentinel1(){//模拟一次网络延时try {//进行休眠TimeUnit.SECONDS.sleep(3);System.out.println("sentinel1开始执行");} catch (InterruptedException e) {e.printStackTrace();}return "sentinel1";}@RequestMapping("/sentinel2")public String sentinel2(){System.out.println("sentinel2开始执行");return "测试高并发下的问题";}@RequestMapping("/sentinel3")public String sentinel3(){return "sentinel3";}
}
2. 修改配置⽂件中tomcat的并发数
server:port: 8091 #商品订单的端口号tomcat:threads:max: 10 #tomcat的最大并发值10,正常是200多个,测试高并发,就需要sentinel进行限流
3. 接下来使⽤压测⼯具,对请求进⾏压⼒测试
下载地址https://jmeter.apache.org/
第⼀步:修改配置,并启动软件 进⼊bin⽬录,修改jmeter.properties⽂件中的语⾔⽀持为language=zh_CN

第⼆步:添加线程组

第三步:配置线程并发数
第四步:添加Http请求
第五步:配置取样,并启动测试
第六步:访问 http://localhost:8091/sentinel2 观察结果,会出现转圈等待的效果。
此时会发现, 由于sentinel1能够承受的并发数为10个,而jmeter压测的时候50个线程同事访问sentinel1导致囤积了⼤量请求, 从而在访问sentinel2的时候,没有线程进行处理sentinel2的访问,这就是服务雪崩的雏形。服务器雪崩效应 在分布式系统中,由于⽹络原因或⾃身的原因,服务⼀般⽆法保证 100% 可⽤。如果⼀个服务出现 了问题,调⽤这个服务就会出现线程阻塞的情况,此时若有⼤量的请求涌⼊,就会出现多条线程阻塞 等 待,进⽽导致服务瘫痪。 由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就 是服务故障的 “雪崩效应” 。 情景1: 微服务之间相互调⽤,关系复杂,正常情况如下图所示:
情景2:某个时刻,服务A挂了,服务B和服务C依然在调⽤服务A
情景3:由于服务A挂了,导致服务C和服务B⽆法得到服务A的响应,这时候服务C和服务B由于⼤量线程积压,最终导致服务C和服务B挂掉.

情景4: 相同道理,由于服务之间有关联,所以会导致整个调⽤链上的所有服务都挂掉.

服务器的雪崩效应其实就是由于某个微⼩的服务挂了,导致整⼀⼤⽚的服务都不可⽤.类似⽣活中的雪崩效应,由于落下的最后⼀⽚雪花引发了雪崩的情况. 雪崩发⽣的原因多种多样,有不合理的容量设计,或者是⾼并发下某⼀个⽅法响应变慢,亦或某 台机器的资源耗尽。我们⽆法完全杜绝雪崩源头的发⽣,只有做好⾜够的容错,保证在⼀个服务发⽣问题,不会影响到其它服务的正常运⾏。

服务熔断⼀般有三种状态:
熔断关闭状态(Closed)
服务没有故障时,熔断器所处的状态,对调⽤⽅的调⽤不做任何限制
熔断开启状态(Open)
后续对该服务接⼝的调⽤不再经过⽹络,直接执⾏本地的fallback⽅法
半熔断状态(Half-Open)
尝试恢复服务调⽤,允许有限的流量调⽤该服务,并监控调⽤成功率。如果成功率达到预
期,则说明服务已恢复,进⼊熔断关闭状态;如果成功率仍旧很低,则重新进⼊熔断关闭状态。
Hystrix Hystrix是由Netflflix开源的⼀个延迟和容错库,⽤于隔离访问远程系统、服务或者第三⽅库,防⽌ 级联失败,从⽽提升系统的可⽤性与容错性。 Resilience4J Resilicence4J⼀款⾮常轻量、简单,并且⽂档⾮常清晰、丰富的熔断⼯具,这也是Hystrix官⽅推 荐的替代产品。不仅如此,Resilicence4j还原⽣⽀持Spring Boot 1.x/2.x,⽽且监控也⽀持和 prometheus等多款主流产品进⾏整合。 Sentinel Sentinel 是阿⾥巴巴开源的⼀款断路器实现,本身在阿⾥内部已经被⼤规模采⽤,⾮常稳定。
com.alibaba.cloud spring-cloud-starter-alibaba-sentinel
# 直接使⽤jar命令启动项⽬(控制台本身是⼀个SpringBoot项⽬) java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 - Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar或者直接创建一个快捷打开方式sentinelStart.bat文件

3. 修改shop-order-server项⽬中的配置⽂件application.yml,新增如下配置:
4. 通过浏览器访问localhost:8080 进⼊控制台 ( 默认⽤户名密码是 sentinel/sentinel ) 注意: 默认是没显示order-service的,需要访问几次接⼝,然后再刷新sentinel管控台才可以看到.spring:cloud:sentinel:transport:port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可dashboard: localhost:1111 # 指定控制台服务的地址

第⼀步: 簇点链路--->流控

第⼆步: 在单机阈值填写⼀个数值,表示每秒上限的请求数
第三步:通过控制台快速频繁访问, 观察效果
