北京明光云振铎数据科技Java面经
Nacos、OpenFeign、Gateway 三个组件的作用及协作流程首先Nacos 主要负责服务注册发现和配置中心Gateway 作为统一网关入口负责路由、鉴权、限流OpenFeign 负责服务之间的远程调用用户请求先进入 GatewayGateway 会先做 JWT 鉴权比如校验 token 是否合法然后解析 userId通过 Header 透传给后面的微服务。之后 Gateway 会根据路由规则把请求转发到对应服务。这个时候 Gateway 并不是写死 IP而是通过 Nacos 获取服务实例列表实现动态服务发现和负载均衡。比如/api/order/** → cloud-service-order真正调用时Gateway 会从 Nacos 拿到 order-service 的实例。后面如果 order-service 需要调用 user-service就会通过 OpenFeign 发起 RPC 调用。OpenFeign 底层同样会从 Nacos 获取 user-service 的实例地址然后通过 LoadBalancer 做负载均衡。所以整体链路是Client → Gateway → Nacos 服务发现 → OrderService → OpenFeign → UserService这样整个系统就具备服务解耦统一入口治理配置动态管理MySQL 慢查询如何分析索引优化有哪些1.查看慢查询日志2.explain对应的sql查询语句3. 分析是否命中索引4. 分析索引是否失效5. 分析是否存在回表 filesort / temporary6.判断是否需要分库分表优化7.查看是不是数据库连接池满了导致的偶尔慢查询Redis 缓存穿透、击穿、雪崩的区别及解决方案缓存穿透是查询一个不存在的数据。因为缓存和数据库都没有请求会直接打到数据库。解决方案一般是缓存空值redis缓存空值布隆过滤器缓存击穿是某个热点 key 突然失效。大量请求同时访问数据库这个是高并发场景最危险的。解决方案Redis 分布式锁setnx expireLua 保证原子性热点数据永不过期缓存雪崩是大量 key 同时过期导致数据库瞬间压力暴增。解决方案过期时间随机化多级缓存熔断降级限流保护定时任务的实现方式如何避免集群环境下任务重复执行如何防止任务堆积我项目里定时任务用的是 XXL-JOB。由调度中心统一触发任务业务服务作为执行器 Executor注册到调度中心。这样在集群环境下调度中心会根据路由策略选择某个执行器节点执行任务不会让每个节点都各自执行一遍。比如我会配置路由策略第一个 / 轮询 / 一致性 Hash / 分片广播 阻塞处理策略单机串行 失败重试次数有限次数其中避免重复执行主要靠两点第一任务不是每个节点自己触发而是由 XXL-JOB 调度中心统一调度第二对于同一个任务可以配置单机串行避免上一次还没执行完下一次又重复触发。依赖包引入导致脏数据的识别规则及自动清理实现方式识别规则1. 唯一性校验比如用户 id、手机号、业务单号不能重复。2. 完整性校验必填字段不能为空比如 userId、tenantId、status。3. 时间有效性校验比如过期数据、历史版本数据不能覆盖新数据。自动清理实现上我一般不会直接物理删除而是采用定时任务扫描→ 按规则识别脏数据→ 标记为 DIRTY / INVALID→ 记录清理日志→ 异步清理或人工复核数据更新时如何保证用户服务中缓存数据及时清除与更新用户数据更新时我不会直接更新缓存而是先更新数据库再删除缓存。因为缓存本身是派生数据数据库才是主数据源。具体流程是用户服务更新 MySQL 成功后删除 Redis 中的缓存如果系统有多级缓存还会发布 MQ 消息让其他服务或其他节点删除本地缓存对于并发场景可以加延迟双删降低旧数据重新写入缓存的概率。延迟双删是什么“更新数据库后删除两次缓存”如何用Java 和 Redis 实现滑动窗口限流器我会用 Redis 的 ZSET 实现滑动窗口限流。ZSET 的 score 存请求时间戳member 存请求唯一标识。每次请求进来先删除窗口外的旧请求再统计当前窗口内请求数量。如果数量超过阈值就拒绝如果没超过就把当前请求写入 ZSET。由于删除、统计、判断、写入这几个操作必须保证原子性所以我会用 Lua 脚本在 Redis 端一次性执行避免并发场景下限流失效。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2617368.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!