资深Java工程师的面试题目(五)微服务

以下是针对Java微服务架构的面试题,涵盖 Spring BootSpring CloudRESTful APIgRPC消息队列事件驱动架构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)覆盖默认值。
  • 多数据源配置示例:

    java 复制代码
    @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 示例:

    java 复制代码
    @FeignClient(name = "order-service", fallback = OrderServiceFallback.class)
    public interface OrderServiceClient {
        @GetMapping("/orders/{id}")
        Order getOrder(@PathVariable String id);
    }
    
    @Component
    public class OrderServiceFallback implements OrderServiceClient {
        @Override
        public Order getOrder(String id) {
            return new Order("Fallback", "Unknown");
        }
    }

    熔断配置:

    yaml 复制代码
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 1000

3. RESTful API 设计与优化

题目:

  • 请说明 RESTful API 的设计原则,并列举 HTTP 状态码 200、404、500 的典型用途。
  • 编写一个 RESTful API 的代码示例,实现带版本控制的资源接口。

参考答案:

  • 设计原则:

    1. 资源命名统一(如 /users/{id})。
    2. 使用 HTTP 方法表示操作(GET=查询,POST=创建,PUT=更新,DELETE=删除)。
    3. 无状态性(每次请求包含所有必要信息)。
    4. 支持版本控制(如 /api/v1/users)。
  • 状态码用途:

    • 200: 请求成功(GET/POST/PUT/DELETE)。
    • 404 : 资源未找到(如 /users/999)。
    • 500: 服务器内部错误(如数据库连接失败)。
  • 版本控制示例:

    java 复制代码
    @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", "[email protected]"));
        }
    }

4. gRPC 与 RESTful 对比

题目:

  • 请说明 gRPC 与 RESTful API 的主要区别,并描述 gRPC 的典型应用场景。
  • 编写一个 gRPC 服务定义(.proto 文件)示例,并说明其优势。

参考答案:

  • 区别:

    特性 gRPC RESTful API
    通信协议 HTTP/2 + Protobuf HTTP/1.1 + JSON/XML
    性能 高(二进制序列化,多路复用) 低(文本序列化,请求/响应模式)
    调用方式 双向流式通信(支持流式 RPC) 单向请求/响应
    工具支持 自动生成客户端和服务端代码 手动定义接口
  • 典型场景:

    • 高频低延迟通信(如实时音视频传输)。
    • 微服务间复杂数据交互(如订单状态流式推送)。
  • .proto 示例:

    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 示例:

    java 复制代码
    @EnableBinding(OrderEvents.class)
    public class OrderService {
        @Autowired
        private 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();
    }

    消费者配置:

    yaml 复制代码
    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 } })。
  • 微服务优势:

    • 减少 API 请求次数(聚合多个资源)。
    • 支持灵活查询(客户端决定数据结构)。
  • 查询示例:

    graphql 复制代码
    query {
      user(id: "1") {
        id
        name
        email
      }
    }
  • 避免 Over-fetching:

    • 客户端仅请求需要的字段(如不请求 email 字段)。
    • 服务端限制最大查询深度(防止复杂嵌套查询)。

7. 事件驱动架构设计

题目:

  • 请描述事件驱动架构的核心组件,并说明其与传统同步通信的区别。
  • 设计一个订单服务的事件驱动流程,包括事件发布、消费和异常处理。

参考答案:

  • 核心组件:

    1. 事件生产者: 发布事件(如订单创建)。
    2. 事件总线: 传输事件(如 Kafka)。
    3. 事件消费者: 处理事件(如库存扣减)。
  • 与同步通信的区别:

    • 同步: 请求-响应模式(如 HTTP 调用)。
    • 异步: 事件驱动(解耦生产者和消费者)。
  • 订单服务事件流程:

    发布事件 消费事件 处理成功 处理失败 订单服务 Kafka 库存服务 更新库存 重试机制

    异常处理:

    • 重试机制(如三次重试后丢入死信队列)。
    • 补偿事务(如库存回滚)。

总结

以上题目覆盖了 Java 微服务架构的核心技术点,从基础框架(Spring Boot、Spring Cloud)到高级实践(事件驱动、GraphQL),能够全面评估候选人对微服务设计、实现及优化的能力。

相关推荐
云心雨禅5 分钟前
Spring Boot热更新技巧:节省90%重启时间
java·数据库·spring boot
海的诗篇_6 分钟前
前端开发面试题总结-vue2框架篇(四)
前端·css·面试·vue·html
岁忧11 分钟前
(LeetCode 每日一题) 2966. 划分数组并满足最大差限制 (贪心、排序)
java·c++·算法·leetcode·职场和发展·go
Maỿbe22 分钟前
实现回显服务器(基于UDP)
java·javaweb·echo·回显服务器
葡萄城技术团队26 分钟前
450 + 公式计算支持,GcExcel Java 强大计算引擎揭秘
java
lifallen32 分钟前
Java BitSet类解析:高效位向量实现
java·开发语言·后端·算法
路人与大师1 小时前
2025年 6月面试 经验总结 生成式语言模型岗位
面试·生成式语言模型
用户0595661192091 小时前
java 最新技术实操内容:从基础到进阶的全方位指南
java·架构·编程语言
MyFreeIT1 小时前
Unable to start embedded Tomcat
java·tomcat·mybatis
风一样的树懒1 小时前
Zuul动态路由黑洞揭秘:每秒10万并发的刷新策略
java