Sentinel 学习笔记

Sentinel 学习笔记

作者:王珂

邮箱:49186456@qq.com


前言

本文介绍微服务组件Sentinel的主要功能,环境搭建和组件使用。其中涉及到相关的一些基础概念,也对其进行的解释以便对组件的理解和使用。

同时,介绍了在实际工作中使用Sentinel常用的步骤和操作。希望通过本文对你快速理解和上手使用Sentinel提供帮助。

官网:

https://sentinelguard.io/zh-cn/index.html

一、基础概念

服务雪崩

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,称为雪崩。

原因:

  • 服务提供者出现故障或阻塞

  • 服务调用者没有做好异常处理,导致自身故障

解决:

  • 服务保护方案

    1)请求限流:限制访问微服务请求的并发量,避免服务因流量激增而出现故障。
    protect_service
    2)线程隔离:限定每个业务能够使用的线程数而将故障业务隔离,避免故障扩散。

    3)服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值就会熔断该业务,则拦截该接口的请求。熔断期间,所有请求快速失败,全部都走fallback逻辑。

    熔断避免了无效的资料浪费

    服务保护技术

    Sentinel Hystrix
    线程隔离 信号量隔离 线程池隔离/信号量隔离
    熔断策略 基于慢调用比例或异常比例 基于异常比例
    限流 基于QPS,支持流量整形 优先支持
    Fallback 支持 支持
    控制台 开箱即用,可配置规则,查看秒级监控,机器发现等 不完善
    配置方式 基于控制台,重启失效 基于注解或配置文件,永久生效

    Sentinel的使用分为两个部分:

  • 核心库(jar包):不依赖任何框架/库,能够运行Java 8及以上的版本运行环境,同时对 Dubbo / Spring Cloud等框架也有较好的支持,在项目中引入依赖即可实现服务限流、隔离、熔断等功能。

    • 控制台:Dashboard主要负责管理推送规则、监控、管理机器信息等。

二、Sentinel控制台

Sentinel 控制台可以查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
规则管理和推送:统一管理推送规则。
鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。

2.1 安装控制台

1)下载dashborad

https://github.com/alibaba/Sentinel/releases/download/1.8.7/sentinel-dashboard-1.8.7.jar

或者下载源码编译打包

下载源码

https://github.com/alibaba/Sentinel/archive/refs/tags/1.8.7.tar.gz

打包

mvn -Dmaven.test.skip=true clean package

sentinel-dashboard.jar位于/sentinel-dashboard/target目录下。

2)启动

java -Dserver.port=8719 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

启动命令可以带的参数

// 控制台端口

-Dserver.port=8719

// 此配置可以监控sentinel控制台自己

-Dcsp.sentinel.dashboard.server=localhost:8858

// 名称

-Dproject.name=sentinel-dashboard

3)访问控制台

http://localhost:8719

账号:sentinel / sentinel

2.2 簇点链路

簇点链路就是单机调用链路(单个微服务内部)。是一次请求进入服务后经过的每一个被Sentinel监控的资源。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口,即Controller接口)。限流、熔断等都是针对簇点链路中资源设置的。而资源名默认就是接口的请求路径。

Restful风格的API请求路径一般相同(请求方式不同,有GET, POST, PUT, DELETE …),这会导致簇点资源名称重复。因此我们要修改配置,把请求路径+请求方式做为簇点的资源名称,

需要如下配置,完整配置详解3.2控制台配置

http-method-specify: true # 开启请求方式前缀

2.3 请求限流

限流表示限制接口每秒处理请求的数量

在簇点链路后面点击【流控】按钮,即可对其做限流配置
current_limiting

2.4 线程隔离

线程隔离,是指限制某个服务可用的线程数。

在购物车服务中需要查询商品信息,但此时商品服务出现了阻塞或故障。如果此时购物车服务没有资源限制,一直接收请求,分配线程进行处理,很快就会将容器的资源耗尽。此时购物车服务中的其它业务(业务接口2)也会因为容器资源的耗尽而处理缓慢,进而引起服务的雪崩问题。

此时如果给购物车服务中的查询商品信息接口限制其使用的线程数,当线程数到达阈值后不再分配资源,这种方式称为线程隔离。
在这里插入图片描述

server:
  tomcat:
    # tomcat允许最大的请求数,默认8192
    max-connections: 8192
    # tomcat允许排队的连接队列长度,默认100。
    # 当tomcat处理连接的线程池慢时,请求的连接会排队,设置最大的排队数量
    accept-count: 100
    threads:
      # tomcat最大的线程数,默认200
      max: 200

2.5 服务降级

在购物车服务中需要查询商品信息,如果此时商品服务出现了阻塞或故障,此时服务就不会报错,会走fallback逻辑,快速响应(防止该服务无响应)。
fallback
实现服务降级,需要以下步骤

1)将FeignClient做为Sentinel的簇点资源

feign:
  sentinel:
    enabled: true # true: sentinel的簇点资源开启,默认为false

2)FeignClient添加fallback逻辑

  • FallbackClass

    TODO

  • FallbackFactory(推荐)

    给UserClient添加FallbackFactory

    @FeignClient(value = "userService")
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    

    ① 自定义FallbackFacotry

    public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
        @Override
        public UserClient create(Throwable throwable) {
            // 创建UserClient接口的实现类,实现其中的方法
            return new UserClient() {
                @Override
                public User findById(Long id) {
                    log.error("查询用户失败", throwable);
                    return null;
                }
            }
        }
    }
    

    ② 将UserClientFallbackFactory注册为bean

    @Bean
    public UserClientFallbackFacotry userClientFallbackFacotry() {
        return new UserClientFallbackFacotry();
    }
    

    ③ 在UserClient中使用UserClientFallbackFacotry

    @FeignClient(value = "userService", fallbackFactory = UserClientFallbackFacotry .class)
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable("id") Long id);
    }
    

2.6 服务熔断

熔断是解决雪崩问题的重要手段,由断路器统计服务的异常比例、慢服务比例,如果超出了阈值则会熔断服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

熔断主要是有一个断路器,达到比例后拒绝发起请求,直接走fallback。
fusing
断路器有3个状态Closed, Open, Half-Open
fuse
在Sentinel中配置熔断,熔断策略有:慢调用比例,异常比例,异常数
在这里插入图片描述

三、Sentinel客户端

3.1 原始Jar包客户端

客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信

1)引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>

2)配置启动参数

启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。

除了修改 JVM 参数,也可以通过配置文件取得同样的效果。

更多详细信息:

https://sentinelguard.io/zh-cn/docs/startup-configuration.html

3.2 SpringCloudAlibaba客户端

1)引入依赖

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

2)配置控制台

spring:
  cloud:    
    sentinel:
      transport:
        dashboard: ${IP: localhost}:${PORT: 8719}
      http-method-specify: true # 开启请求方式(GET, POST, ...)做为资源名称

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 18:42:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 18:42:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 18:42:05       57 阅读
  4. Python语言-面向对象

    2024-07-15 18:42:05       68 阅读

热门阅读

  1. 算法的时间复杂度和空间复杂度-概念

    2024-07-15 18:42:05       19 阅读
  2. Matlab

    Matlab

    2024-07-15 18:42:05      20 阅读
  3. C/C++指针&智能指针二

    2024-07-15 18:42:05       15 阅读
  4. 在本科生中,发表SCI一区的情况如何?

    2024-07-15 18:42:05       16 阅读
  5. python爬虫学习(三十四天)

    2024-07-15 18:42:05       15 阅读