其他分享
首页 > 其他分享> > SpringCloudAlibaba 微服务讲解(四)Sentinel--服务容错(一)

SpringCloudAlibaba 微服务讲解(四)Sentinel--服务容错(一)

作者:互联网

4.1 高并发带来的问题

在微服务中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。

接下来我们模拟一个高并发的场景

  1. 编写java代码

    @RestController
    @Slf4j
    public calss OrderController2{
    	@Autowired
    	private OrderService orderSerivce;
    	
    	@Autowired
    	private ProductService productService;
    	
    	@RequestMapping("/order/prod/{pid}")
    	public Order order(@Pathvariable("pid") Integer pid){
    		Product product = productService.findByPid(pid);
    		Try{
    		Thread.sleep(100)
    		}catch(InterruptedException e){
    		e.printStackTrace();
    		}
    		Order order = new Order();
    		order.setUid(1);
    		order.setUsername("测试账号");
    		order.setPid(pid);
    		order.setPname(product.getPname());
    		order.setPprice(product.getPprice());
    		order.setNumber(1);
    		
    		return order;
    		
    	}
    	
    	@RequestMapping("/order/message")
    	public String message(){
    	return "高并发下的问题测试";
    	}
    
    }
    
  2. 配置tocmat 并发数

    server:
    	port:8091
    	tomcat:
    		max-threads: 10 
    
  3. 接下来使用压测工具,对请求进行压测

    下载地址:https://jmeter.apache.org

    第一步:修改配置,并启动软件

    进入bin目录,修改jmeter.properties 文件中的语言支持为language=zh_CN,然后县级jmeter.bat 启动软件。

    第二步:添加线程组

    第三步:配置线程并发数

    第四步:添加http取样

    第五步:配置取样,并启动测试

  4. 访问message方法观察效果

  5. 结论:

    *此时会发现,由于order方法囤积了大量的请求,导致message方法的访问出现了问题,这就是服务雪崩的雏形

4.2 服务雪崩效应

*在分布式系统中,由于网络原因或者自身原因,服务一版无法保证100%可用,如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪

由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成才灾难性的严重后果,这就是服务故障“雪崩效应”。

雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法相应变慢,亦或者是某台机器的资源耗尽。我们无法完全杜绝雪崩源头的放生,只有做好了足够的融租哦,保证在一个服务发生问题,不会影响到其他服务的正常运行,也就是“雪落而不雪崩”。

4.3常见的容错方案

要防止雪崩的扩散,我们就要做好服务的容错,容错说白了就是保护自己不被猪队友拖垮的一些措施,下面介绍常见的服务容错思路和组件。

常见的容错思路:

常见的容错思路有隔离、超时、限流、熔断、降级这几种,下面分别介绍下。

4.4常见的容错组件

下面是三个组件的在各方面的对比:

4.5Sentinel入门

4.5.1 什么是Sentinel

Sentinel(分布式系统的流量方卫兵)是阿里巴巴开源的一套用于服务容错的中和解决方案。它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。

Sentinel具有以下特征:

Sentinel分为两个部分

4.5.2 微服务集成Sentinel

为微服务集成Sentinel非常的简单,只需要添加Sentinel的依赖即可

  1. 在pom.xml中添加下面依赖

    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  2. 编写一个Controller测试使用

    @RestController
    @Slf4j
    public class orderCOntroller3{
    	@RequestMapping("/order/message1")
    	public String message2(){
    		return "message1";
    	}
    	
    	@RequestMapping("/order/message2")
    	public String message2(){
    		return "message2";
    	}
    }
    

4.5.3 安装Sentinel控制台

Sentinel提供一个轻量级的控制台,它提供机器发现、单机资源实时监控以及规则管理等功能。

  1. 下载jar包,解压到文件夹。https://github.com/alibaba.Sentinel/releases

  2. 启动控制台

    java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-xxx.jar
    
  3. 修改shop-order,在里面加入有关控制台的配置

    spring:
    	cloud:
    		sentinel:
    			transport:
    				port: 9999
    				dashboard: localhost:8080 		
    
  4. 通过浏览器访问localhost:8080 进入控制台(默认用户名密码是:sentinel/sentinel)

  5. 补充:

    Sentinel的控制台其实就是一个Soringboot编写的程序。我们需要将我们的微服务程序注册到控制台上,即在微服务中指定控制台的地址,并且还要开一个跟控台传递数据的端口,控制台也可以通过次端口调用微服务中的监控程序获取微服务的各种信息。

4.5.4 实现一个接口的限流

  1. 通过控制台为message1添加一个流控规则

  1. 通过控制台快速频繁访问,观察效果

4.6 Sentinel的概念和功能

4.6.1 基本概念

4.6.2 重要功能

Sentinel的主要功能就是容错,主要体现为一下3个方面:

Sentinel对这个问题采取了两种手段

Sentinel 和 Hystrix 的区别

两者的原则是一直的,都是当一个资源出现问题时,让其快速失败,不要波及到其他服务,但是限制的手段上,却采用了完全不一样的方法

  • Hystrix 采用的是线程池隔离的方法,优点是做到了资源之间的隔离,缺点是增加了线程切换的成本
  • Sentinel采用的是通过并发线程的数量和响应时间来对资源做限制

总之一句话:我们需要做的事情,就是在Sentinel的资源上配置各种各样的规则,来实现各种容错的功能。

标签:服务,--,熔断,线程,Sentinel,SpringCloudAlibaba,order,资源
来源: https://www.cnblogs.com/ityml/p/16070840.html