以下是针对Java微服务架构的面试题,涵盖 Spring Boot、Spring Cloud、RESTful API、gRPC、消息队列、事件驱动架构 和 GraphQL 等技术点,适合评估候选人对微服务设计和实现的理解深度及实际应用能力:
1. Spring Boot 核心特性与性能优化
题目:
- 请说明 Spring Boot 的自动配置原理,并描述如何通过自定义
@Configuration
类覆盖默认配置。 - 编写一个 Spring Boot 多数据源配置示例,并说明其在微服务中的典型应用场景。
参考答案:
-
自动配置原理:
Spring Boot 通过@EnableAutoConfiguration
注解加载META-INF/spring.factories
中的自动配置类,根据类路径依赖和环境条件动态装配 Bean(如DataSourceAutoConfiguration
)。- 覆盖默认配置:
通过自定义@Configuration
类显式定义 Bean(如@Bean
方法),或使用application.yml
中的属性(如spring.datasource.url
)覆盖默认值。
- 覆盖默认配置:
-
多数据源配置示例:
@Configuration public class DataSourceConfig {@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();} }
应用场景:
- 订单服务连接主数据库,同时读取只读报表数据的从数据库。
- 微服务需对接多个第三方系统的异构数据库。
2. Spring Cloud 服务治理
题目:
- 对比 Eureka 和 Nacos 在服务注册发现机制上的区别,并说明如何设计高可用的注册中心。
- 编写一个 Spring Cloud Feign 客户端的代码示例,并描述如何结合 Hystrix 实现熔断降级。
参考答案:
-
Eureka vs Nacos:
特性 Eureka Nacos 一致性模型 AP(最终一致) CP/AP 可切换 健康检查 客户端心跳(30秒) TCP/HTTP/MYSQL 多种检查 配置管理 不支持 支持统一配置管理 注销时间 约90秒 实时注销 高可用设计:
- 集群部署(3-5节点跨可用区)。
- 客户端缓存服务列表,服务端多级缓存。
- 容灾策略(如注册中心宕机时使用本地缓存)。
-
Feign + Hystrix 示例:
@FeignClient(name = "order-service", fallback = OrderServiceFallback.class) public interface OrderServiceClient {@GetMapping("/orders/{id}")Order getOrder(@PathVariable String id); }@Component public class OrderServiceFallback implements OrderServiceClient {@Overridepublic Order getOrder(String id) {return new Order("Fallback", "Unknown");} }
熔断配置:
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 1000
3. RESTful API 设计与优化
题目:
- 请说明 RESTful API 的设计原则,并列举 HTTP 状态码 200、404、500 的典型用途。
- 编写一个 RESTful API 的代码示例,实现带版本控制的资源接口。
参考答案:
-
设计原则:
- 资源命名统一(如
/users/{id}
)。 - 使用 HTTP 方法表示操作(GET=查询,POST=创建,PUT=更新,DELETE=删除)。
- 无状态性(每次请求包含所有必要信息)。
- 支持版本控制(如
/api/v1/users
)。
- 资源命名统一(如
-
状态码用途:
- 200: 请求成功(GET/POST/PUT/DELETE)。
- 404: 资源未找到(如
/users/999
)。 - 500: 服务器内部错误(如数据库连接失败)。
-
版本控制示例:
@RestController @RequestMapping("/api/v1/users") public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUserV1(@PathVariable String id) {// V1 实现return ResponseEntity.ok(new User(id, "John"));} }@RestController @RequestMapping("/api/v2/users") public class UserControllerV2 {@GetMapping("/{id}")public ResponseEntity<User> getUserV2(@PathVariable String id) {// V2 实现(支持扩展字段)return ResponseEntity.ok(new User(id, "John", "john@example.com"));} }
4. gRPC 与 RESTful 对比
题目:
- 请说明 gRPC 与 RESTful API 的主要区别,并描述 gRPC 的典型应用场景。
- 编写一个 gRPC 服务定义(
.proto
文件)示例,并说明其优势。
参考答案:
-
区别:
特性 gRPC RESTful API 通信协议 HTTP/2 + Protobuf HTTP/1.1 + JSON/XML 性能 高(二进制序列化,多路复用) 低(文本序列化,请求/响应模式) 调用方式 双向流式通信(支持流式 RPC) 单向请求/响应 工具支持 自动生成客户端和服务端代码 手动定义接口 -
典型场景:
- 高频低延迟通信(如实时音视频传输)。
- 微服务间复杂数据交互(如订单状态流式推送)。
-
.proto
示例:syntax = "proto3";service OrderService {rpc GetOrder (OrderRequest) returns (OrderResponse);rpc StreamOrderUpdates (OrderStreamRequest) returns (stream OrderResponse); }message OrderRequest {string orderId = 1; }message OrderResponse {string orderId = 1;string status = 2; }
5. 消息队列与事件驱动架构
题目:
- 请说明消息队列在微服务中的作用,并描述 Kafka 和 RabbitMQ 的典型使用场景。
- 编写一个 Spring Cloud Stream 的代码示例,实现订单状态变更的事件广播。
参考答案:
-
消息队列作用:
- 解耦: 订单服务与库存服务异步通信。
- 削峰填谷: 秒杀场景下缓冲突发流量。
- 事件驱动: 通过事件总线(如 Kafka)触发后续流程。
-
Kafka vs RabbitMQ:
- Kafka: 高吞吐量,适合日志聚合、流式处理(如实时分析)。
- RabbitMQ: 低延迟,适合事务性消息(如支付确认)。
-
Spring Cloud Stream 示例:
@EnableBinding(OrderEvents.class) public class OrderService {@Autowiredprivate OrderEvents orderEvents;public void updateOrderStatus(String orderId, String status) {orderEvents.orderStatusChanged().send(MessageBuilder.withPayload(new OrderEvent(orderId, status)).build());} }public interface OrderEvents {String ORDER_STATUS_CHANGED = "orderStatusChanged";@Output(ORDER_STATUS_CHANGED)MessageChannel orderStatusChanged(); }
消费者配置:
spring:cloud:stream:bindings:orderStatusChanged:destination: order-status-topic
6. GraphQL 在微服务中的实践
题目:
- 请说明 GraphQL 与 RESTful API 的核心区别,并描述其在微服务中的优势。
- 编写一个 GraphQL 查询示例,并说明如何避免过度获取数据(Over-fetching)。
参考答案:
-
核心区别:
- RESTful: 固定端点返回固定数据(如
/users
返回所有字段)。 - GraphQL: 客户端按需查询字段(如
query { user(id: "1") { name } }
)。
- RESTful: 固定端点返回固定数据(如
-
微服务优势:
- 减少 API 请求次数(聚合多个资源)。
- 支持灵活查询(客户端决定数据结构)。
-
查询示例:
query {user(id: "1") {idnameemail} }
-
避免 Over-fetching:
- 客户端仅请求需要的字段(如不请求
email
字段)。 - 服务端限制最大查询深度(防止复杂嵌套查询)。
- 客户端仅请求需要的字段(如不请求
7. 事件驱动架构设计
题目:
- 请描述事件驱动架构的核心组件,并说明其与传统同步通信的区别。
- 设计一个订单服务的事件驱动流程,包括事件发布、消费和异常处理。
参考答案:
-
核心组件:
- 事件生产者: 发布事件(如订单创建)。
- 事件总线: 传输事件(如 Kafka)。
- 事件消费者: 处理事件(如库存扣减)。
-
与同步通信的区别:
- 同步: 请求-响应模式(如 HTTP 调用)。
- 异步: 事件驱动(解耦生产者和消费者)。
-
订单服务事件流程:
异常处理:
- 重试机制(如三次重试后丢入死信队列)。
- 补偿事务(如库存回滚)。
总结
以上题目覆盖了 Java 微服务架构的核心技术点,从基础框架(Spring Boot、Spring Cloud)到高级实践(事件驱动、GraphQL),能够全面评估候选人对微服务设计、实现及优化的能力。