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 负载均衡流程
- 微服务发起请求
- Ribbon 从注册中心拉取
- 根据策略进行转发
Ribbon 负载均衡策略有哪些?
- RoundRobinRule 简单轮询
- WeightedResponseTimeRule 按照权重来选择服务器,响应时间越长,权重越小
- RandomRule
- BestAvailableRule 忽略短路的服务器,选择并发数较低的服务器
- RetryRule 重试机制的选择逻辑(基于轮询)
- AvailabilityFilteringRule 可用性敏感策略。先过滤非健康的,再选择连接数比较小的
- ZoneAvoidanceRule 以区域可用的服务器为基础对服务器选择。
如果想自定义负载均衡策略,如何实现?
- 自己创建类实现 IRule 接口, 再通过配置类或配置文件配置
- @Bean IRule 全局生效
- NFLoadBalancerRuleClassName 局部生效
什么是服务雪崩?如何解决这个问题?
- 服务雪崩
- 一个服务失败,导致整条链路都失败的情形
- 解决方案
- 降级(接口)
- Feign 接口走fallback
- 熔断(整个服务)
- Hystix
- @EnableCircuitBreaker
- 断路器关闭 - 打开 - 半开
- Hystix
- 降级(接口)
你们的微服务是怎么监控的?
- skywalking
- apache顶级项目
- 问题定位
- 性能分析
- 服务关系
- 服务告警
业务相关
项目中有没有做过限流?怎么做的?
-
限流情况
- 并发量大
- 防止用户恶意刷接口
-
限流实现方式
- Tomcat 设置最大连接数
- 适合单体,微服务不太行
- Nginx 漏桶算法
- 漏桶以固定的速率漏出请求
- 控制并发连接数
- 网关 令牌桶算法
- filters
- name: RequestRateLimiter
- key-resolver
- redis-rate-limiter.replenishRate
- redis-rate-limiter-burstCapacity
- filters
- 自定义拦截器
- Tomcat 设置最大连接数
令牌桶和漏桶的区别
解释一下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进行颜值
- 分布式锁(性能比较低)
- 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["返回业务代码"]