SpringCloud-Alibaba学习(九):Sentinel简介

Sentinel

1、服务雪崩

某个节点出现调用问题,导致其上游调用方发生级联故障,最终引起大面积的服务崩溃,这就叫做服务雪崩。

image

如图
1、服务 A 超时或不可用
2、服务 B 上大量请求被 hang 住
3、服务 B 资源耗尽崩溃
4、服务 C、D 也资源耗尽崩溃

解决方法

  1. 限流:基于 qps,请求数大于 qps 阈值时直接拒绝访问
  2. 仓壁模式:基于线程数,比如给每个资源分配最大 n 个线程,多余的请求丢弃,防止线程资源耗尽
  3. 断路器:大量请求超时、异常时能自动熔断,拒绝所有访问,一段时间后自动探测恢复

2、Sentinel是什么

Sentinel github:https://github.com/alibaba/Sentinel/wiki/介绍

以流量为切入点,从流量控制、熔断降级、负载均衡保护等多个维度保护服务的稳定性

2.1 特征

  • 丰富的应用场景
    秒杀、流量削峰填谷、集群流量控制、实时熔断下游不可用应用
  • 完备的实时监控
    能够实时监控资源调用情况,可以监控到资源维度的秒级数据,提供了 Dashboard 控制台
  • 广泛的开源生态
    提供了与气筒开源框架的整合模块,如SpringCloud、Dubbo的整合,引入依赖简单配置即可快速接入
  • 完善的 SPI 扩展点
    提供了简单易用、完善的 SPI 扩展接口,如定制规则管理、视频动态数据源等

2.2 Sentinel 分为两个部分

  • 核心库(Java客户端):不依赖其他框架/库,能够运行于所有 Java 运行环境,同时堆 Dubbo/SpringCloud 等框架也有较好的支持
  • 控制台(Dashboard):基于 SpringBoot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器

3、Sentinel 与 Hystrix 对比

image

4、Sentinel架构

image

# 接口概览
http://127.0.0.1:8720/api
# 获取资源的metrics信息  id=资源名
http://127.0.0.1:8720/cnode?id=/xxx
# 获取流控规则接口
http://127.0.0.1:8720/getRules?type=flow
# 设置规则接口
http://127.0.0.1:8720/setRules

5、控制台搭建

下载地址:https://github.com/alibaba/Sentinel/releases

下载下来是个 SpringBoot 工程的 jar 包,直接运行即可

java -jar sentinel-dashboard-1.8.0.jar --server.port=8888

写个脚本startup.bat来运行,放在 jar 包同级目录

java -jar sentinel-dashboard-1.8.0.jar --server.port=8888
pause

访问:http://localhost:8888/

image

用户名/密码:sentinel/sentinel

image

6、微服务整合

依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 端点监控 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- nacos 注册中心场景依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>cc.yuanspace</groupId>
            <artifactId>cloud-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- Sentinel 配置 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

    </dependencies>

配置

# 服务端口
server.port=9010
server.servlet.context-path=/cloud-sentinel-demo
# 服务名称 必须有 保证唯一性
spring.application.name=cloud-sentinel-demo
# nacos server 的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos

# 服务发布到指定的namespace,不指定默认就是public
spring.cloud.nacos.discovery.namespace=qa
# 服务发布到指定的group,默认值是DEFAULT_GROUP
spring.cloud.nacos.discovery.group=my-group

# openfeign 的常用配置
# false表示当第一次发请求时才去注册中心拉取服务列表   true表示项目启动立即拉取
#ribbon.eager-load.enabled=true
# 指定哪些服务立即拉取服务列表
#ribbon.eager-load.clients=cloud-sentinel-demo
# 设置指定服务的连接超时时间,单位 ms
feign.client.config.openfeign-points.connect-timeout=1000
# 设置指定服务的响应超时时间,单位 ms
feign.client.config.openfeign-points.read-timeout=1000
# 设置默认超时时间,单位 ms
feign.client.config.default.connect-timeout=1000
feign.client.config.default.read-timeout=1000


# sentinel 配置
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:8888
# 开启饥饿加载,项目启动立即完成初始化,默认是懒加载
spring.cloud.sentinel.eager=true

启动服务,控制台有内容,监控粒度是接口级别(资源级别)

image

Sentinel 监控的最小粒度是资源也就是接口,默认每个 http 接口都是一个资源,以 uri 为资源名,如上图的 /test

也可以使用 @SentinelResource 定义资源

@Service
public class TestService {

    @SentinelResource(value = "testServiceResource")
    public String get() {
        return "service resource";
    }
}
posted @ 2022-07-05 22:12  originyuan  阅读(249)  评论(0编辑  收藏  举报