个人博客
欢迎访问个人博客: https://www.crystalblog.xyz/
备用地址: https://wang-qz.gitee.io/crystal-blog/
1. 为什么不选择dubbo? 却选择SpringCloud?
dubbo属于RPC框架, 底层是netty封装;
SpringCloud不属于RPC框架, 属于微服务全家桶框架, 提供了分布式微服务整套解决方案.
服务治理: nacos, eureka, zookeeper, consule
分布式配置中心 nacos, springcloud config, 携程阿波罗
服务追踪 zipkin/skwalking
服务保护 hystrix, sentinel
微服务网关 zuul, gateway
SpringCloud中feign客户端就是RPC框架, 类似于Dubbo.
feign接口调用是使用http协议.
dubbox接口调用使用http协议, 是当当网提供.
开放平台(阿里, 腾讯…) http协议, 可以跨平台.
Doubbo与Feign都是面向接口调用, 底层思想原理都是相同的.
2. 服务正在发布中? 如何不影响用户使用?
服务正在发布中, 当前jar正在启动…, 客户端访问的时候, 一直阻塞等待.
方式1: 使用Nginx故障转移即可.
方式2: 灰度发布, 先发布一小部分(预发布), 如果没有问题, 再让所有用户都可以访问. nginx + gateway + nacos (推荐)
3. 对方调用你的接口响应比较慢, 你会怎么排查?
对方调用你接口响应比较慢, 多个维度思考.
(1) 带宽→服务处理(cpu)→数据库或Redis→网络IO操作(例如调用别人接口)
- 走外网传输数据, 会有带宽的限制(比如128kb/s)
(2) 请求到达服务端, 服务没有足够线程处理该请求, 导致客户端阻塞等待.
解决办法:
- 调整最大线程数
- 调整最大线程数治标不治本, 对接口做服务熔断, 降级,限流处理(如果服务端没有足够线程处理)
(3) 服务cpu处理性能(多核cpu),体现多线程同时处理, 降低cpu上下文切换的次数.
- 上下文切换会导致其他的线程短暂阻塞, 后面重新被cpu调度
(4) 判断sql语句查询是否比较慢, 做mysql调优, 快速响应结果
(5) 网络IO操作(例如调用别人接口), 代码优化还是比较慢, 将耗时的操作采用异步的形式处理. 例如多线程(消耗cpu资源), 建议使用MQ.
4. 你在开发过程中, 遇到哪些难题? 你是怎么解决的呢?
如果在面试中被问到这个问题, 不要答: 空指针异常, 常见错误异常.
可以从下面的方向答:
(1) 分布式事务
(2) 定时任务调度
例如:我们项目在生产环境中做定时任务, 如果集群的情况下, 定时任务重复执行.
解决该问题:
在构建jar包的时候, 加上一个开关, 只让一个jar包执行定时任务.
整合分布式任务调度平台 xxl-job, 最终分片执行, 定时任务集群执行.
(3) 分布式幂等
例如: 我们公司提供了一个接口, 被其他公司进行调用. 其他公司在调用我们接口时, 我们接口响应超时了. 最终触发了客户端重试了, 导致我们接口会重复执行业务逻辑.
解决方法: 全局id业务上防重复, 在db层面去重复, 例如创建唯一约束.
(4) 数据同步延迟问题
我们公司使用canal解决mysql与redis+kafaka数据同步问题.
发现在并发的情况下,同步数据延迟, 我们整合kafaka分区模型, 根据每张表自己独立的topic主题
(5) 安全性问题
(6) 生产环境发生CPU飙高, 内存泄漏等
… 真实业务场景中遇到的问题, 如何分析问题→如何排查问题→如何解决问题
5. 开发者不小心删除了生产环境数据? 怎么恢复呢?
(1) 正常情况下,在生产环境中, 没有delete操作权限, 通过update隐藏的形式, 后期淘汰策略删除.
(2) 构建mysql主从集群环境, 可以通过备份节点恢复数据, 一主一从.
(3) 如果执行delete, 可以通过binlog快速恢复数据.