5-微服务篇-4

简介: 本文详解微服务核心治理技术:Ribbon七大负载均衡策略(默认ZoneAvoidanceRule)及自定义IRule实现;Nacos集中化配置管理;网关层Redis令牌桶限流与Sentinel流控降级;Hystrix/Sentinel断路器三态(closed/open/half-open)熔断机制;以及Feign客户端基于FallbackFactory的服务降级实践。(239字)

15- Ribbon负载均衡策略有哪些 ? 如果想自定义负载均衡策略如何实现 ?

Ribbon默认的负载均衡策略有七种 :
image.png
默认的实现就是ZoneAvoidanceRule,是一种轮询方案

如果想要自定义负载均衡 , 可以自己创建类实现IRule接口 , 然后再通过配置类或者配置文件配置即可 :

通过定义IRule实现可以修改负载均衡规则,有两种方式:

  1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
    @Bean

public IRule randomRule(){

   return new RandomRule();

}

  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
    userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务

 ribbon:

   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

16- 项目的配置文件是怎么管理的 ?

大部分的固定的配置文件都放在服务本地 , 一些根据环境不同可能会变化的部分, 放到Nacos中

17- 你们项目中有没有做过限流 ? 怎么做的 ?

限流一般有二种方式设置 : 第一种 : 网关配置限流
spring:

 application:

   name: api-gateway

 redis:

   host: localhost

   port: 6379

   password:

 cloud:

   gateway:

     routes:

       - id: cloud-gateway

         uri: http://192.168.1.211:8088/

         predicates:

           - Path=/ytb/**

         filters:

           - StripPrefix=1

           - name: RequestRateLimiter

             args:

               redis-rate-limiter.replenishRate: 1   # 令牌桶每秒填充速率

               redis-rate-limiter.burstCapacity: 2   # 令牌桶总容量

               key-resolver: "#{@pathKeyResolver}"   # 使用 SpEL 表达式按名称引用 bean
在上面的配置文件,配置了 redis 的信息,并配置了 RequestRateLimiter 的限流过滤器,该过滤器需要配置三个参数:

burstCapacity,令牌桶总容量。replenishRate,令牌桶每秒填充平均速率。key-resolver,用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据 #{@beanName} 从 Spring 容器中获取 Bean 对象
@Configuration

public class KeyResolverConfiguration {

@Bean

public KeyResolver pathKeyResolver(){

    return exchange -> Mono.just(exchange.getRequest().getURI().getPath());

}

}
常见的限流算法有:计数器算法,漏桶(Leaky Bucket)算法,令牌桶(Token Bucket)算法。

Spring Cloud Gateway官方提供了RequestRateLimiterGatewayFilterFactory过滤器工厂,使用Redis 和Lua脚本实现了 令牌桶 的方式。

令牌桶算法 是对漏桶算法的一种改进,漏桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。

放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌。所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。

第二种 : 使用服务保护组件Sentinel实现限流

  • 引入Sentinel 依赖
  • 配置控制台地址,项目接入控制台
  • 定义限流规则:QPS 限流、线程数限流
  • 注解@SentinelResource标记接口 / 方法
  • 配置限流降级兜底方法
  • 控制台实时调整流控阈值,生效拦截

    @SentinelResource(value = "getUser", blockHandler = "flowHandler")
  • public Result getUser(){...}
  • // 限流兜底
  • public Result flowHandler(BlockException e){    
  • return Result.fail("请求太频繁,请稍后重试");
  • }

18- 断路器/熔断器用过嘛 ? 断路器的状态有哪些

我们项目中使用Hystrix/Sentinel实现的断路器 , 断路器状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
  • 请求成功:则切换到closed状态
  • 请求失败:则切换到open状态

19- 你们项目中有做过服务降级嘛 ?

我们项目中涉及到服务调用得地方都会定义降级, 一般降级逻辑就是返回默认值 , 降级的实现也非常简单 , 就是创建一个类实现FallbackFactory接口 , 然后再对应的Feign客户端接口上面 , 通过@FeignClient指定降级类

@Component

@Slf4j

public class OrderServiceFallbackFactory implements FallbackFactory<OrderService> {

   @Override

   public OrderService create(Throwable throwable) {

       log.error("调用订单服务失败",throwable);


       return new OrderService() {

           @Override

           public String weixinPay(PayVO payVO) {

               return null;

           }


           @Override

           public Pager<OrderVO> search(Integer pageIndex, Integer pageSize, String orderNo, String openId, String startDate, String endDate) {

               return new Pager<>();

           }


           @Override

           public List<Long> getBusinessTop10Skus(Integer businessId) {

               return Lists.newArrayList();

           }

       };

   }

}

目录
相关文章
|
2月前
|
存储 人工智能 API
DeepSeek-V4百万上下文来了,企业数据中心准备好了吗?
DeepSeek-V4虽突破模型上限,但企业落地关键在私有化部署的“落地上限”。ZStack AIOS作为国产MaaS平台,一站式解决算力池化、异构纳管、极简部署、应用集成与安全治理难题,已支持V4全系列即装即用,助力政企高效、合规、自主地用好大模型。
|
30天前
|
人工智能 弹性计算 数据可视化
阿里云 Hermes Agent 全流程可视化一键部署方案
Hermes Agent 是开源自主AI智能体框架,具备自进化、持久记忆、多模型兼容与多端接入能力。阿里云提供全流程可视化一键部署方案,仅需两步(购买预装服务器 + 配置API Key),最快分钟级上线,助力个人开发者与小团队快速落地AI应用。
288 3
|
27天前
|
人工智能 前端开发 JavaScript
用AI重塑RPA稳定性:实在Agent TARS语义定位技术拆解与落地实践
实在智能在实在Agent v7.3.4中推出TARS AI元素定位技术,通过视觉-语义联合建模,实现多模态编码、语义锚点生成与动态匹配优化,显著提升RPA在敏捷前端环境下的元素识别稳定性与自适应能力,配置即用,助力企业自动化迈向真正无人值守。(239字)
|
2月前
|
安全 JavaScript 前端开发
React2Shell 漏洞自动化凭证窃取攻击机理与防御研究
CVE-2025-55182(React2Shell)是CVSS 10.0的高危RCE漏洞,可无认证、无交互远程接管Next.js等RSC应用服务器。2026年已爆发规模化自动化凭证窃取攻击,单日入侵766台服务器。本文系统剖析漏洞机理与攻击链,构建检测、监控、防御、响应一体化闭环体系,提供可落地的代码与方案。(239字)
251 16
|
20天前
|
存储 关系型数据库 MySQL
7-事务控制篇-4
InnoDB支持事务、行级锁、外键及聚簇索引,具备崩溃恢复能力,是MySQL 5.5+默认引擎;MyISAM不支持事务与行锁,仅表级锁,存行数、用非聚簇索引,适合读多写少场景。
100 5
|
20天前
|
人工智能 安全 搜索推荐
AI技术在少儿英语学习中的应用
AI正推动少儿英语学习迈入“智能体时代”:针对3–12岁儿童注意力短、发音稚嫩、认知具象等特点,打造多模态虚拟外教、AI互动绘本、童音定制评测、动态生成故事四大核心场景,深度融合SLA教学理论、儿童专用语音模型与内容安全护栏,并通过家长端AI成长报告实现教育闭环。(239字)
|
20天前
|
消息中间件 负载均衡 Java
5-微服务篇-3
微服务是职责单一、独立部署的轻量级服务。优点:松耦合、语言无关、易扩展;缺点:运维复杂、通信压力大。项目中采用Feign(HTTP同步)与RabbitMQ/Kafka(异步)通信,基于Nacos实现服务注册发现与负载均衡。(239字)
164 1
|
2月前
202603 HiClaw Monthly · 脱壳月报第 1 期
HiClaw 诞生月,持续进化,向上生成。
185 38
|
2月前
|
安全 Java 程序员
深入解析C++的RAII、Java的try-with-resources与PHP的finally及自定义资源管理
资源管理是编程中永恒的主题。C++的RAII(Resource Acquisition Is Initialization)、Java的try-with-resources、以及PHP的finally语句和析构函数,代表了三种不同的资源管理哲学。
142 7
|
20天前
|
存储 SQL 关系型数据库
7-事务控制篇-5
事务具ACID四大特性:原子性(全成或全败)、一致性(状态合法)、隔离性(并发互不干扰)、持久性(提交即永久)。索引需注意字段非空、高区分度、长度适中、数量适度(更新频繁表≤3个),过多索引会增空间开销、拖慢增删改性能。
116 0