微服务相关面试问题整理

一些网上觉得好的微服务相关问题,个人总结了一下,只是为了个人知识储备和回顾吧。

微服务相关面试问题整理

对微服务有何了解?

​ 微服务,又称微服务 架构,是一种架构风格,它将应用程序构建为以业务领域为模型的小型自治服务集合 。

微服务架构有哪些优势?

  • 独立开发 – 所有微服务都可以根据各自的功能轻松开发
  • 独立部署 – 基于其服务,可以在任何应用程序中单独部署它们
  • 故障隔离 – 即使应用程序的一项服务不起作用,系统仍可继续运行
  • 混合技术堆栈 – 可以使用不同的语言和技术来构建同一应用程序的不同服务
  • 粒度缩放 – 单个组件可根据需要进行缩放,无需将所有组件缩放在一起

微服务有哪些特点?

  • 解耦 – 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展
  • 组件化 – 微服务被视为可以轻松更换和升级的独立组件
  • 业务能力 – 微服务非常简单,专注于单一功能
  • 自治 – 开发人员和团队可以彼此独立工作,从而提高速度
  • 持续交付 – 通过软件创建,测试和批准的系统自动化,允许频繁发布软件
  • 责任 – 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品
  • 分散治理 – 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题
  • 敏捷 – 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃
  1. 单片,SOA和微服务架构有什么区别?

SOA 微服务
遵循“ 尽可能多的共享 ”架构方法 遵循“ 尽可能少分享 ”的架构方法
重要性在于 业务功能 重用 重要性在于“ 有界背景 ” 的概念
他们有 共同的 治理 和标准 他们专注于 人们的 合作 和其他选择的自由
使用 企业服务总线(ESB) 进行通信 简单的消息系统
它们支持 多种消息协议 他们使用 轻量级协议 ,如 HTTP / REST 等。
多线程, 有更多的开销来处理I / O. 单线程 通常使用Event Loop功能进行非锁定I / O处理
最大化应用程序服务可重用性 专注于 解耦
传统的关系数据库 更常用 现代 关系数据库 更常用
系统的变化需要修改整体 系统的变化是创造一种新的服务
DevOps / Continuous Delivery正在变得流行,但还不是主流 专注于DevOps /持续交付
  • 单片架构类似于大容器,其中应用程序的所有软件组件组装在一起并紧密封装。
  • 一个面向服务的架构是一种相互通信服务的集合。通信可以涉及简单的数据传递,也可以涉及两个或多个协调某些活动的服务。
  • 微服务架构是一种架构风格,它将应用程序构建为以业务域为模型的小型自治服务集合。

微服务架构的优缺点是什么?

微服务架构的优点 微服务架构的缺点
自由使用不同的技术 增加故障排除挑战
每个微服务都侧重于单一功能 由于远程呼叫而增加延迟
支持单个可部署单元 增加了配置和其他操作的工作量
允许经常发布软件 难以保持交易安全
确保每项服务的安全性 艰难地跨越各种边界跟踪数据
多个服务是并行开发和部署的 难以在服务之间进行编码

eureka和zookeeper?

CAP理论:

C(Consistency):数据一致性。大家都知道,分布式系统中,数据会有副本。由于网络或者机器故障等因素,可能有些副本数据写入正确,有些却写入错误或者失败,这样就导致了数据的不一致了。而满足数据一致性规则,就是保证所有数据都要同步。

A(Availability):可用性。我们需要获取什么数据时,都能够正常的获取到想要的数据(当然,允许可接受范围内的网络延迟),也就是说,要保证任何时候请求数据都能够正常响应。

P(Partition Tolerance):分区容错性。当网络通信发生故障时,集群仍然可用,不会因为某个节点挂了或者存在问题,而影响整个系统的正常运作。

zookeeper:CP

eureka:AP

springCloud和dubbo 有哪些区别?

Spring Cloud Dubbo
社区活跃度 活跃 一般
架构完整度 较完整 一般
服务调用 HTTP REST RPC
文档质量 更新快,较全面 全面,深入,稳定

RPC

在远程调用时,我们需要执行的函数体是在远程的机器上的,也就是说,Multiply是在另一个进程中执行的。这就带来了几个新问题:

  1. Call ID映射。我们怎么告诉远程机器我们要调用Multiply,而不是Add或者FooBar呢?在本地调用中,函数体是直接通过函数指针来指定的,我们调用Multiply,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <--> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
  2. 序列化和反序列化。客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。
  3. 网络传输。远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。

所以,要实现一个RPC框架,其实只需要把以上三点实现了就基本完成了。

另附其他比较全面的面试题链接 # 搜云库技术团队,面试必备的技术干货

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容