美文网首页Amazing Arch
微服务相关面试问题整理

微服务相关面试问题整理

作者: NealLemon | 来源:发表于2019-06-13 13:55 被阅读23次

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

    微服务相关面试问题整理

    对微服务有何了解?

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

    微服务架构有哪些优势?

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

    微服务有哪些特点?

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

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

    相关文章

      网友评论

        本文标题:微服务相关面试问题整理

        本文链接:https://www.haomeiwen.com/subject/whxsfctx.html