Sentinel落地与应用

简介: 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

image.png

1.Sentinel 介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
  • 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

白话来讲,作用就是当大量请求怼过来时,你可以设置接收多少请求,其余的都会返回  如访问人数过多等信息(请参考双11秒杀你大多数参与的结果),这样保证服务器不被压垮,保证了大部分的用户体验,同时被熔断的请求不也会莫名的显示各种不明所以的报错或者是直接白页,体验更加友好。

2.如何使用Sentinel

1.下载安装

官网提供打好的jar包直接下载即可.

地址:github.com/alibaba/Sen…

或者下载源码,自己打包。

mvn clean package
复制代码

会在Sentinel-master\sentinel-dashboard\target下生成。

2.启动

Sentinel控制台是一个标准的Spring Boot应用,以Spring Boot的方式运行jar包即可。

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
复制代码

3.@SentinelResource 注解(使用feign调用可以省略)

埋点功能,在调用接口时,如果发生限流或者是异常,那么会抛出blockHandler/fallback指定的异常信息。

注意:注解方式埋点不支持 private 方法。

@SentinelResource用于定义资源,并提供可选的异常处理和 fallback 配置项。@SentinelResource注解包含以下属性:

  • value:资源名称,必需项(不能为空)
  • entryType:entry 类型,可选项(默认为 EntryType.OUT)
  • blockHandler  / blockHandlerClass:  blockHandler对应处理BlockException的函数名称,可选项。blockHandler  函数访问范围需要是public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException。blockHandler   函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定blockHandlerClass为对应的类的class对象,注意对应的函数必需为  static 函数,否则无法解析。
  • fallback / fallbackClass:fallback  函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback  函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:    
  • 返回值类型必须与原函数返回值类型一致;
  • 方法参数列表需要和原函数一致,或者可以额外多一个Throwable类型的参数用于接收对应的异常。
  • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定fallbackClass为对应的类的class对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback(since  1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认  fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了  fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:    
  • 返回值类型必须与原函数返回值类型一致;
  • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
  • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

1.8.0 版本开始,defaultFallback 支持在类级别进行配置。

注:1.6.0 之前的版本,fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler和fallback都进行了配置,则被限流降级而抛出 BlockException 时只会进入  blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将  BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层  UndeclaredThrowableException)。

示例:

public class TestService {
    // 原函数
    @SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")
    public String hello(long s) {
        return String.format("Hello at %d", s);
    }
    // Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
    public String helloFallback(long s) {
        return String.format("Halooooo %d", s);
    }
    // Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.
    public String exceptionHandler(long s, BlockException ex) {
        // Do some log here.
        ex.printStackTrace();
        return "Oops, error occurred at " + s;
    }
    // 这里单独演示 blockHandlerClass 的配置.
    // 对应的 `handleException` 函数需要位于 `ExceptionUtil` 类中,并且必须为 public static 函数.
    @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
    public void test() {
        System.out.println("Test");
    }
}
复制代码

4.springboot整合

如果要在您的项目中引入 Sentinel,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-sentinel 的 starter。

1.修改pom.xml

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
复制代码

2.修改application.yml

spring:
  cloud:
    sentinel:
      transport:
        port: 8719 #如果是多个服务 端口不能相同
        dashboard: ip:8080
复制代码

spring.cloud.sentinel.transport.port是本地启的端口,与dashboard进行数据交互。官方文档是这样写的:这里的  spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该  Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http  Server 接收,Http Server 再将规则注册到 Sentinel 中。

注意transport:port: 8719 这个端口不能多次占用,比如果一个项目制定的为8719 那么同服务器的任何项目都不能在使用8719了

3.验证

访问ip:8080账号/密码,出现以下页面即可。

image.png

注意:当访问一次接口之后 才能在左面出现服务选项!!

3.Feign 支持

Sentinel 适配了 Feign 组件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2 个步骤:

  1. 配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true
  2. 加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:

如果不开启,将不能实现熔断,会直接抛出异常!

1.修改yml文件

feign:
  sentinel:
    enabled: true
复制代码

2.示例

这是一个 FeignClient 的简单使用示例:

@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    String echo(@PathVariable("str") String str);
}
class FeignConfiguration {
    @Bean
    public EchoServiceFallback echoServiceFallback() {
        return new EchoServiceFallback();
    }
}
class EchoServiceFallback implements EchoService {
    @Override
    public String echo(@PathVariable("str") String str) {
        return "echo fallback";
    }
}
复制代码

4.Spring Cloud Gateway 支持

若想跟 Sentinel Starter 配合使用,需要加上 spring-cloud-alibaba-sentinel-gateway  依赖,同时需要添加 spring-cloud-starter-gateway 依赖来让  spring-cloud-alibaba-sentinel-gateway 模块里的 Spring Cloud Gateway  自动化配置类生效:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>


相关文章
|
运维 监控 安全
深入探讨Sentinel:应对现代应用的流量管理神器
在现代应用开发中,流量管理和监控变得愈发重要。随着用户规模的增长以及应用的不断演进,如何保证应用的稳定性、性能和安全性成为了一项关键挑战。Sentinel,作为一款强大的流量管理工具,已经在众多互联网巨头和开源社区中得到广泛应用。本文将深入探讨Sentinel,介绍它的核心概念、功能和用途,以及为什么它是现代应用不可或缺的一部分。
|
5月前
|
监控 Java Sentinel
Spring Cloud Sentinel:概念与实战应用
【4月更文挑战第28天】在分布式微服务架构中,确保系统的稳定性和可靠性至关重要。Spring Cloud Sentinel 为微服务提供流量控制、熔断降级和系统负载保护,有效预防服务雪崩。本篇博客深入探讨 Spring Cloud Sentinel 的核心概念,并通过实际案例展示其在项目中的应用。
84 0
|
11月前
|
存储 监控 API
微服务轮子项目(18) -Alibaba Sentinel限流熔断(生产应用)
微服务轮子项目(18) -Alibaba Sentinel限流熔断(生产应用)
88 0
|
存储 自然语言处理 监控
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(1): sentinel 介绍以及服务集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(1): sentinel 介绍以及服务集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(1): sentinel 介绍以及服务集成
|
Java Sentinel 微服务
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(3): sentinel 熔断规则及使用详解
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(3): sentinel 熔断规则及使用详解
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(3): sentinel 熔断规则及使用详解
|
Java Sentinel 微服务
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(2): sentinel 流控规则及使用详解
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(2): sentinel 流控规则及使用详解
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(2): sentinel 流控规则及使用详解
|
前端开发 JavaScript Java
Sentinel 控制台项目应用的启动 | 学习笔记
快速学习 Sentinel 控制台项目应用的启动
196 0
Sentinel 控制台项目应用的启动 | 学习笔记
|
存储 JSON Java
Spring Cloud Alibaba系列(六)sentinel的实际应用
上一章中我们通过Dashboard来为Sentinel客户端设置各种各样的规则,但是这些规则默认是存放在内存中,极不稳定,无法用于生成环境,所以需要将其持久化。
1068 0

热门文章

最新文章

下一篇
无影云桌面