一、面试题总结
1. 核心架构设计
**问题1:公网流量如何加密?**
答:在Nginx前部署TLS 1.3,用OCSP Stapling加速握手,支持国密算法(比如SM2/SM4)。
**问题2:内网服务如何防攻击?**
答:用Istio做细粒度流量控制(比如熔断、限流),结合SkyWalking监控调用链。
**问题3:gRPC和Dubbo选哪个?**
答:gRPC适合高性能场景(二进制协议),Dubbo适合Spring生态(配置简单)。
2. 数据库与安全
**问题4:MySQL如何保证高可用?**
答:用MHA+ProxySQL自动故障切换,或者Galera多主同步(金融级强一致)。
**问题5:怎么防止数据泄露?**
答:敏感字段(如手机号)用AES-256加密,API网关脱敏(比如手机号显示为138****5678)。
3. Nginx调优
**问题6:如何限制恶意请求?**
答:用limit_req模块限制每秒50请求,结合IP黑名单拦截高风险地区流量。
**问题7:Nginx缓存怎么配置?**
答:静态资源缓存1小时,动态请求绕过缓存:
location /static {
proxy_cache my_cache;
expires 1h;
}
4. 容器化部署
**问题8:Docker镜像怎么瘦身?**
答:多阶段构建,编译环境和运行环境分离(比如从2GB减到200MB)。
**问题9:Kubernetes怎么扩缩容?**
答:用Deployment的replicas参数,或HPA根据CPU/内存自动扩缩。
**问题10:有状态服务(如MySQL)怎么部署?**
答:用StatefulSet管理,挂载PVC持久化存储,按顺序启动主从节点。
5. 网络与协议
**问题11:TCP和UDP用在哪?**
答:TCP用于可靠传输(如订单系统),UDP用于实时性要求高的场景(如视频直播)。
**问题12:QUIC协议有什么优势?**
答:基于UDP,减少握手延迟,适合高丢包网络(比如游戏数据推送)。
二、代码示例
1. Docker多阶段构建(精简镜像)
# 编译阶段(基础镜像小)
FROM maven:3.8 AS build
COPY pom.xml .
RUN mvn dependency:go-offline # 提前下载依赖
COPY src/ ./src/
RUN mvn package -DskipTests
# 运行阶段(只保留必要文件)
FROM openjdk:17-jdk-slim
COPY --from=build /target/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
2. Kubernetes Deployment(自动扩缩容)
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
spec:
replicas: 3 # 初始3个实例
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: user-service:1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: user-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: user-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70% # CPU超过70%自动扩容
3. Nginx反向代理配置(负载均衡)
http {
upstream backend {
# 权重负载均衡(90%流量到A,10%到B)
server 192.168.1.10:8080 weight=90;
server 192.168.1.20:8080 weight=10;
}
server {
listen 80;
location / {
proxy_pass http://backend;
# 限制每秒50请求
limit_req zone=my_limit burst=100;
}
}
}
4. 服务发现(Consul + Spring Cloud)
// 服务注册(Spring Boot启动时自动注册到Consul)
@EnableDiscoveryClient
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
// 服务调用(通过服务名调用)
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/orders/{userId}")
public Order getOrder(@PathVariable String userId) {
return restTemplate.getForObject(
"http://user-service/users/" + userId, // 通过服务名调用
Order.class
);
}
}
5. 数据库主从同步(MySQL)
-- 主库配置(my.cnf)
server-id = 1
log-bin = mysql-bin
binlog-do-db = mydb
-- 从库配置
server-id = 2
relay-log = mysql-relay-bin
read_only = 1
-- 手动同步数据
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;