首页 > 其他分享 >微服务设计模式:节流模式(Throttling Pattern)

微服务设计模式:节流模式(Throttling Pattern)

时间:2024-11-03 23:16:08浏览次数:6  
标签:Spring 请求 Throttling Pattern springframework org import 设计模式 节流

微服务设计模式:节流模式(Throttling Pattern)

Throttling Pattern

定义

节流模式(Throttling Pattern)是一种控制资源使用速率的设计模式,广泛应用于云计算和微服务架构中,以防止服务过载和资源耗尽。它通过限制客户端请求的数量,保证系统稳定性和可用性。

结构

节流模式的核心组件包括:

  1. 请求过滤器:拦截请求并进行计数。
  2. 计数器:记录每个用户的请求数量。
  3. 请求限制器:判断请求是否超过限制。
  4. 响应处理器:拒绝超出限制的请求并返回适当响应。
+---------------------------+
|      请求过滤器            |
+-----------+---------------+
            |
            v
+-----------+---------------+
|         计数器             |
+-----------+---------------+
            |
            v
+-----------+---------------+
|      请求限制器            |
+-----------+---------------+
            |
            v
+-----------+---------------+
|      响应处理器            |
+---------------------------+

工作原理

节流模式的整个工作原理可以分为以下几个步骤:

  1. 请求拦截
    • 每个客户端发送的请求都需要经过一个请求过滤器,该过滤器负责对请求进行初步检查。
  2. 计数和记录
    • 计数器会记录每个客户端在单位时间内的请求数量。这个计数器可以存储在内存中,也可以使用分布式缓存(如Redis)来实现,以支持分布式系统。
  3. 速率检查
    • 请求限制器会根据计数器的数据检查当前的请求速率是否超过了预设的阈值。如果未超过,则允许请求继续处理;如果已超过,则请求被拒绝。
  4. 响应处理
    • 对于被拒绝的请求,响应处理器会返回特定的HTTP状态码(通常是429 Too Many Requests),并且可以给出详细的错误信息。

优势

  1. 防止系统过载

    • 稳定性提升:在高并发环境下,防止系统因请求量过大而崩溃。
    • 可用性保障:确保服务在高负载情况下依然可以对外提供有限度的服务。
  2. 预防滥用和恶意攻击

    • 安全防护:防止恶意用户利用DDoS攻击大量请求来消耗系统资源。
    • 公平使用:确保每个用户都能公平地使用系统资源。
  3. 资源优化

    • 有效利用资源:避免资源被非关键性请求消耗,确保关键业务的优先响应。
    • 成本控制:在云计算环境中,通过限制请求频率,可以间接控制服务器的自动扩展,节省成本。
  4. 实现业务策略

    • 支付系统限制:对支付等高敏感业务进行请求限制,以防止重复操作和系统压力。

    • API 限流:用于对外开放的API接口,进行速率限制以防止单个用户过度使用资源。

Spring拦截器

Spring Interceptor 是 Spring MVC 框架中的一个关键组件,适用于处理 HTTP 请求的预处理和后处理。它提供了在请求进入 Controller 之前和响应离开之后进行自定义逻辑处理的机制。Spring Interceptor 是实现 HandlerInterceptor 接口的类,它允许在处理 HTTP 请求和生成响应的过程中拦截这些请求和响应,进行一些前置或后置处理。

HandlerInterceptor 接口

该接口有三个主要方法:

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler): 在请求被发送到控制器之前调用。返回 true 继续请求,返回 false 中止请求。可以用来做身份认证、日志记录或限流等操作。
  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView): 在控制器方法调用之后但在视图渲染之前调用,可以对传递到视图的数据进行加工。
  3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex): 在整个请求之后调用,用于清理资源或记录日志。

Interceptor 与 Filter 的对比

  • Filter:

    • 基于 Servlet 规范工作。
    • 在请求到达 DispatcherServlet 之前和离开之后工作。
    • 更底层,主要用于处理请求和响应的流。
  • Interceptor:

    • 基于 Spring MVC 框架工作。

    • 在 DispatcherServlet 内部工作,适用于更细粒度的控制请求处理。

    • 更高级,主要用于应用业务逻辑。

代码示例

下面将详细讲解如何使用 Spring Interceptor 实现节流模式,并且如何将其应用于特定的 API。

Throttling-Pattern-Sequence

项目结构

spring-boot-throttling/
│
├── src/main/java/com/example/throttling/
│   ├── ThrottlingApplication.java
│   ├── config/
│   │   └── WebConfig.java
│   ├── interceptor/
│   │   └── RateLimitInterceptor.java
│   └── controller/
│       └── HelloController.java
└── src/main/resources/
    └── application.yml

创建 Interceptor

首先,我们需要创建一个 Rate Limit Interceptor 实现节流模式逻辑。以下示例使用 Google Guava 的 RateLimiter 来管理请求速率。

package com.example.throttling.interceptor;

import com.google.common.util.concurrent.RateLimiter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class RateLimitInterceptor implements HandlerInterceptor {

    // 每秒允许处理的请求数:100次/60秒
    private final RateLimiter rateLimiter = RateLimiter.create(100.0 / 60.0);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (rateLimiter.tryAcquire()) {
            return true; // 允许请求继续处理
        } else {
            response.setStatus(HttpServletResponse.SC_TOO_MANY_REQUESTS);
            response.getWriter().write("Too many requests, please try again later.");
            return false; // 请求被拒绝
        }
    }
}

配置 Interceptor

在 Spring Boot 中,通过 WebMvcConfigurer 配置拦截器并将它应用到你的 API。

package com.example.throttling.config;

import com.example.throttling.interceptor.RateLimitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private RateLimitInterceptor rateLimitInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 这里添加拦截器,并且指定需要拦截的路径模式
        registry.addInterceptor(rateLimitInterceptor).addPathPatterns("/api/limited/**");
    }
}

在这个例子中,拦截器只会应用于 /api/limited/** 路径下的所有请求。

创建REST 控制器

创建一个简单的 REST 控制器,包含一个被节流的 API。

package com.example.throttling.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }

    @GetMapping("/limited/hello")
    public String limitedHello() {
        return "Hello, Limited World!";
    }
}

/api/limited/hello 这个 API 就会受到节流限制,而 /api/hello 不会。

启动主程序

package com.example.throttling;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ThrottlingApplication {
    public static void main(String[] args) {
        SpringApplication.run(ThrottlingApplication.class, args);
    }
}

总结

Robert-C-Martin-Quote-If-we-all-checked-in-our-code-a-little

节流模式(Throttling Pattern)是一种用来限制请求频率的设计模式,在云计算和微服务架构中非常重要。它通过对请求进行计数和限制,防止系统过载,保证资源的公平使用。Spring Boot 支持通过拦截器实现这一模式,为开发者提供了简便灵活的实现方式。通过理解和应用节流模式,可以有效提升系统的稳定性和可用性。当然,Spring Interceptor 是在 Spring MVC 中用于拦截 HTTP 请求和响应的重要工具。通过使用拦截器,你可以在请求到达控制器之前和响应离开控制器之后进行自定义处理,这使得它非常适合用于实现节流模式等跨应用的关注点。

标签:Spring,请求,Throttling,Pattern,springframework,org,import,设计模式,节流
From: https://blog.csdn.net/2404_88048702/article/details/143424184

相关文章

  • c#-设计模式之观察者模式
    c#-设计模式之观察者模式概念指多个对象之间存在一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。该模式又称为包括发布-订阅(Publish/Subscribe)模式,该模式是行为型模式。结构图角色Subject(观察目标):观察目标是指被观察的对象,一般......
  • 设计模式之——代理模式
    一、代理模式概述在C++中,代理模式是一种结构型设计模式,它为其他对象提供一种代理,从而控制对这个对象的访问。代理模式的作用主要体现在以下几个方面:职责清晰:真实的角色即实现实际的业务逻辑,不用关心其他非本职的事务,通过后期的代理来完成事务,使得编程简洁清晰。例如在视频......
  • 【设计模式系列】原型模式(十一)
    一、什么是原型模式原型模式(PrototypePattern)是一种创建型设计模式,它使得一个对象可以复制自身,从而创建一个与自己属性一致的新对象,而无需知晓对象创建的细节。这种模式允许动态地增加对象的数量,并通过复制现有的对象来提高效率,特别是当直接创建对象的代价较大时(例如,涉及复杂......
  • 异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)
     ......
  • POLIR-Society-Organization-Politics: “How”-政治分析的普遍适用pattern: Versatil
    总部、实控人及其关系网、资本量+流通规模总部税收记入何方“地方/中央”政权组织网络,与实际受何方政治组织调控;董事会、高管层,的国籍、常住地,资产管理方、家庭成员情况不动产:总部大厦、资金存管方:银行、信托、资产管理方资本量+流通规模资本、投资公司、金融管理......
  • 学习高校课程-软件设计模式-责任链模式和命令模式(lec9)
    原文链接ChainofResponsibility:ProblemExample:anonlineorderingsystem示例:在线订购系统–Therequestmustpassaseriesofchecks–Newrequirements:validation,filteringrepeatedfailedrequests,speedingupbyreturningcachedresults,andmore–......
  • 学习高校课程-软件设计模式-享元模式和代理模式(lec8)
    原文链接Flyweight:ProblemEachparticle,suchasabullet,amissileorapieceofshrapnelwasrepresentedbyaseparateobjectcontainingplentyofdata.Atsomepoint,whenthecarnageonaplayer’sscreenreacheditsclimax,newlycreatedparticlesno......
  • 学习高校课程-软件设计模式-组合模式、装饰器模式和外观模式(lec7)
    原文链接Composite:ProblemUsingtheCompositepatternmakessenseonlywhenthecoremodelofyourappcanberepresentedasatree.仅当应用程序的核心模型可以表示为树时,使用复合模式才有意义。Forexample,imaginethatyouhavetwotypesofobjects:Products......
  • 【云原生】云原生后端:最佳实践与设计模式
    这里写目录标题引言一、云原生的核心概念1.1云原生定义1.2关键特性1.3云原生vs.传统架构二、云原生最佳实践2.1微服务架构2.2采用容器化2.3持续集成与持续交付(CI/CD)2.4API驱动设计2.5服务发现与负载均衡三、常见设计模式3.1服务拆分模式3.2事件驱动架构3.......
  • 【设计模式】异步阻塞、异步回调模式
    1 前言为什么要看这个异步回调呢?是因为我上节在看RocektMQ发送消息的时候,它支持同步、异步、一次性的模式,后两者不会阻塞当前线程,但是看这两者都没用到线程池,那它是如何处理的呢?我们看下三者最后的落点,都是在 NettyRemotingAbstract这个类里://NettyRemotingAbstract#inv......