往期回顾

Nacos的安装与配置

Spring Cloud集成Nacos作为注册中心

LoadBalacer集成Nacos实现负载均衡

常见的负载均衡策略分析

Spring Cloud集成Dubbo实现RPC调用

SpringCloud集成Nacos作为配置中心

Nacos整合OpenFegin实现RPC调用

Nacos整合Gateway入门实例

Spring Cloud Gateway的过滤器配置

Nacos整合Gateway实现动态路由

前面我们已经介绍了Spring Cloud&Spring Cloud AlibabaNacosLoadBalancerGatewayOpenFegin 这些组件,接下来让我们继续来看Spring Cloud Alibaba中关于服务熔断降级的组件:Sentinel

Sentinel介绍

概述

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件

Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。

Sentinel 具有以下特征:

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

Sentinel 的主要特性

Sentinel-features-overview

关于流量控制,服务的熔断降级等后面会结合代码详细解释,如果对这些名词不熟悉的同学可以先了解一个大概,后面根据代码Demo进行理解。

我们先来初步的了解Sentinel是什么的,可以用来干嘛

Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

Sentinel 的组成

Sentinel 主要由以下两个部分组成:

  • Sentinel 核心库:Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中,同时对 Spring Cloud、Dubbo 等微服务框架提供了很好的支持。
  • Sentinel 控制台(Dashboard):Sentinel 提供的一个轻量级的开源控制台,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。

Sentinel 核心库不依赖 Sentinel Dashboard,但两者结合使用可以有效的提高效率,让 Sentinel 发挥它最大的作用。

安装控制台

Sentinel 提供了一个轻量级的开源控制台 Sentinel Dashboard,它提供了机器发现与健康情况管理、监控(单机和集群)、规则管理与推送等多种功能。

Sentinel 控制台提供的功能如下:

  • 查看机器列表以及健康情况:Sentinel 控制台能够收集 Sentinel 客户端发送的心跳包,判断机器是否在线。
  • 监控(单机和集群聚合):Sentinel 控制台通过 Sentinel 客户端暴露的监控 API,可以实现秒级的实时监控。
  • 规则管理和推送:通过 Sentinel 控制台,我们还能够针对资源定义和推送规则。
  • 鉴权:从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。

Sentinel Dashboard 是我们配置和管理规则(例如流控规则、熔断降级规则等)的重要入口之一。通过它,我们不仅可以对规则进行配置和管理,还能实时查看规则的效果。

官网下载 Jar 包

官网下载地址

image-20220903140946891

启动:(全部使用默认配置)

java -jar sentinel-dashboard-1.8.5.jar

启动时指定端口,是否监控自己,项目名称,登录的帐号和密码:

java -Dserver.port=8480 -Dcsp.sentinel.dashboard.server=localhost:8480 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.5.jar

参数说明:(注意:参数要放到 -jar的前边)

# 指定控制台的端口为8480
-Dserver.port=8480 
# 指定要被哪个控制台监控(这里指定的是自己监控自己)
-Dcsp.sentinel.dashboard.server=localhost:8480 
# 指定实例名称(名称会在控制台左侧以菜单显示)
-Dproject.name=sentinel-dashboard 
# 设置登录的帐号为:sentinel 
-Dsentinel.dashboard.auth.username=sentinel 
# 设置登录的密码为:123456
-Dsentinel.dashboard.auth.password=123456 

Docker部署

拉取镜像

docker pull bladex/sentinel-dashboard

运行镜像

docker run --name sentinel --network=host -e auth.enabled="true" -e sentinel.dashboard.auth.username=admin -e sentinel.dashboard.auth.password=admin -e server.servlet.session.timeout=7200 -d  bladex/sentinel-dashboard

参数解释:

# 指定docker容器使用宿主机的网络(你也可以映射8858,8719这两个端口)
--network=host	
# 开启登录认证,在application.yml中你需要配置对应的用户名和密码
auth.enabled="true"
# 指定Sentinel控制台用户名,默认Sentinel
sentinel.dashboard.auth.username=admin
# 指定Sentinel控制台密码,默认Sentinel
sentinel.dashboard.auth.password=admin
# 用于指定 Spring Boot服务端session的过期时间,如7200表示7200 秒;60m表示60分钟,默认为30分钟;
server.servlet.session.timeout=7200

配置

Sentinel 提供如下的配置方式:

  • JVM -D 参数方式
  • properties 文件方式(1.7.0 版本开始支持)

其中,project.name 参数只能通过 JVM -D 参数方式配置(since 1.8.0 取消该限制),其它参数支持所有的配置方式。

优先级顺序:JVM -D 参数的优先级最高。若 properties 和 JVM 参数中有相同项的配置,以 JVM 参数配置的为准。

用户可以通过 -Dcsp.sentinel.config.file 参数配置 properties 文件的路径,支持 classpath 路径配置(如 classpath:sentinel.properties)。默认 Sentinel 会尝试从 classpath:sentinel.properties 文件读取配置,读取编码默认为 UTF-8。

注:1.7.0 以下版本可以通过旧的 ${user_home}/logs/csp/${project.name}.properties 配置文件进行配置(除 project.name 和日志相关配置项)。

具体的配置可选项请查阅官方文档:

Sentinel控制台

启动配置项

访问测试

启动成功后,访问对应的地址查看

image-20220903152232224

然后输入对应的密码访问

image-20220903152516428

如图所示,Sentinel就算安装完成啦

快速开始

Sentinel控制台已经安装好那么我们来结合Spring Cloud项目来看看Sentinel到底能干什么吧

为了方便起见,我们直接改造之前的user-service

先引入依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

bootstrap.yml 中添加以下配置

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.199.128:8848 #Nacos地址
      config:
        server-addr: 192.168.199.128:8848 #Nacos地址
        file-extension: yaml #这里我们获取的yaml格式的配置
    sentinel:
      transport:
        #配置 Sentinel dashboard 地址
        dashboard: 192.168.199.128:8858
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719

在Controller中添加如下代码

/**
 * @author Pymjl
 * @version 1.0
 * @date 2022/8/25 12:48
 **/
@RestController
@RequestMapping("/user")
@Log4j2
public class UserController {
    @Resource
    UserService userService;

    @Value("${server.port}")
    private String port;

    @GetMapping("/get/{id}")
    @SentinelResource(value = "getUser")
    public CommonResult<User> get(@PathVariable("id") Long id) {
        return ResultUtils.success(userService.get(id));
    }

}

@SentinelResource注解的作用我们后面会详细解释,这里只是简单的演示Sentinel的作用,不做赘述

启动项目

先启动user-service

image-20220903153118444

因为Sentinel的懒加载机制,如果并没有访问接口那么Sentinel是不会有对应的信息的,我们这时候去看看Sentinel的控制台

image-20220903153219576

空空如也,啥也没有,所以我们先访问接口一次

image-20220903153316529

然后再去观察控制台,就会发现出现了对应的资源

image-20220903153354083

给资源添加流控规则

我们给/user/get/{id} 这个URL添加流控规则,在/user/get/{id} 右边点击+流控 ,然后设置QPS的阈值

image-20220903154413795

这些配置信息后面会详细解释

新增完流控规则之后,我们再快速的连续去访问刚才的接口,看看会发生什么呢?

image-20220903154440980

如图所示我们可以看,当我们快速点击刷新的时候Sentinel会对该资源进行保护,进行限流操作

至此,对Sentinel的介绍就先到这里啦,后面我们会继续探讨Sentinel的一些概念、特性以及诸如持久化等操作,感谢大家的观看

然后设置QPS的阈值

[外链图片转存中…(img-V80muiIB-1662298851495)]

这些配置信息后面会详细解释

新增完流控规则之后,我们再快速的连续去访问刚才的接口,看看会发生什么呢?

[外链图片转存中…(img-XoD8EsWv-1662298851496)]

如图所示我们可以看,当我们快速点击刷新的时候Sentinel会对该资源进行保护,进行限流操作

至此,对Sentinel的介绍就先到这里啦,后面我们会继续探讨Sentinel的一些概念、特性以及诸如持久化等操作,感谢大家的观看

项目源码:gitee github

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐