Spring Cloud Alibaba 架构-Sentinel

14 篇文章 0 订阅
12 篇文章 0 订阅

概述

在Java分布式系统中,限流和降级是保障系统稳定性和高可用性的重要手段。限流用于控制请求的速率,防止系统过载;降级则是在系统出现故障时,暂时关闭部分功能,保证核心服务的正常运行。

限流

限流可以通过多种方式实现,如计数器、滑动窗口、令牌桶、漏桶等。在分布式系统中,通常会使用Redis、ZooKeeper等分布式系统来实现全局限流。

使用Redis实现限流

1. 固定窗口计数器:简单但不够精确,存在边界问题。
2. 滑动窗口计数器:通过记录多个时间窗口的请求数来实现更精确的限流。
3. 令牌桶:系统以一定的速率往桶里放入令牌,请求来时尝试从桶里取令牌,取到则处理请求,否则拒绝或等待。
4. 漏桶:请求到达时先进入漏桶,漏桶以一定的速率处理请求,当漏桶满时,请求被丢弃或排队等待。
在Java中,可以使用Jedis或Lettuce等Redis客户端库来操作Redis实现限流。

使用Guava的RateLimiter

Google的Guava库提供了一个简单的RateLimiter类,可以方便地实现单机限流。但在分布式系统中,需要配合其他分布式存储系统(如Redis)来实现全局限流。

降级

降级通常有两种方式:主动降级和被动降级。

主动降级

在预见到系统可能出现问题时,主动关闭部分功能或降低服务级别,以保证核心服务的正常运行。这通常需要在系统中预置降级逻辑和开关。

被动降级

当系统出现故障或某个依赖的服务不可用时,被动地关闭部分功能或降低服务级别。这通常通过熔断器(Circuit Breaker)模式来实现,如Netflix的Hystrix库。

使用Hystrix实现降级

Hystrix是Netflix开源的一个用于处理分布式系统的延迟和容错的库。它提供了熔断器、隔离、降级等功能。当某个服务不可用时,Hystrix会熔断该服务的调用,并返回一个fallback值或执行fallback方法。

在Java中,可以通过在方法上添加@HystrixCommand注解来启用Hystrix的熔断器功能,并通过指定fallback方法来实现降级逻辑。
在Java分布式系统中,限流和降级是保障系统稳定性和高可用性的重要手段。限流可以通过Redis、Guava的RateLimiter等方式实现;降级可以通过主动降级和被动降级(如使用Hystrix)的方式实现。在设计和实现这些功能时,需要充分考虑到系统的实际情况和需求,以确保系统的稳定性和可用性。

Sentinel

概述

Spring Cloud Alibaba 集成的开箱即用限流降级方案来自 Sentinel,其以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:

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

接入 Sentinel

在 pom.xml 文件中引入 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-sentinel 的 starter 依赖:

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

下面这个例子就是一个最简单的使用 Sentinel 的例子:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class, args);
    }
}
@RestController
public class TestController {
    @GetMapping(value = "/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello Sentinel";
    }
}

@SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 hello 表示资源名。 @SentinelResource 还提供了其它额外的属性如 blockHandler,blockHandlerClass,fallback 用于表示限流或降级的操作,更多内容可以参考 Sentinel 注解支持。

Sentinel 控制台部署

  1. 下载镜像
docker pull bladex/sentinel-dashboard
  1. 运行Docker镜像
docker run -d -p 8080:8080 bladex/sentinel-dashboard
  1. Sentinel Dashboard
    可以通过在浏览器中访问http://<your_server_ip>:8080来访问Sentinel Dashboard了(假设服务器IP地址是<your_server_ip>)。

客户端应用

对于 Sentinel 客户端的使用,通常会需要在你的 Java 应用程序中集成 Sentinel,并配置相应的规则。以下是一个简单的 Sentinel 客户端集成示例,演示了如何在 Java 应用程序中使用 Sentinel 来实现限流。
首先,确保项目中已经包含了 Sentinel 的依赖。如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependency>  
    <groupId>com.alibaba.csp</groupId>  
    <artifactId>sentinel-core</artifactId>  
    <version>你的Sentinel版本号</version>  
</dependency>

然后,可以在你的 Java 代码中创建一个资源(例如一个方法),并使用 @SentinelResource 注解来标记它,以便 Sentinel 可以监控和限制它。

import com.alibaba.csp.sentinel.Entry;  
import com.alibaba.csp.sentinel.SphU;  
import com.alibaba.csp.sentinel.annotation.SentinelResource;  
import com.alibaba.csp.sentinel.slots.block.BlockException;  
  
public class SomeService {  
  
    // 使用 @SentinelResource 注解定义资源  
    @SentinelResource("someResourceName")  
    public void someServiceMethod(String param) {  
        // 尝试进入 Sentinel 保护的代码块  
        Entry entry = null;  
        try {  
            // 1.5.0 版本开始可以直接通过 SphU.entry(...) 获取 Entry  
            entry = SphU.entry("someResourceName");  
            // 你的业务逻辑  
            // ...  
        } catch (BlockException ex) {  
            // 如果被限流或被降级,则进入这里  
            // 你可以在这里进行降级处理  
            System.out.println("Blocked by Sentinel: " + ex.getClass().getSimpleName());  
        } finally {  
            if (entry != null) {  
                // 最后确保 exit  
                entry.exit();  
            }  
        }  
    }  
  
    // 注意:上面的 try-catch-finally 示例是为了展示手动使用 SphU.entry 和 exit 的方式。  
    // 如果你使用 @SentinelResource 注解,Sentinel 会自动为你处理 entry 和 exit。  
}

上面的手动示例是为了演示如何在没有注解的情况下使用 Sentinel。在实际使用中,通常会直接使用 @SentinelResource 注解,并且 Sentinel 会自动处理资源的进入和退出。
在 Sentinel Dashboard 中,可以为 someResourceName 配置限流规则。一旦这些规则被触发,你的 someServiceMethod 方法将被限流或降级处理。
请注意,需要确保 Sentinel Dashboard 正在运行,并且应用程序已经正确配置了与 Sentinel Dashboard 通信所需的配置(如流控规则的拉取等)。这通常涉及到在应用程序的启动代码中配置一些 Sentinel 的初始化参数。
另外,Sentinel 还支持多种规则类型(如流量控制、熔断降级、系统保护等),可以根据需要在 Sentinel Dashboard 中配置它们。
最后,可以查看 Sentinel 的官方文档,以获取关于配置和使用的最新和最准确的信息。

Gateway 集成

在 Spring Cloud Gateway 中集成 Sentinel 用于流量控制、熔断降级等功能是一种常见的做法。Sentinel 是阿里巴巴开源的一款面向分布式系统的流量防卫兵,它支持流量控制、熔断降级、系统自适应保护等多个维度保护服务的稳定性。
以下是如何在 Spring Cloud Gateway 中集成 Sentinel 的基本步骤:

  1. 添加依赖
    在的 Spring Cloud Gateway 项目的 pom.xml 文件中添加 Sentinel 的依赖和 Spring Cloud Alibaba 的 Gateway Starter 依赖:
<dependencies>  
    <!-- Spring Cloud Gateway Starter -->  
    <dependency>  
        <groupId>org.springframework.cloud</groupId>  
        <artifactId>spring-cloud-starter-gateway</artifactId>  
    </dependency>  
  
    <!-- Sentinel Gateway Starter -->  
    <dependency>  
        <groupId>com.alibaba.cloud</groupId>  
        <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>  
        <version>你的Sentinel版本号</version>  
    </dependency>  
  
    <!-- Sentinel 核心依赖(如果需要的话) -->  
    <dependency>  
        <groupId>com.alibaba.csp</groupId>  
        <artifactId>sentinel-core</artifactId>  
        <version>你的Sentinel版本号</version>  
    </dependency>  
  
    <!-- 其他依赖... -->  
</dependencies>

确保你使用的 Sentinel 版本与 Spring Cloud Alibaba 的版本兼容。

  1. 配置 Sentinel
    在 application.yml 或 application.properties 文件中,可以配置 Sentinel 的一些参数,但通常来说,基本配置已经足够,大部分配置可以在 Sentinel Dashboard 中进行动态调整。
spring:  
  cloud:  
    sentinel:  
      transport:  
        # Sentinel Dashboard 的地址  
        dashboard: localhost:8080  
        # 客户端与 Sentinel Dashboard 通信的端口,默认是 8719  
        port: 8719
  1. 启动 Sentinel Dashboard
    启动 Sentinel Dashboard 来查看和配置流量控制规则。可以从 Sentinel 的 GitHub 仓库下载 Dashboard 的 JAR 包,然后运行它。
# jar 运行
java -jar sentinel-dashboard.jar
# 容器运行
docker run -d -p 8080:8080 bladex/sentinel-dashboard
  1. 配置路由和流量控制规则
    在 Spring Cloud Gateway 的路由配置中,你可以定义路由规则。Sentinel 会自动将这些路由作为资源来处理。你可以在 Sentinel Dashboard 中为这些资源配置流量控制规则。
  2. 启动你的 Spring Cloud Gateway 服务
    启动你的 Spring Cloud Gateway 服务后,Sentinel 会自动加载并应用你在 Dashboard 中配置的规则。
  3. 测试
    可以通过发送请求到 Gateway 服务来测试 Sentinel 的功能。如果配置了流量控制规则,应该能够看到当请求量超过限制时,Sentinel 会拒绝部分请求。

注意事项

  • 确保 Sentinel Dashboard 和你的 Spring Cloud Gateway 服务在同一个网络中,或者它们之间的网络是可达的。
  • Sentinel 的版本需要与你使用的 Spring Cloud Alibaba 版本兼容。
  • Sentinel 提供了丰富的流量控制策略,包括 QPS、并发线程数等,你可以根据实际需求进行选择。
  • Sentinel 还支持熔断降级、系统自适应保护等功能,你可以在需要的时候进行配置。

Sentinel 集群化部署

Sentinel 的集群化部署通常指的是通过多个 Sentinel 实例来共同监控和管理分布式系统中的服务,确保系统的高可用性和稳定性。在 Sentinel 的集群化部署中,通常需要考虑以下几个方面:
1. Sentinel Dashboard 的集群化:
Sentinel Dashboard 是 Sentinel 的控制台,用于动态配置规则、查看实时监控等。你可以通过部署多个 Sentinel Dashboard 实例来实现控制台的高可用性。
这些 Sentinel Dashboard 实例可以通过负载均衡等技术进行访问,确保即使某个实例出现故障,其他实例仍然可以提供服务。
2. Sentinel 客户端的集群化:
在分布式系统中,通常会有多个 Sentinel 客户端实例,每个实例负责监控和管理不同的服务或资源。
这些 Sentinel 客户端实例可以连接到同一个 Sentinel Dashboard 集群,以便共享配置和规则。
3. 数据持久化:
在 Sentinel 的集群化部署中,需要确保规则数据的持久化,以便在 Sentinel 实例重启或故障恢复后能够恢复之前的配置。
Sentinel 支持将规则数据持久化到 Nacos、Apollo 等配置中心,或者通过自定义实现将数据持久化到数据库等存储系统中。
4. 网络通信:
Sentinel 客户端和 Sentinel Dashboard 之间、以及 Sentinel Dashboard 集群之间需要进行网络通信,以传输配置、规则和监控数据等。
在集群化部署中,需要确保这些网络通信的稳定性和可靠性,例如通过配置合适的网络参数、使用负载均衡等技术来优化网络通信性能。
5. 扩展性:
Sentinel 支持通过 SPI(Service Provider Interface)机制进行扩展,开发者可以根据实际需求实现自定义的扩展点,例如自定义数据源、自定义规则等。
在集群化部署中,可以根据需要实现自定义的扩展点,以满足特定的业务需求或性能要求。
6. 监控和告警:
在 Sentinel 的集群化部署中,需要配置合适的监控和告警机制,以便及时发现和处理潜在的问题或故障。
可以使用 Sentinel 自带的监控功能,或者结合其他监控工具(如 Prometheus、Grafana 等)来实现更全面的监控和告警。
7. 安全性:
在集群化部署中,需要关注安全性问题,例如防止未经授权的访问、防止数据泄露等。
可以通过配置合适的访问控制策略、加密传输数据等方式来提高系统的安全性。

请注意,具体的 Sentinel 集群化部署方案可能因实际情况而有所不同。建议参考 Sentinel 的官方文档和社区资源,结合自身的业务需求和技术栈来制定合适的集群化部署方案。

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值