微服务项目发布及调用等面试题


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快速恢复数据.


文章作者: 王子
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王子 !
评论
  目录