6.14
基础概念
ElasticSearch 是什么、核心定位与应用场景?
ES 优缺点分别有哪些?
ES 和 MySQL 区别、适用场景怎么选型?
为什么要用 ES 做全文检索,不用数据库模糊查询?
核心架构与集群
ES 集群节点角色有哪些?各自作用?
主分片、副本分片概念与作用?
分片数、副本数生产配置原则是什么?
ES 集群脑裂问题是什么、怎么解决?
ES 集群选举机制、最小 Master 节点配置?
集群扩容、缩容分片如何重新分配?
索引与文档
ES 索引、类型、文档、字段分别是什么?
ES 7.x 为什么废弃 Type?
倒排索引原理是什么?正向索引和倒排索引区别?
分词器是什么?常用内置分词器有哪些?
映射 Mapping 是什么?动态映射与静态映射区别?
字段类型 keyword 和 text 区别、使用场景?
ES 索引创建、删除、重建索引注意事项?
分词与搜索原理
全文检索底层执行流程?
分词流程是怎样的?
什么是精确查询、什么是模糊查询?
打分机制 TF-IDF、BM25 原理与区别?
如何自定义分词器、接入 IK 分词器?
查询语法与 DSL
常用 DSL 查询有哪些?
match 和 term 查询区别?
bool 组合查询 must、should、must_not、filter 区别?
filter 和 query 底层原理、性能差异?
聚合查询有哪些常用类型?分组、统计、直方图怎么用?
深度分页问题是什么?from+size 为什么有上限?
深分页解决方案有哪些?优缺点对比?
写入原理与底层机制
ES 文档写入完整流程?
什么是缓冲缓冲区、事务日志 translog、段 Segment?
刷新 refresh、刷盘 flush、合并 merge 各自作用?
文档更新为什么是标记删除 + 重建?
ES 近实时搜索怎么实现?
高可用与数据一致性
主分片写入、副本同步流程?
ES 如何保证数据不丢失?
分片分配规则、路由算法是什么?
单点宕机后集群如何自愈?
性能优化
ES 写入性能优化方案有哪些?
ES 查询检索性能优化从哪些方面入手?
大索引如何做拆分、冷热分离?
生产环境 ES JVM 配置、内存调优注意什么?
如何避免 ES 集群雪崩、查询打挂集群?
业务实战与问题排查
MySQL 和 ES 数据同步方案有哪些?优缺点?
如何实现定时增量同步、实时同步?
ES 海量数据怎么批量导入?
日志收集 ELK 架构原理是什么?
ES 常见故障:查询慢、写入卡顿、分片无法分配怎么排查?
进阶
ES 事务支持情况、能不能保证强一致性?
什么是父子文档、嵌套文档?使用场景?
ES 集群跨机房部署怎么做?
ES 版本控制、乐观锁实现原理?
如何解决 ES 重复数据问题?
一、目前主流的微服务架构实现方案
-
组件的选型
1)注册中心:Nacos(替代 Eureka)
2)配置中心:Nacos(替代 Spring Cloud Config)
3)网关:Spring Cloud Gateway(替代 Zuul)
4)服务调用:OpenFeign
5)服务调用负载均衡:Spring Cloud LoadBalancer(替代 Ribbon)
6)熔断限流降级:Sentinel 或者 Resilience4j(替代 Hystrix)
7)链路追踪:SkyWalking 或者 Sleuth + Zipkin -
组件选型的演变过程
1)2018:Netflix 宣布 Eureka、Zuul、Ribbon、Hystrix 等进入维护模式,只修致命 bug,不加新功能
2)2020–2021:Spring Cloud 正式弃用移除 Netflix 组件,推自己的替代方案
二、注册中心 Nacos
- 注册中心两大核心作用
1)服务发现
· 指的是让服务能找到其他服务
· 解决问题:微服务动态扩缩容时,调用方无需硬编码服务实例信息(ip:port)
· 应用场景:业务服务之间的调用、服务调用负载均衡、网关转发客户端请求到微服务
2)服务治理
· 服务健康检查(心跳机制)
· 服务上下线管理
· 故障隔离
- 健康检测机制
1)临时实例
· 客户端通过心跳方式主动上报,服务失效自动剔除,适合云原生、k8s场景
· 客户端每 5 秒发送心跳,15 秒未收到心跳标记不健康,30 秒未收到心跳自动剔除(心跳检测机制)
2)永久实例
· 服务端通过 TCP/HTTP/MySQL 方式主动探测,服务失效仅标记不健康但不下线,适合虚拟机、物理机场景
· TCP 探测:默认 10000 毫秒、HTTP 探测:GET 请求,预期 200、MySQL 探测:执行 SELECT 1
(默认是临时实例,永久实例配置 spring.cloud.nacos.discovery.ephemeral = false)
-
AP 还是 CP
1)默认是 AP 模式,保证高可用,容忍短暂数据不一致
2)如果注册实例时设置为非临时实例(ephemeral=false),Nacos 会切换到 CP 模式来保证该实例信息的强一致性 -
集群节点怎么同步数据
-
如何实现高可用
-
单机以及集群模式下客户端如何配置
1)单机模式配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2)集群模式配置
spring.cloud.nacos.discovery.server-addr=192.168.1.101,192.168.1.102,192.168.1.103
spring.cloud.nacos.config.server-addr=192.168.1.101,192.168.1.102,192.168.1.103
(集群模式下多个节点用逗号分隔,不用填端口,只写 IP,集群模式默认强制统一用 8848 端口)
-
集群故障节点会不会自动剔除
1)Nacos 集群基于Raft 协议做领导者选举、集群心跳
2)某一台 Nacos 节点宕机、断网、心跳超时,集群会自动把它踢出集群列表 -
Nacos 集群最少几台节点
集群最少 3 台节点
1)Nacos 集群依赖 Raft 选举算法,必须满足过半存活才能选主、保证可用
2)3 节点:允许挂 1 台,剩下 2 台过半,集群正常运行 -
Nacos 宕机后对已注册服务有无影响
1)已经注册的微服务,业务调用基本不受影响;只影响新注册、新配置拉取和动态变更
2)微服务启动后会把服务列表缓存到本地内存
三、配置中心 Nacos
-
配置中心的核心作用
1)集中管理,如果没有配置中心,改一个配置,如 Redis 地址,需要修改几十个服务的配置文件并逐个重启
2)公共配置共享,如 redis、mysql、公共参数等
3)配置动态刷新,如果没有配置中心,修改配置(如日志级别、开关)必须重启服务才能生效,导致服务短暂不可用
4)环境隔离:dev/test/prod 环境配置分开,不用改本地文件切换环境 -
AP 还是 CP
默认 CP 模式,使用 Raft 协议 -
Nacos 配置的分层模型是什么
1)Namespace:租户、环境级强隔离,不指定时默认用 public
2)Group:项目、模块级隔离,挂在 Namespace 下
3)Data ID:对应一个具体配置文件,挂在 Group 下 -
Nacos 配置热更新实现原理
靠的是客户端长轮询。客户端发一个超时请求,服务端如果没变更就挂起连接,等有变更了再立即响应 -
Nacos 长轮询原理是什么
四、Spring Cloud Gateway
- 网关核心作用:请求的路由转发、限流、鉴权
Spring Cloud Gateway 是什么,核心作用是什么?
Gateway 和 Zuul1 相比有哪些区别和优势?
Gateway 核心三大组件是什么?
为什么网关要选用 Gateway 而不用 Zuul?
Gateway 底层基于什么技术实现?
Gateway 工作流程是怎样的?
什么是路由 Route?包含哪些组成部分?
什么是断言 Predicate?有哪些常用内置断言?
什么是过滤器 Filter?全局过滤器和局部过滤器区别?
Gateway 请求转发底层原理是什么?
全局过滤器 GlobalFilter 怎么自定义实现?
局部过滤器和全局过滤器执行顺序规则?
如何通过过滤器做请求头、请求参数修改?
如何在 Gateway 中做跨域处理?
网关如何实现负载均衡?
网关怎么整合 Nacos 实现动态路由?
如何配置路由规则、路径重写?
网关如何做接口限流?常用限流方式有哪些?
https://www.qianwen.com/chat/799503f5374d49f791789c6c05154e77?tab=favorites&ch=webtongyi%40sem_bdsempinzhuan&pos=1780645384891
网关如何做统一鉴权、登录校验?
网关如何做黑白名单拦截?
Gateway 如何集群部署保证高可用?
Gateway 有无阻塞性能问题,为什么?
Gateway 怎么优化网关吞吐量?
网关超时时间如何配置,有哪些超时类型?
Gateway 响应式编程 WebFlux 了解多少?
Gateway 遇到跨域常见问题怎么解决?
动态路由实现原理,路由信息如何实时刷新?
Gateway 和 Nginx 网关各自适用场景与区别?
五、OpenFeign
- 底层实现原理
openfeign用的jdk动态代理模式
OpenFeign 是什么?核心作用是什么?
Feign 和 OpenFeign 有什么区别?
OpenFeign 解决了什么问题?
OpenFeign 为什么叫声明式调用?
OpenFeign 底层实现原理是什么?
OpenFeign 接口代理是怎么实现的?
OpenFeign 启动时如何扫描并生成代理类?
OpenFeign 请求调用执行流程?
Spring Cloud 如何整合 OpenFeign?
@FeignClient 注解常用属性有哪些?
OpenFeign 如何指定调用服务名、路径、降级类?
OpenFeign 怎么配置超时时间?
OpenFeign 默认集成什么负载均衡组件?
OpenFeign 如何切换为 Spring Cloud LoadBalancer?
OpenFeign 负载均衡策略怎么自定义?
OpenFeign 连接超时、读取超时怎么配置?
OpenFeign 是否自带重试机制?如何开启自定义重试?
OpenFeign 怎么开启请求日志打印?
OpenFeign 日志级别有哪几种?
OpenFeign 普通参数、路径参数、JSON 对象参数怎么传?
OpenFeign 调用时常见传参失败原因有哪些?
OpenFeign 底层默认用什么序列化框架?
如何自定义 OpenFeign 编解码处理器?
OpenFeign 如何整合 Sentinel / Resilience4j 做熔断降级?
OpenFeign 降级 fallback 两种实现方式?
FallbackFactory 和普通 fallback 区别是什么?
OpenFeign 调用丢失请求头怎么解决?
OpenFeign 接口方法不能用什么注解、有哪些限制?
OpenFeign 超时重试会带来什么业务问题?
生产环境 OpenFeign 最佳实践和优化方案?
OpenFeign 和 RestTemplate 区别?
OpenFeign 和 Dubbo 调用方式有什么不同?
六、Ribbon
Ribbon 是什么?核心作用是什么?
Ribbon 属于客户端负载均衡还是服务端负载均衡?
Ribbon 常用应用场景有哪些?
Ribbon 为什么逐渐被 Spring Cloud LoadBalancer 替代?
Ribbon 底层工作流程是什么?
Ribbon 如何从注册中心获取服务实例列表?
Ribbon 服务列表缓存机制是怎样的?
Ribbon 心跳与服务健康检测原理是什么?
Ribbon 内置有哪几种负载均衡策略?
轮询、随机、加权轮询、最少并发各自特点?
默认使用哪种负载均衡策略?
如何自定义 Ribbon 负载均衡算法?
怎么给指定服务单独配置负载均衡策略?
Ribbon 如何整合 Eureka、Nacos 使用?
Ribbon 怎么配置超时时间、重试机制?
全局配置和局部服务配置区别是什么?
OpenFeign 如何整合 Ribbon 实现负载均衡?
Ribbon 默认有没有重试机制?
Ribbon 重试规则怎么自定义?
Ribbon 如何剔除故障服务节点?
Ribbon 会不会产生重复调用问题?
Ribbon 和 Nginx 负载均衡有什么区别?
Ribbon 和 Spring Cloud LoadBalancer 对比差异?
为什么 Spring Cloud 官方弃用 Ribbon?
Ribbon 有哪些性能和设计上的缺陷?
Ribbon 超时和 Feign 超时优先级谁更高?
Ribbon 重试带来的业务幂等问题怎么解决?
大流量下 Ribbon 服务列表缓存有什么问题?
生产环境 Ribbon 有哪些最佳实践?
七、Spring Cloud LoadBalancer
属于客户端负载均衡
Spring Cloud LoadBalancer 是什么?核心作用?
为什么要用 LoadBalancer 替代 Ribbon?
LoadBalancer 跟 Ribbon 最大区别是什么?
LoadBalancer 是客户端负载均衡还是服务端负载均衡?
Spring Cloud LoadBalancer 工作原理是什么?
LoadBalancer 默认负载均衡算法有哪些?
LoadBalancer 如何整合 Nacos 服务列表?
服务实例挑选、心跳感知、列表更新流程是怎样的?
项目如何引入并启用 Spring Cloud LoadBalancer?
如何关闭默认负载均衡,自定义配置?
OpenFeign 怎么指定使用 LoadBalancer 而非 Ribbon?
怎么配置单个服务独立负载均衡规则?
LoadBalancer 内置轮询、随机算法怎么切换?
如何自定义负载均衡算法?
如何实现基于权重的负载均衡?
怎么实现灰度流量、版本路由负载均衡?
LoadBalancer 有没有内置服务健康检测机制?
如何剔除故障服务节点?
调用失败后是否有重试机制?怎么配置?
如何实现故障隔离、避免流量打坏节点?
LoadBalancer 支持哪些注册中心适配?
怎么和 Gateway 网关整合做路由负载均衡?
和 OpenFeign、RestTemplate 如何集成使用?
客户端负载均衡和服务端负载均衡区别?
LoadBalancer 对比 Ribbon 优势、劣势?
Nginx 负载均衡 和 LoadBalancer 适用场景区别?
八、Sentinel
6.Hystrix
1)背景:在我们的微服务架构中,这种服务之间的相互调用是非常常见的,假如现在服务A调用服务B,服务B调用服务C,服务C突然不可用了,并发量比较高的情况下,有可能导致服务B的资源被耗尽,然后导致服务B也不可用了,由于服务A调用了服务B,服务A的资源也可能被耗尽导致服务A不可用,然后这种服务不可用可能沿着请求的调用链向上传递,不断的扩散开来,最终导致整个微服务雪崩
2)作用:对应用的一种自我保护,其核心的思想就是,某个服务挂了,不会影响到其他的服务
3)具体的功能:服务降级、服务熔断、服务隔离、服务监控
4)Hystrix中的资源隔离主要指对线程的隔离,Hystrix提供了两种线程隔离方式,线程池和信号量,默认使用线程池做线程隔离
九、SkyWalking
公司的运维有搭建 SkyWalking,但是实际用得比较少
十、其它热点问题
-
熔断和降级
https://zhuanlan.zhihu.com/p/701803392(熔断器的状态、熔断的目的:保护系统避免因单个服务)
https://www.qianwen.com/chat/799503f5374d49f791789c6c05154e77?tab=favorites&ch=webtongyi%40sem_bdsempinzhuan&pos=1780467593992
https://www.qianwen.com/chat/799503f5374d49f791789c6c05154e77?tab=favorites&ch=webtongyi%40sem_bdsempinzhuan&pos=1780471913253 -
修改配置中心的配置需不需要重启服务的问题
修改配置中心配置后,普通 @Value 注入不会自动刷新;加上 @RefreshScope 或者使用 @ConfigurationProperties 绑定配置类,可以实现配置动态刷新,Bean 属性自动同步更新,无需重启微服务
@Service
@RefreshScope // 关键:加上这个注解
public class UserService {
@Value("${user.max-count}")
private Integer maxCount; // 现在能动态更新了public void process() {
// 第一次调用: 100
// 配置刷新后: 200
System.out.println(maxCount);
}
}
@ConfigurationProperties(prefix = "user")
@Data
public class UserConfig {
private Integer maxCount; // 初始 100
}
-
nacos 和 eureka 的区别,为什么选型 nacos
-
nacos 整体架构
三大核心组件:客户端 + 服务端 + 存储层 -
springcloud 使用过程中有没有遇到过什么问题
实战经验:物流系统并发量太大把网关带宽打满 -
Sentinel 或者 Resilience4j 国内哪个用得多一点
国内绝对是 Sentinel 用得更多,Resilience4j 更多是在海外或追求轻量化的特定场景 -
Ribbon 或者 Spring Cloud LoadBalancer 国内哪个用得多一点
1)这是一个典型的“存量 vs 增量”问题。截至 2026 年,国内现状是:存量项目 Ribbon 基数巨大,但新项目已全面转向 Spring Cloud LoadBalancer
2)2018-2021 年是 Spring Cloud Netflix 的黄金期,国内大量银行、电商、ERP 系统基于 Ribbon + Eureka 构建。这些系统稳定运行且迁移成本高,企业通常选择“能用就不动” -
OpenFeign 对 Ribbon、LoadBalancer 的支持
1)Spring Cloud ≤ Hoxton(2020.0 之前)
· OpenFeign 默认集成 Ribbon,无需额外引入
· 要改用 LoadBalancer:排除 Ribbon、手动引入 LoadBalancer 依赖
2)Spring Cloud ≥ 2020.0(2021.x+)
· 彻底移除 Ribbon,OpenFeign 默认使用 Spring Cloud LoadBalancer。
· 不再支持 Ribbon,只能用 LoadBalancer
- 使用 Spring Cloud LoadBalancer,用不用加 @LoadBalanced
1)@LoadBalanced 注解也是加在消费方的 RestTemplate / Feign 上
2)openfeign的话不需要加@LoadBalanced,只需引入spring-cloud-starter-loadbalancer 依赖就默认生效,resttemplate才需要加@LoadBalanced
3)SpringCloud 新版只要引入 OpenFeign,不用再单独引入 LoadBalancer依赖
服务的 ip 地址和端口号表述为服务的实例信息
Hystrix 表述为断路器

浙公网安备 33010602011771号