面试问题zuul如何实现流量控制

简述

Spring Cloud Zuul RateLimit项目Github地址:

https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit

该包实现了在Zuul对每个服务进行限流。提供的几种限流方式:

1. 认证用户(Authenticated User)

使用已认证的用户名(username)或'anonymous'

2. 原始请求(Request Origin)

使用用户的原始请求

3. URL

使用上游请求的地址

4. 针对每个服务的全局配置

该方式不会验证Request Origin,Authenticated User或URL

使用该方式只需不设置‘type’参数即可


使用方式

pom.xml增加依赖:

<dependency>

      <groupId>com.marcosbarbero.cloud</groupId>

      <artifactId>spring-cloud-zuul-ratelimit</artifactId>

      <version>1.3.2.RELEASE</version>

</dependency>

配置示例:

zuul:

    ratelimit:

        key-prefix: your-prefix  #对应用来标识请求的key的前缀

        enabled: true

        repository: REDIS  #对应存储类型(用来存储统计信息)

        behind-proxy: true  #代理之后

        default-policy: #可选 - 针对所有的路由配置的策略,除非特别配置了policies

             limit: 10 #可选 - 每个刷新时间窗口对应的请求数量限制

             quota: 1000 #可选-  每个刷新时间窗口对应的请求时间限制(秒)

              refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)

               type: #可选 限流方式

                    - user

                    - origin

                    - url

          policies:

                myServiceId: #特定的路由

                      limit: 10 #可选- 每个刷新时间窗口对应的请求数量限制

                      quota: 1000 #可选-  每个刷新时间窗口对应的请求时间限制(秒)

                      refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)

                      type: #可选 限流方式

                          - user

                          - origin

                          - url

通用应用程序配置

配置命名空间:zuul.ratelimit

说明:使用不同的repository,需要在pom中加入相关的依赖包。

Policy属性:


测试

1. 启动一个Zuul服务和一个API服务,配置正常的路由规则。访问API:

2. 按照上面的使用方式,重新启动配置有RateLimit的Zuul。相关配置:

3. 在postman中集中运行12次相同的API调用,结果中有两次调用返回429:

4. 查看对应的Response Headers和Body的信息:

自定义Key策略

如果希望自己控制key的策略,可以通过自定义RateLimitKeyGenerator的实现来增加自己的策略逻辑。

实例:

根据请求上的参数来对请求进行限流。比如有一个请求是http://localhost:8765/api-a//hello2?name=kevin,对相同的name值进行限流。我们设置了1分钟内,限流10次,那么如果1分钟内,name是kevin的请求超过10次,就会发生限流。

RateLimitKeyGenerator的实现:

测试

同时发送13个请求,其中name=kevin的有11次,name=marry的有2次,测试结果如下:



作者:zlup
链接:https://www.jianshu.com/p/d165e12df1da
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
<think>嗯,用户之前问过关于异步消峰的问题,现在又问Spring Cloud的常问面试题。可能需要先回顾一下之前的回答结构,确保保持一致性。用户可能正在准备面试,需要系统的知识点总结,特别是高频问题。 首先,Spring Cloud的面试题通常涉及核心组件、服务注册与发现、负载均衡、熔断机制、配置管理、网关、分布式事务等。需要确定哪些是面试中最常见的,比如Eureka、Ribbon、Hystrix、Feign、Zuul/Gateway、Config、Bus、Sleuth等。 接下来要考虑用户的潜在需求,他们可能希望知道每个组件的作用、原理、使用场景以及常见问题的解决方案。例如,Eureka和Nacos的区别,Ribbon的负载均衡策略,Hystrix的熔断原理等。 另外,用户可能对实际应用中的问题处理感兴趣,比如服务雪崩的解决方案,配置中心的热更新实现,分布式链路追踪如何整合等。需要结合项目经验,给出具体的例子,比如在某个系统中如何用Hystrix防止级联故障。 还要注意面试中的高频追问点,比如组件之间的对比,优缺点分析,实际应用中的挑战和解决方案。例如,比较Zuul和Gateway,或者解释CAP定理在服务注册中心的应用。 可能需要整理出结构化的回答,分模块列出问题,并给出简明扼要的答案,同时附上可能的扩展点,帮助用户在面试时灵活应对。此外,代码示例或配置片段能增加回答的可信度,比如Feign的声明式调用示例,或者Hystrix的配置参数。 最后,要确保回答符合用户之前的偏好,使用中文、结构清晰、分点说明,并包含实际案例和常见追问点的应对策略。这样用户能系统地掌握Spring Cloud的面试要点,提升回答的深度和广度。</think>以下是Spring Cloud常见面试问题及回答要点整理,按技术模块分类,助你系统化应对面试: --- ### **一、核心组件总览** **高频问题**:Spring Cloud有哪些核心组件?各自作用是什么? **回答模板**: ```text Spring Cloud五大核心组件构成微服务解决方案: 1. **Eureka/Nacos**:服务注册与发现中心(AP模型) 2. **Ribbon/LoadBalancer**:客户端负载均衡 3. **Feign/OpenFeign**:声明式HTTP客户端 4. **Hystrix/Sentinel**:服务熔断与降级 5. **Zuul/Gateway**:API网关(路由+过滤) 6. **Config/Nacos**:分布式配置中心 7. **Sleuth/Zipkin**:分布式链路追踪 ``` --- ### **二、服务注册与发现** #### **1. Eureka vs Nacos** | **对比项** | Eureka | Nacos | |------------------|---------------------------------|--------------------------------| | 一致性协议 | AP模型(最终一致) | AP/CP可切换 | | 健康检查 | 客户端心跳(30s) | TCP/HTTP/MYSQL多模式 | | 配置管理 | 不支持 | 内置配置中心 | | 雪崩保护 | 自我保护模式 | 集群流量控制 | #### **2. 服务注册原理** ```text 1. 服务启动时向注册中心发送元数据(IP、端口、健康状态) 2. 注册中心通过心跳机制维护服务列表 3. 消费者定期拉取服务列表(Eureka默认30s) 4. Ribbon本地缓存服务列表进行负载均衡 ``` --- ### **三、服务通信** #### **1. Ribbon负载均衡策略** - **策略类型**: - RoundRobinRule(轮询) - RandomRule(随机) - WeightedResponseTimeRule(响应时间加权) - BestAvailableRule(跳过故障节点) - **自定义策略示例**: ```java @Configuration public class MyRuleConfig { @Bean public IRule customRule() { return new RandomRule(); // 改为随机策略 } } ``` #### **2. OpenFeign优化技巧** - **性能优化**: ```yaml feign: client: config: default: connectTimeout: 5000 # 连接超时 readTimeout: 10000 # 读取超时 loggerLevel: basic # 日志级别 ``` - **支持文件上传**: ```java @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String uploadFile(@RequestPart("file") MultipartFile file); ``` --- ### **四、服务容错** #### **1. Hystrix工作原理** ```text 1. 线程池隔离:为每个依赖服务分配独立线程池 2. 熔断机制:当失败率超过阈值(默认50%),打开熔断器 3. 降级处理:触发fallback方法返回默认值 4. 自动恢复:熔断后经过sleepWindowInMilliseconds(默认5s)进入半开状态 ``` #### **2. 服务雪崩解决方案** ```text 1. 限:Sentinel配置QPS阈值 2. 熔断:Hystrix设置circuitBreaker.errorThresholdPercentage 3. 降级:返回缓存数据或友好提示 4. 异步调用:使用@Async解耦服务调用链 ``` --- ### **五、配置中心** #### **1. 动态刷新原理** ```text 1. 客户端启动时拉取配置(通过bootstrap.yml) 2. 监听配置中心消息总线(Spring Cloud Bus) 3. 收到/actuator/refresh请求后,通过RabbitMQ广播刷新事件 4. 所有节点刷新Environment对象 ``` #### **2. 配置加密实践** ```text 1. 使用JCE生成密钥:keytool -genkeypair -alias configkey 2. 配置文件中使用{cipher}加密值 3. 通过Config Server的/encrypt端点加密数据 ``` --- ### **六、网关层** #### **1. Gateway vs Zuul** | **对比项** | Zuul 1.x | Spring Cloud Gateway | |------------------|-------------------------------|--------------------------------| | 性能 | 基于Servlet阻塞模型 | 基于WebFlux非阻塞 | | 过滤器类型 | pre/post/routing/error | global/route过滤器 | | 动态路由 | 需结合Config | 支持从Nacos实时获取路由配置 | | 限支持 | 需集成Sentinel | 内置RequestRateLimiter | #### **2. 网关限配置** ```yaml spring: cloud: gateway: routes: - id: user_route uri: lb://user-service predicates: - Path=/api/user/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 # 每秒令牌数 redis-rate-limiter.burstCapacity: 20 # 令牌桶容量 key-resolver: "#{@ipKeyResolver}" # 按IP限 ``` --- ### **七、高频进阶问题** #### **1. 如何实现分布式事务?** ```text 方案选择: - **Seata AT模式**:通过全局锁+undo_log实现两阶段提交 - **消息队列最终一致**:本地事务表+MQ消息(RocketMQ事务消息) - **TCC模式**:try-confirm-cancel三阶段(需要业务编码) ``` #### **2. 如何设计灰度发布?** ```text 实现步骤: 1. 网关层通过Header携带版本标记 2. Ribbon根据规则路由到指定版本服务 3. Nacos元数据管理分组信息 4. 结合Prometheus监新版本指标 ``` --- ### **八、面试加分项** 1. **性能调优经验**: "在订单系统中,通过调整Ribbon的ServerListRefreshInterval(从30s改为5s),服务发现延迟降低80%" 2. **监体系搭建**: "使用Prometheus收集Hystrix指标,Grafana配置熔断监看板,设置企业微信报警" 3. **云原生实践**: "将Eureka迁移到Nacos,利用其CP模式保障配置一致性,整合K8s实现自动扩缩容" --- ### **九、常见陷阱问题** **Q**:为什么不用Spring Cloud而选Dubbo? **A**: ```text 1. Dubbo优势:性能更高(基于Netty长连接)、RPC调用更高效 2. Spring Cloud优势:生态完整(配置中心、网关等全套方案)、RESTful天然跨语言 3. 混合方案:Dubbo + Nacos + Sentinel(阿里云推荐) ``` **Q**:Spring Cloud Alibaba与Netflix组件的区别? **A**: ```text 1. 注册中心:Eureka → Nacos(支持CP/AP) 2. 熔断器:Hystrix → Sentinel(流量控制更精细) 3. 配置中心:Config → Nacos Config(实时推送能力) 4. 网关:Zuul → Gateway(性能提升5倍+) ``` --- 掌握以上知识点后,建议结合自身项目经验准备**具体案例**(如:"在xx项目中用Gateway实现鉴权过滤,拦截非法请求3万次/天")。面试时重点展现**技术选型能力**与**问题解决思维**。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值