微服务相关面试问题整理
2019-06-13 本文已影响23人
NealLemon
一些网上觉得好的微服务相关问题,个人总结了一下,只是为了个人知识储备和回顾吧。
微服务相关面试问题整理
对微服务有何了解?
微服务,又称微服务 架构,是一种架构风格,它将应用程序构建为以业务领域为模型的小型自治服务集合 。
微服务架构有哪些优势?
- 独立开发 – 所有微服务都可以根据各自的功能轻松开发
- 独立部署 – 基于其服务,可以在任何应用程序中单独部署它们
- 故障隔离 – 即使应用程序的一项服务不起作用,系统仍可继续运行
- 混合技术堆栈 – 可以使用不同的语言和技术来构建同一应用程序的不同服务
- 粒度缩放 – 单个组件可根据需要进行缩放,无需将所有组件缩放在一起
微服务有哪些特点?
- 解耦 – 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展
- 组件化 – 微服务被视为可以轻松更换和升级的独立组件
- 业务能力 – 微服务非常简单,专注于单一功能
- 自治 – 开发人员和团队可以彼此独立工作,从而提高速度
- 持续交付 – 通过软件创建,测试和批准的系统自动化,允许频繁发布软件
- 责任 – 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品
- 分散治理 – 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题
- 敏捷 – 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃
-
单片,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是在另一个进程中执行的。这就带来了几个新问题:
- Call ID映射。我们怎么告诉远程机器我们要调用Multiply,而不是Add或者FooBar呢?在本地调用中,函数体是直接通过函数指针来指定的,我们调用Multiply,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <--> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
- 序列化和反序列化。客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。
- 网络传输。远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。
所以,要实现一个RPC框架,其实只需要把以上三点实现了就基本完成了。
另附其他比较全面的面试题链接 # 搜云库技术团队,面试必备的技术干货