面试题答案
一键面试设计思路
- 负载均衡:在微服务架构中,同一类型的服务通常会有多个实例。通过负载均衡机制,如Ribbon,将请求均匀分配到各个实例上,避免单个实例负载过高,提高系统整体的吞吐量和可用性。
- 容错处理:引入断路器模式,如Hystrix。当某个服务调用出现故障(如超时、异常等)时,断路器可以快速切断调用,避免故障蔓延,同时提供 fallback 机制,返回兜底数据,保证系统的基本功能可用。
- 流量控制:采用令牌桶算法或漏桶算法来限制单位时间内的请求数量。例如,使用 Sentinel 框架,对服务的入口流量进行控制,防止因流量过大导致系统崩溃。
- 异步调用:对于一些非关键或耗时较长的服务调用,可以采用异步调用方式。通过消息队列(如 RabbitMQ、Kafka 等)将请求发送到队列中,由消费者异步处理,减少对主调用链路的阻塞,提高系统的响应速度。
- 服务治理:建立服务注册与发现中心,如 Eureka、Consul 等。服务实例启动时向注册中心注册自己的信息,调用方通过注册中心获取服务实例列表,实现动态发现服务,便于服务的扩展与维护。
关键技术点
- Feign/OpenFeign:
- 声明式调用:Feign 采用声明式接口的方式定义服务调用,使得代码简洁易读。OpenFeign 是 Spring Cloud 对 Feign 的增强,与 Spring 生态系统更好地集成。
- 集成 Ribbon:默认集成 Ribbon 实现客户端负载均衡,通过配置文件可以灵活调整负载均衡策略,如随机、轮询等。
- 支持多种编码器和解码器:可以方便地处理不同格式的数据,如 JSON、XML 等。
- Hystrix:
- 断路器状态管理:断路器有三种状态,关闭(Closed)、打开(Open)和半打开(Half - Open)。通过监控调用的成功率、失败率、超时等指标来切换断路器状态,实现自动容错。
- fallback 实现:在服务调用失败时,通过实现 fallback 方法返回兜底数据,确保系统不会因局部故障而整体不可用。
- Sentinel:
- 规则配置:支持多种流量控制规则,如直接限流、关联限流、链路限流等。可以通过配置文件或控制台动态调整限流规则。
- 熔断降级:除了流量控制,Sentinel 还支持熔断降级功能,根据响应时间、异常比例等指标熔断服务调用,并提供 fallback 处理。
- 消息队列:
- 消息可靠性:确保消息不丢失,如 RabbitMQ 可以通过持久化队列、发送确认机制等保证消息的可靠传递。
- 消费端限流:在消费端可以设置消费速率,避免消费过快来不及处理导致系统资源耗尽。
- 服务注册与发现:
- 健康检查:注册中心定期对服务实例进行健康检查,剔除不健康的实例,保证服务列表的可用性。
- 动态刷新:当服务实例的状态发生变化(如新增、下线)时,注册中心能够及时通知调用方,实现服务列表的动态更新。