Spring Cloud Alibaba集成Sentinel

一、前言

作为构成Spring Cloud Alibaba微服务体系的关键组件之一,Sentinel提供了一种保护措施,从而保证服务不会因为请求量过大,引发雪崩效应(由于某一服务不可用,导致上游服务不可用,进而导致整个服务不可用)。在微服务时代,服务和服务之间的稳定性变得越来越重要,Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

二、Spring Cloud Alibaba集成Sentinel

部署准备

Sentinel分为两部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器,该模块目前基于SpringBoot运行;

首先,先从github上下载稳定版本的Sentinel Dashboard,下载地址:https://github.com/alibaba/Sentinel/releases ,目前最新版本为1.8.2 ,下载到本地后,通过以下命令运行:

java -Dserver.port=8088 -jar sentinel-dashboard-1.3.0.jar

浏览器打开http://localhost:8088/ ,默认用户名和密码是:sentinel,至此,前期准备工作完成,接下来进入编码实现阶段。

编码实现

接下来,我们以前面已经开发好的spring-cloud-alibaba-dubbo-gateway,spring-cloud-alibaba-dubbo-consumer和spring-cloud-alibaba-dubbo-provider为基础,进行集成。
我们在spring-cloud-alibaba-dubbo-consumer的bootstrap.yml配置文件中添加以下核心配置:

spring:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8088

在控制类中对特定方法进行服务降级:

@RestController
@RequestMapping("/consumer")
@Slf4j
public class ConsumerController {

    @Reference(check = false,version = "1.0.0")
    private IdGenerateApi idGenerateApi;


    @GetMapping("/getId")
    @SentinelResource(value = "getId",defaultFallback = "respFallback")
    public Object test() {
        Result result=idGenerateApi.getId("");
        log.info("获取id{}",result);
        return result;
    }


    public String respFallback(Throwable t){

        return "服务不可用,原因:"+t.getClass().getCanonicalName();
    }

}

上面代码块中的respFallback()方法即为服务不可用时的降级方法。本文以获取雪花算法生成的id为例,进行演示。

测试

依次启动spring-cloud-alibaba-dubbo-gateway,spring-cloud-alibaba-dubbo-consumer和spring-cloud-alibaba-dubbo-provider,nacos如下则全部注册成功:
Spring Cloud Alibaba集成Sentinel_第1张图片

  1. 正常提供服务
    我们使用Postman进行请求演示服务可用时:
    Spring Cloud Alibaba集成Sentinel_第2张图片

  2. 服务不可用
    我们将spring-cloud-alibaba-dubbo-provider服务停止,再次请求:

Spring Cloud Alibaba集成Sentinel_第3张图片

如上图所示,服务提供者不可用时,返回了respFallback()降级方法里的内容。

  1. 熔断限流
    接下来,更进一步我们进行限流测试,本文中使用jmeter进行测试,如读者对该工具使用不熟悉,请移步https://www.jianshu.com/p/0e4daecc8122 ,jmeter做如下配置:

Spring Cloud Alibaba集成Sentinel_第4张图片

红圈处填写自己的测试ip,启动测试计划后,登录Sentinel控制台,如下图所示:

Spring Cloud Alibaba集成Sentinel_第5张图片

如上图,是没有对接口进行限流时,所以请求均正常返回,下图为测试结果:

Spring Cloud Alibaba集成Sentinel_第6张图片

单机QPS达到1200左右。

现在开启限流,我们将QPS限制在1000,再次进行测试。

Spring Cloud Alibaba集成Sentinel_第7张图片

测试结果如下:
Spring Cloud Alibaba集成Sentinel_第8张图片

根据图中结果,我们可以知道,当QPS达到1000时,超过的请求将快速失败,直接返回,这就保护了系统稳定性,防止被流量打崩,导致整个系统不可用。
接下来配置熔断规则:

Spring Cloud Alibaba集成Sentinel_第9张图片

如上图所示,当请求延迟大于10ms时,熔断2s。
测试结果如下:
Spring Cloud Alibaba集成Sentinel_第10张图片

三、总结

相信跟随本文演示下来,可以体会到使用Sentinel进行流量控制、熔断降级时,上手非常容易,且流控和熔断规则通过可视化界面进行控制,非常方便根据实际业务进行定制。至于其实现原理,我们将在接下来的文章中进行分析。

你可能感兴趣的:(SpringCloud,JAVA,spring,cloud)