SpringCloud 问题

springcloud 五大组件

  • Eureka / nacos
  • Ribbon
  • Feign / dubbo
  • Hystrix / sentinel
  • Zuul/Gateway

服务注册和发现是什么意思,SpringCloud 如何实现服务注册和发现?

nacos 和 eureka 的区别?

  • 相同点
    • 服务提供者 注册 服务信息 到 注册中心
    • 服务消费者 定时从 注册中心 拉取
    • 服务消费者 对 服务提供者 进行远程调用
    • 服务提供者 临时实例 采用心跳检查
      • 什么是临时实例?
        • 默认实例都是临时实例
        • 临时实例心跳模式
        • 非临时主动探测
        • 临时实例没有心跳会被剔除
        • 非临时不会被剔除
        • ephemeral: false 变成非临时实例
          • 非临时实例,nacos会主动询问服务提供者是否存活
  • 不同点
    • 非临时实例
    • nacos集群AP,如果存在非临时实例,采用CP
    • eureka采用AP
    • nacos还有配置中心

你们项目中负载均衡是如何实现的?

  • Ribbon
  • Ribbon 负载均衡流程
    1. 微服务发起请求
    2. Ribbon 从注册中心拉取
    3. 根据策略进行转发

Ribbon 负载均衡策略有哪些?

  • RoundRobinRule 简单轮询
  • WeightedResponseTimeRule 按照权重来选择服务器,响应时间越长,权重越小
  • RandomRule
  • BestAvailableRule 忽略短路的服务器,选择并发数较低的服务器
  • RetryRule 重试机制的选择逻辑(基于轮询)
  • AvailabilityFilteringRule 可用性敏感策略。先过滤非健康的,再选择连接数比较小的
  • ZoneAvoidanceRule 以区域可用的服务器为基础对服务器选择。

如果想自定义负载均衡策略,如何实现?

  • 自己创建类实现 IRule 接口, 再通过配置类或配置文件配置
  • @Bean IRule 全局生效
  • NFLoadBalancerRuleClassName 局部生效

什么是服务雪崩?如何解决这个问题?

  • 服务雪崩
    • 一个服务失败,导致整条链路都失败的情形
  • 解决方案
    • 降级(接口)
      • Feign 接口走fallback
    • 熔断(整个服务)
      • Hystix
        • @EnableCircuitBreaker
        • 断路器关闭 - 打开 - 半开

你们的微服务是怎么监控的?

  • skywalking
    • apache顶级项目
    • 问题定位
    • 性能分析
    • 服务关系
    • 服务告警

业务相关

项目中有没有做过限流?怎么做的?

  • 限流情况

    • 并发量大
    • 防止用户恶意刷接口
  • 限流实现方式

    • Tomcat 设置最大连接数
      • 适合单体,微服务不太行
    • Nginx 漏桶算法
      • 漏桶以固定的速率漏出请求
      • 控制并发连接数
    • 网关 令牌桶算法
      • filters
        • name: RequestRateLimiter
        • key-resolver
        • redis-rate-limiter.replenishRate
        • redis-rate-limiter-burstCapacity
    • 自定义拦截器

令牌桶和漏桶的区别

解释一下CAP和BASE

  • 分布式系统的三个指标
    • C 一致性
    • A 可用性
    • P 分区容错性
  • BASE 理论
    • Basically Available
    • Soft State
    • Eventually Consistent

分布式事务解法家族

  • 2PC/XA
  • TCC
  • Saga
  • 本地消息表 / 事务性 Outbox

你们项目中采用哪种分布式事务的解决方案

  • Seata
    • TC
    • TM
    • RM
    • 各种模式
      • XA
      • AT
      • TCC
  • MQ分布式事务

分布式服务的接口幂等性如何设计

  • 需要幂等的场景
    • 用户重复点击
    • MQ消息重复
    • 应用使用失败或超时重试机制
  • 幂等保护的操作对象
    • 新增的数据
    • 修改的数据
  • 基于 RESTful API的角度对常见类型请求的幂等性进行分析
    • GET 天然幂等
    • POST 不是幂等
    • PUT 直接SET更新为某个固定常量是幂等,SET引用之前的数据,不是幂等
    • DELETE 幂等
  • 解决接口幂等
    • token + redis
      • 生成唯一token存入redis,返回给前端
      • 第二次请求携带之前token到redis进行颜值
    • 分布式锁(性能比较低)

你们项目中使用了什么样的分布式任务调度

  • xxl-job
    • 解决的问题
      • 集群任务重复执行
      • cron表达式定义灵活
      • 定时任务失败了,重试和统计
      • 任务量大,分片执行
    • xxl-job的路由策略
      • ROUND
      • FAILOVER
      • SHARDING_BROADCAST

xxl-job的路由策略?

xxl-job任务执行失败怎么解决?

故障转移 + 失败重试 查看日志分析 -> 邮件告警

如果有大数据量的任务需要同时执行,怎么解决?

其他

OpenFeign 服务调用过程

flowchart TD

A["业务代码调用
userClient.getById(1L)"] --> B["JDK动态代理 Proxy.invoke"] B --> C["Feign InvocationHandler
MethodHandler"] C --> D["Contract解析注解
@GetMapping / @PathVariable"] D --> E["RequestTemplate构建HTTP请求"] E --> F["参数绑定
Path / Query / Body / Header"] F --> G["服务名解析 user-service"] G --> H["服务发现 Nacos / Eureka"] H --> I["LoadBalancer负载均衡"] I --> J["选择实例 IP:PORT"] J --> K["HTTP Client执行器
OkHttp / Apache / JDK"] K --> L["发送HTTP请求 GET /user/1"] L --> M["远程服务 user-service"] M --> N["Controller处理请求"] N --> O["返回JSON"] O --> P["Feign Decoder反序列化"] P --> Q["JSON → UserDTO"] Q --> R["返回业务代码"]