Spring Cloud Alibaba Sentinel 初体

2022-10-12  本文已影响0人  分布式与微服务

Sentinel介绍

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

Sentinel具有以下特征:

Sentinel 的主要特性:

Sentinel 分为两个部分:

Sentinel 和 Hystrix 对比

快速开始

下载启动控制台

Sentinel 控制台提供了一系列规则配置,如果不需要控制就要自己在代码里面写规则了,比较麻烦,所以有还是最好的。 下载地址:github.com/alibaba/Sen… 找到这个jar包下载就行

Sentinel 控制台本身就是一个springboot的jar包 启动命令如下:

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

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。 从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。 访问http://localhost:8080/#/login,进入Sentinel 管理页面

登录成功后首页

示例代码

  1. 新建一个springboot项目sentinel-provider,引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

spring-boot-starter-web 是必须要有的,Sentinel配置 需要在Servlet 环境才生效。

  1. 配置文件
server.port=8085
# 服务名
spring.application.name=SentinelProvider

spring.cloud.sentinel.transport.port=8719
# dashboard 地址
spring.cloud.sentinel.transport.dashboard=localhost:8080

配置的意思在后面会说到。

  1. 创建测试类

TestServiceImpl.java

@Service
public class TestServiceImpl implements TestService{

    // 原函数
    @SentinelResource(value = "sayHello", blockHandler = "exceptionHandler", fallback = "helloFallback")
    public String sayHello(String name) throws Exception {

        if ("throws".equals(name)) {
            throw new Exception("exceptionHandler 生效了");
        }
        return "Hello, " + name;
    }

    // Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
    public String helloFallback(String name) {
        System.out.println("helloFallback 生效,params = "+name);
        return "helloFallback 生效,params = "+name;
    }

    // Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.
    public String exceptionHandler(String name , BlockException ex) {
        // Do some log here.
        ex.printStackTrace();
        return "exceptionHandler起作用了,params="+name;
    }
}

SentinelProviderController.java

@RestController
@RequestMapping("/provider")
public class SentinelProviderController {

    @Autowired
    private TestService service;

    @GetMapping(value = "/hello/{name}")
    public String apiHello(@PathVariable String name) throws Exception {
        return service.sayHello(name);
    }
}

  1. 测试 启动sentinel-provider,启动之后访问sentinel控制台就能看到该服务,
  1. 先通过浏览器访问进行一个正常的测试:
  1. 再进行一个抛异常的测试:
  1. 最后再通过控制台进行一个降级测试:
    • 在簇点链路下找到我们使用了@SentinelResource的资源,只有先调用接口之后才能在簇点链路找到对应的资源
*   在流控中进行配置流控规则 为了简单测试一下,我们就将QPS单机阈值设置为1![](https://img.haomeiwen.com/i28070583/48cbc6629c8808e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


     在流控规则列表中可以看到我们配置的规则:
降级测试: 多刷新几个调用就会看到如下页面

这样一个简单的测试就结束了,至于@SentinelResource注解是什么意思,请接着往下看。

@SentinelResource 介绍

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

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

原方法 是指使用了 @SentinelResource注解的方法,1.8.0 版本开始,defaultFallback 支持在类级别进行配置。

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

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

名词解释

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

配置项

Spring Cloud Alibaba Sentinel 提供了这些配置选项:

配置项 含义 默认值
spring.application.name or project.name Sentinel项目名
spring.cloud.sentinel.enabled Sentinel自动化配置是否生效 true
spring.cloud.sentinel.eager 是否提前触发 Sentinel 初始化 false
spring.cloud.sentinel.transport.port 应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer 8719
spring.cloud.sentinel.transport.dashboard Sentinel 控制台地址
spring.cloud.sentinel.transport.heartbeat-interval-ms 应用与Sentinel控制台的心跳间隔时间
spring.cloud.sentinel.transport.client-ip 此配置的客户端IP将被注册到 Sentinel Server 端
spring.cloud.sentinel.filter.order Servlet Filter的加载顺序。Starter内部会构造这个filter Integer.MIN_VALUE
spring.cloud.sentinel.filter.url-patterns 数据类型是数组。表示Servlet Filter的url pattern集合 /*
spring.cloud.sentinel.filter.enabled Enable to instance CommonFilter true
spring.cloud.sentinel.metric.charset metric文件字符集 UTF-8
spring.cloud.sentinel.metric.file-single-size Sentinel metric 单个文件的大小
spring.cloud.sentinel.metric.file-total-count Sentinel metric 总文件数量
spring.cloud.sentinel.log.dir Sentinel 日志文件所在的目录
spring.cloud.sentinel.log.switch-pid Sentinel 日志文件名是否需要带上 pid false
spring.cloud.sentinel.servlet.block-page 自定义的跳转 URL,当请求被限流时会自动跳转至设定好的 URL
spring.cloud.sentinel.flow.cold-factor WarmUp 模式中的 冷启动因子 3
spring.cloud.sentinel.zuul.order.pre SentinelZuulPreFilter 的 order 10000
spring.cloud.sentinel.zuul.order.post SentinelZuulPostFilter 的 order 1000
spring.cloud.sentinel.zuul.order.error SentinelZuulErrorFilter 的 order -1
spring.cloud.sentinel.scg.fallback.mode Spring Cloud Gateway 流控处理逻辑 (选择 redirect or response)
spring.cloud.sentinel.scg.fallback.redirect Spring Cloud Gateway 响应模式为 'redirect' 模式对应的重定向 URL
spring.cloud.sentinel.scg.fallback.response-body Spring Cloud Gateway 响应模式为 'response' 模式对应的响应内容
spring.cloud.sentinel.scg.fallback.response-status Spring Cloud Gateway 响应模式为 'response' 模式对应的响应码 429
spring.cloud.sentinel.scg.fallback.content-type Spring Cloud Gateway 响应模式为 'response' 模式对应的 content-type application/json

NOTE: 请注意,这些配置只有在 Servlet 环境下才会生效,RestTemplate 和 Feign 针对这些配置都无法生效

上一篇下一篇

猜你喜欢

热点阅读