deepseek梳理java高级开发工程师微服务面试题

news2025/5/14 14:21:37

Java微服务高级面试题与答案

一、微服务架构设计

1. 服务拆分原则

Q1:微服务拆分时有哪些核心原则?如何解决拆分后的分布式事务问题?

答案:

服务拆分五大原则:
1. 单一职责原则(SRP)
   - 每个服务只负责一个业务能力
   - 示例:订单服务不处理支付逻辑

2. 领域驱动设计(DDD)
   - 按限界上下文划分
   - 聚合根作为服务边界

3. 松耦合高内聚
   - 服务间通过API通信
   - 避免共享数据库

4. 团队自治
   - 两个披萨团队原则(6-10人)
   - 全功能团队(包含前后端、测试)

5. 演进式拆分
   - 从单体逐步剥离
   - 优先拆分高频变更模块

分布式事务解决方案:
1. Saga模式:
   - 长事务拆分为多个本地事务
   - 每个事务有补偿操作
   - 实现方式:
     a. 编排式(Orchestration):中央协调器
     b. 协同式(Choreography):事件驱动

2. TCC模式:
   - Try:预留资源
   - Confirm:确认操作
   - Cancel:取消预留
   - 适用金融等高一致性场景

3. 本地消息表:
   - 业务与消息表同库事务
   - 消息队列保证最终一致

4. 最大努力通知:
   - 适用于可容忍延迟的场景
   - 定时任务补偿

二、Spring Cloud生态

2. 服务注册发现

Q2:Eureka与Nacos在服务注册发现机制上有何本质区别?如何设计高可用的注册中心?

答案:

核心区别:
┌──────────────────┬──────────────────────────────┬──────────────────────────────┐
│ 特性            │ Eureka                       │ Nacos                        │
├──────────────────┼──────────────────────────────┼──────────────────────────────┤
│ 数据一致性      │ AP模型(最终一致)            │ CP/AP可切换                  │
│ 健康检查        │ 客户端心跳(30秒)            │ TCP/HTTP/MYSQL多种检查       │
│ 负载均衡        │ 需配合Ribbon                 │ 内置权重/元数据路由           │
│ 配置管理        │ 不支持                        │ 统一配置管理                 │
│ 雪崩保护        │ 有自我保护模式                │ 有健康阈值保护               │
│ 注销时间        │ 约90秒                        │ 实时注销                     │
└──────────────────┴──────────────────────────────┴──────────────────────────────┘

高可用设计:
1. 集群部署:
   - 3-5个节点跨可用区部署
   - 节点间数据同步

2. 多级缓存:
   - 客户端缓存服务列表
   - 服务端多级缓存

3. 容灾策略:
   - 注册中心宕机时客户端仍可用
   - 本地缓存服务列表

4. 优雅降级:
   - 心跳失败阈值控制
   - 自动隔离不健康实例

Nacos集群配置示例:
# cluster.conf
192.168.1.1:8848
192.168.1.2:8848
192.168.1.3:8848

# application.properties
spring.cloud.nacos.discovery.server-addr=192.168.1.1:8848,192.168.1.2:8848,192.168.1.3:8848

3. 服务通信

Q3:OpenFeign的底层原理是什么?如何实现自定义的请求拦截和编解码?

答案:

OpenFeign核心原理:
1. 动态代理:
   - 通过JDK动态代理生成接口实现
   - 方法调用转为HTTP请求

2. 请求处理流程:
   a. 解析方法注解(@RequestMapping等)
   b. 构造RequestTemplate
   c. 应用拦截器链
   d. 发送HTTP请求(默认使用HttpURLConnection)
   e. 处理响应(解码)

3. 关键组件:
   - Contract:注解解析
   - Encoder:请求编码
   - Decoder:响应解码
   - Logger:日志记录

自定义扩展实现:
1. 请求拦截器:
@Bean
public RequestInterceptor customInterceptor() {
    return template -> {
        template.header("X-Auth", "token");
        template.query("timestamp", System.currentTimeMillis());
    };
}

2. 自定义编解码:
public class CustomDecoder implements Decoder {
    @Override
    public Object decode(Response response, Type type) {
        // 自定义解码逻辑
    }
}

3. 错误处理:
public class CustomErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        // 根据状态码构造异常
    }
}

高级配置:
1. 连接池:
feign.httpclient.enabled=true
feign.okhttp.enabled=true

2. 超时控制:
feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=30000

3. 日志级别:
logging.level.[FeignClient接口全限定名]=DEBUG

三、服务治理

4. 熔断降级

Q4:Sentinel与Hystrix的熔断策略有何不同?如何设计自适应熔断阈值?

答案:

熔断策略对比:
┌──────────────────┬──────────────────────────────┬──────────────────────────────┐
│ 特性            │ Hystrix                      │ Sentinel                     │
├──────────────────┼──────────────────────────────┼──────────────────────────────┤
│ 熔断模型        │ 基于异常比例+时间窗口         │ 基于QPS/响应时间/异常比例      │
│ 隔离策略        │ 线程池/信号量                │ 信号量                        │
│ 流量控制        │ 简单限流                     │ 基于QPS/调用关系/热点参数      │
│ 规则配置        │ 代码/配置文件                │ 动态规则(支持Nacos/ZK)      │
│ 实时监控        │ Dashboard                    │ 控制台+Metric                │
│ 系统自适应      │ 不支持                        │ 支持系统负载保护              │
└──────────────────┴──────────────────────────────┴──────────────────────────────┘

自适应熔断设计:
1. 动态阈值算法:
   - 基于历史数据滑动窗口统计
   - 使用PID控制器调整阈值
   - 公式:threshold = base + Kp×error + Ki×∫error + Kd×Δerror

2. 实现方案:
// Sentinel自适应熔断规则
FlowRule rule = new FlowRule();
rule.setResource("methodA");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);
rule.setWarmUpPeriodSec(10); // 冷启动时间
rule.setMaxQueueingTimeMs(500); // 排队超时
rule.setStrategy(RuleConstant.STRATEGY_ADAPTIVE); // 自适应模式

3. 关键指标:
   - 平均响应时间(RT)
   - 异常比例(ErrorRatio)
   - 系统负载(SystemLoad)
   - 并发线程数(Concurrency)

生产配置示例:
# 初始阈值100QPS,根据系统负载动态调整
spring.cloud.sentinel.flow.adaptive.enabled=true
spring.cloud.sentinel.flow.adaptive.base=100
spring.cloud.sentinel.flow.adaptive.maxAllowedQps=500

5. 分布式追踪

Q5:Sleuth+Zipkin的追踪原理是什么?如何分析跨服务的性能瓶颈?

答案:

追踪原理:
1. 上下文传播:
   - TraceID:全局唯一跟踪ID(16字节)
   - SpanID:每个工作单元的ID
   - ParentSpanID:父Span的ID

2. 数据采集:
   - 通过Brave库植入埋点
   - 拦截Spring MVC、Feign等组件

3. 采样策略:
   - 概率采样(如10%)
   - 限流采样(每秒N条)
   - 自定义采样(根据业务标记)

性能瓶颈分析:
1. 关键指标:
   - 服务依赖图
   - 各Span耗时占比
   - 跨服务调用延迟

2. 分析方法:
   a. 识别关键路径(Critical Path)
   b. 比较相同Trace的不同执行
   c. 分析网络延迟(Client-Server时间差)
   d. 检测异常调用链(错误/超时)

3. 优化案例:
问题现象:订单创建平均耗时1.2秒
分析过程:
- 追踪显示78%时间花费在库存服务
- 库存服务的数据库查询没有走索引
解决方案:
- 添加库存表的商品ID索引
- 引入本地缓存
结果:耗时降至350ms

高级配置:
1. 采样率控制:
spring.sleuth.sampler.probability=0.1

2. 自定义Span:
@NewSpan("customOperation")
public void customMethod() {}

3. 日志集成:
logging.pattern.level=%5p [${spring.application.name},%X{traceId},%X{spanId}]

4. 消息队列追踪:
spring.sleuth.messaging.enabled=true

四、云原生微服务

6. Service Mesh

Q6:Istio与Spring Cloud在服务治理上有何异同?什么场景下建议使用Service Mesh?

答案:

架构对比:
┌──────────────────┬──────────────────────────────┬──────────────────────────────┐
│ 特性            │ Spring Cloud                │ Istio                        │
├──────────────────┼──────────────────────────────┼──────────────────────────────┤
│ 治理方式        │ SDK集成(代码级)            │ Sidecar代理(基础设施层)      │
│ 通信协议        │ HTTP/REST为主                │ 支持HTTP/gRPC/TCP等多协议     │
│ 服务发现        │ Eureka/Nacos等               │ 集成K8s服务发现              │
│ 流量管理        │ 网关+负载均衡                │ 细粒度路由规则(VirtualService)│
│ 可观测性        │ Sleuth/Zipkin                │ 内置Prometheus/Grafana/Kiali │
│ 多语言支持      │ 主要支持Java                 │ 支持任意语言                 │
│ 部署复杂度      │ 相对简单                      │ 需要K8s环境                  │
└──────────────────┴──────────────────────────────┴──────────────────────────────┘

Service Mesh适用场景:
1. 多语言技术栈:
   - 非Java服务需要同等治理能力

2. 已有K8s基础设施:
   - 希望复用K8s服务发现

3. 精细化流量控制:
   - 需要金丝雀发布、流量镜像等

4. 零信任安全:
   - 自动mTLS加密通信

5. 大规模微服务:
   - 超过100+服务的治理

渐进式迁移方案:
1. 并行运行:
   - 新服务使用Istio
   - 旧服务保持Spring Cloud

2. 流量切换:
   - 通过Istio Ingress接入所有流量
   - 逐步迁移服务到Mesh

3. 统一控制面:
   - 使用Istio管理所有服务策略

Istio关键组件:
1. Envoy:数据平面代理
2. Pilot:配置分发
3. Citadel:证书管理
4. Galley:配置验证

7. 服务网格数据平面

Q7:Envoy作为Sidecar代理有哪些核心功能?如何实现基于Header的流量路由?

答案:

Envoy核心功能:
1. 流量管理:
   - 负载均衡(轮询/权重/最少请求)
   - 熔断(基于异常检测)
   - 重试(可配置策略)

2. 可观测性:
   - 访问日志(格式可定制)
   - 指标统计(Prometheus格式)
   - 分布式追踪(支持Zipkin/Jaeger)

3. 安全:
   - mTLS自动加密
   - JWT验证
   - RBAC授权

4. 协议支持:
   - HTTP/1.1、HTTP/2、gRPC
   - MySQL、MongoDB等数据库协议

基于Header的路由配置:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: product-route
spec:
  hosts:
  - product-service
  http:
  - match:
    - headers:
        x-user-type:
          exact: vip
    route:
    - destination:
        host: product-service
        subset: v2
  - route:
    - destination:
        host: product-service
        subset: v1

高级路由场景:
1. 金丝雀发布:
   - 按权重分流(10%到新版本)

2. 故障注入:
   - 模拟500错误测试熔断

3. 流量镜像:
   - 复制流量到测试环境

4. 跨集群路由:
   - 实现多集群灰度发布

EnvoyFilter示例:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: custom-filter
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.lua
        config:
          inlineCode: |
            function envoy_on_request(request_handle)
              local headers = request_handle:headers()
              if headers:get("x-debug") == "true" then
                request_handle:logInfo("Debug header found")
              end
            end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python如何提取Chrome中的保存的网站登录用户名密码?

很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名、密码,非常方便。作为python脚本,能否拿到用户提前保存在浏览器中的用户名密码,用以自动登录呢?必须有,小爬…

Redis实现分布式获取全局唯一自增ID的案例。

【1】简易自增版本(从 1 开始 1,2,3,...) 项目结构 下面是一个基于 RedisTemplate 实现的分布式全局唯一自增 ID 生成器的案例。适用于 Java Spring Boot 环境,利用 Redis 的原子操作 INCR 指令。 ✅ 原理说明 Redis 提供的 INCR 命令是原子性的&…

人脸识别备案:筑牢人脸信息 “安全墙”

人脸识别备案制度主要依据《人脸识别技术应用安全管理办法》建立,人脸识别技术广泛应用于安防、金融、门禁、交通等领域,带来便利高效的同时,人脸信息安全问题也引发担忧。为规范技术应用、保护个人信息权益,人脸识别备案制度应运…

基于RT-Thread的STM32F4开发第三讲——DAC

文章目录 前言一、DAC是什么?二、RT-Thread工程创建三、DAC函数编写1.DAC.c2.DAC.h3.main.c 四、结果测试五、工程分享 前言 本章利用RT-Thread最新的驱动5.1.0开发DAC模块,使用的开发板是正点原子的STM32F4探索者。很多配置和上文重复,本文…

网络状态可以通过hutool.HttpStatus获取

网络状态可以通过hutool.HttpStatus获取 全部都是静态int类型

Gemini 2.5 推动视频理解进入新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

谈谈各种IO模型

目前的IO模型有5种:BIO(阻塞IO)、NIO(非阻塞IO)、IO多路复用、信号驱动IO、异步IO(AIO) 了解这些模型之前,我们需要先知道IO模型中的几个概念:阻塞&非阻塞、同步&am…

Linux系统管理与编程20:Apache

兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 做好网络和yum配置,用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …

BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(下)

文章目录 引言一、课程表1.1 题目链接:https://leetcode.cn/problems/course-schedule/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二、课程表||2.1 题目链接:https://leetcode.cn/problems/course-schedul…

【入门】纸盒的最大体积是多少?

描述 在一张尺寸为 n * n 厘米的正方形硬纸板的四个角上,分别裁剪掉一个 m * m 厘米的小正方形,就可以做成一个无盖纸盒,请问这个无盖纸盒的最大体积是多少? 立方体的体积 v 底面积 * 高) 比如: n 5 &am…

QT5.14安装以及新建基础项目

进入qt中文网站:Qt | 软件开发全周期的各阶段工具 额,考虑新手可能还是找不到,我就分享一下我下载的的吧 通过网盘分享的文件:qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…

KV cache 缓存与量化:加速大型语言模型推理的关键技术

引言 在大型语言模型(LLM)的推理过程中,KV 缓存(Key-Value Cache) 是一项至关重要的优化技术。自回归生成(如逐 token 生成文本)的特性决定了模型需要反复利用历史token的注意力计算结果&#…

BlockMesh Ai项目 监控节点部署教程

项目介绍 BlockMesh 是一个创新、开放且安全的网络,允许用户轻松地将多余的带宽货币化。 它为用户提供了被动获利并参与人工智能数据层、在线隐私、开源和区块链行业前沿的绝佳机会。 此教程为Linux系统教程 教程开始 首先到这里注册账号,注册后保存…

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备(BT-HD)服务的初始化与启用流程,从接口初始化、服务掩码管理、服务请求路由到属性回调通知,完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理,揭示服务启用的核心机制&…

iOS创建Certificate证书、制作p12证书流程

一、创建Certificates 1、第一步得先在苹果电脑上创建一个.certSigningRequest的文件。首先打开钥匙串,使用快捷键【command空格】——输入【钥匙串】回车(找不到就搜一下钥匙串访问使用手册) 2、然后在苹果电脑的左上角菜单栏选择【钥匙串…

curl发送数据不为null,但是后端接收到为null

curl -X POST http://localhost:8080/xiaozhi/test --header "Content-Type: application/json" -d "{\"age\":123}"经过检查发现注解导入错误 正确的应该是 import org.springframework.web.bind.annotation.RequestBody;

blazor与硬件通信实现案例

在网页接入硬件交互通信方案这篇博客中,曾经提到了网页中接入各种硬件操作的方法,即通过Windows Service作为指令的中转,并建立websocket通信连接,进而实现接入硬件的各种操作。这篇博客就以实际的案例来讲解具体怎么实现。 一、建立Windows Service项目 比如我就建立了一…

Linux下mysql的安装与远程链接

linux安装mysql 01下载依赖: 找到网址/download下: 最下面MySQL Community(mysql社区版) 选择MySQL Community Server 选择对应的mysql版本 操作系统版本选择 根据操作系统的版本选择具体版本号 下载离线版本 安装包详情 0…

【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)

题意 需要维护 n n n \times n nn 平面上的整点,每个点 ( x , y ) (x, y) (x,y) 有权值 V ( x , y ) V(x, y) V(x,y),初始都为 0 0 0。 同时给定 n n n 次修改操作,每次修改给出 x 1 , x 2 , y 1 , y 2 , v x_1, x_2, y_1, y_2, v x…

qemu热迁移后内存占用突增问题

1.问题描述 虚拟机配置了memoryBackingmemfd的情况下&#xff0c;热迁移虚拟机后&#xff0c;在目的节点 qemu-kvm 进程占用 rss 会突增很多。 如果去掉这个配置没这个现象。 <memoryBacking><source typememfd/> </memoryBacking>2.问题现象 2.1 不配置…