根据 Gartner 的说法,微服务是云开发的新应用平台。微服务是独立部署和管理的,一旦应用实现在容器内,它们与底层操作系统的交互很少。因此,如果你希望把微服务添加到自己的技术栈中,并想要了解与之相关的技能,那么现在正是潜心研究的时候。
在本文中,我收集了面试官最常问到的问题。
微服务面试题与答案
无标题 - 图1 **说说微服务架构的优势
独立开发 :所有微服务都可以根据各自的功能轻松开发 独立部署 :根据他们所提供的服务,可以在任何应用中单独部署 故障隔离 :即使应用中的一个服务不起作用,系统仍然继续运行 混合技术栈:可以用不同的语言和技术来构建同一应用程序的不同服务粒度缩放 :各个组件可根据需要进行扩展,无需将所有组件融合到一起 你对微服务是怎么理解的?**

  • 微服务,又名微服务架构,是一种架构风格,它将应用构建为一个小型自治服务的集合,以业务领域为模型。
  • 通俗地说,就像蜜蜂通过对蜡制的等边六角形单元来构建它们的蜂巢。
  • 他们最初从使用各种材料的小单元开始,一点点的搭建出一个大型蜂巢。
  • 这些小单元组成坚固的结构,将蜂窝的特定部分固定在一起。
  • 这里,每个小单元都独立于另一个,但它也与其他小单元相关。
  • 这意味着对一个小单元的损害不会损害其他的单元,因此,蜜蜂可以在不影响完整蜂巢的情况下重建这些单元。

无标题 - 图2请参考上图。这里,每个六边形都代表单独的服务组件。与蜜蜂的工作类似,每个敏捷团队都使用可用的框架和所选的技术栈构建单独的服务组件。就像在蜂巢中一样,这些服务组件形成一个强大的微服务架构,以提供更好的可扩展性。此外敏捷团队可以单独处理每个服务组件的问题,而不会对整个应用程序产生影响或使影响最小。微服务有哪些特点?

  • 解耦(Decoupling) - 系统内的服务很大程度上是分离的。因此整个应用可以被轻松构建、修改和扩展
  • 组件化(Componentization) - 微服务被视为可以被轻松替换和升级的独立组件
  • 业务能力(Business Capabilities) - 微服务非常简单,专注于单一功能
  • 自治(Autonomy) - 开发人员和团队可以相互独立工作,从而提高效率
  • 持续交付(ContinousDelivery) - 允许频繁发版,通过系统自动化完成对软件的创建、测试和审核,
  • 责任(Responsibility) - 微服务不把程序作为项目去关注。相反,他们将程序视为自己负责的产品
  • 分散治理(Decentralized Governance) - 重点是用正确的工具去做正确的事。这意味着没有任何标准化模式或技术模式。开发人员可以自由选择最合适的工具来解决自己的问题
  • 敏捷性(Agility) - 微服务支持敏捷开发。任何新功能都可以快速开发并被再次丢弃

**设计微服务的最佳实践是什么?

  1. 为每个微服务分开数据存储
  2. 将代码保持在类似的成熟度等级上
  3. 为每个微服务进行单独的构建
  4. 部署到容器中
  5. 将服务器视为无状态的

微服务架构的优点和缺点是什么?
微服务架构的优点微服务架构的缺点,可以自由使用不同的技术,增加故障排除的难度|,每个微服务都专注于单一功能|由于远程调用而导致延迟增加,支持单个可部署单元,增加配置和其他操作的工作量,允许软件的持续发布,难以维持处理的安全性,可确保每项服务的安全性,很难跟踪各种边界的数据,并行开发和部署多个服务,服务之间难以编码
单体应用 SOA 和微服务架构有什么区别?

  • 单体应用类似于一个大容器,其中程序的所有组件都被组装在一起并紧密包装。
  • SOA是一组相互通信的服务。通信可以涉及简单的数据传送,也可以涉及两个或多个协调某些活动的服务。
  • 微服务架构是一种架构风格,它将应用程序构建为以业务域为模型的小型自治服务集合。

**在使用微服务架构,你面临的挑战是什么
开发较小的微服务听起来很容易,但在开发时会经常遇到一些挑战。

  • 自动化组件:难以自动化,因为有许多较小的组件。对于每个组件,都必须采取构建、发布和监控的步骤。
  • 可感知性:将大量组件维持在一起会带来难以部署、维护、监控和识别的问题。它需要在所有组件周围具有很好的感知能力。
  • 配置管理:有时在各种环境中维护组件的配置会很困难。
  • 调试:很难找到与产生的错误相关的每一项服务。维护一个集中式的日志和控制面板对调试问题至关重要。

什么是通用语言(UL)?
如果你必须定义通用语言(UL),那么它是特定域的开发人员和用户使用的通用语言,通过该语言可以轻松解释领域。通用语言必须非常清晰,以便将所有团队成员处于同一水平线上,并以机器可以理解的方式进行翻译。什么是内聚?
内聚是一个模块内部各元素之间相关联程度的度量什么是耦合?
组件之间依赖关系强度的度量被称为耦合。好的设计总是高内聚低耦合的。什么是REST/RESTful ?它的用途是?
Representational State Transfer(REST)/ RESTful (表述性状态转移)是一种帮助计算机系统通过 Internet 进行通信的架构风格。这使得微服务更容易理解和实现。微服务可以用 RESTful API 来实现,当然也可以不用,但是用 RESTful API 去构建松散耦合的微服务总是更容易些。你怎么理解 Spring Boot?
随着新功能的增加,spring 变得越来越复杂。如果必须启动新的 spring 项目,必须添加构建路径或添加 maven 依赖项,配置服务器,添加 spring 配置。所以一切都必须从头开始。**
Spring Boot 是解决这个问题的方法。使用 spring boot 可以避免所有样板代码和配置。因此,基本上认为自己就好像在烤蛋糕一样,spring 就像做蛋糕所需的原料一样, spring boot 就是完整的蛋糕。
Spring boot 的执行器是什么?
Spring Boot 执行器提供 restful 服务,以访问在生产环境中运行程序的当前状态。在执行器的帮助下,你可以检查各种指标并监控自己的程序。
什么是 Spring Cloud?
根据 Spring Cloud 的官方网站,Spring Cloud 为开发人员提供了一些快速构建分布式系统常见模式的工具(例如配置管理、服务发现、断路器、智能路由、领导选举、分布式会话、集群状态)。
我们如何进行跨功能测试?
跨功能测试是对非功能性需求的验证,即那些不能像普通功能那样实现的要求。
如何在测试中消除不确定性?
不确定性测试**(NDT)基本上是不可靠的测试。因此,它们有时可能会通过,显然有时也可能会失败。当它们失败时,会重新运行以通过。从测试中排除不确定性的一些方法如下:

  1. 隔离
  2. 异步
  3. 远程服务
  4. 分离
  5. 时间
  6. 资源泄漏

Mock 与 Stub 有什么区别?
Stub

  • 一个有助于运行测试的虚拟对象。
  • 在某些可以硬编码的条件下提供固定的行为。
  • 从未测试stub的所有其他行为。

例如,对于空栈,你可以创建一个对于 empty() 方法只返回 true 的 stub。因此这并不关心栈中是否存在元素。

模拟

  • 一个虚拟对象,其中最初设置了某些属性。
  • 此对象的行为取决于设置的属性。
  • 也可以测试对象的行为。

例如,对于 Customer 对象,你可以通过设置姓名和年龄来模拟它。你可以将年龄设置为 12,然后测试isAdult()方法,该方法将在大于 18 岁时返回 true。因此你的 Mock Customer 对象适用于指定的条件微服务之间是如何通讯的?
第一种:远程过程调用(Remote Procedure Invocation)直接通过远程过程调用来访问别的service。示例:REST、gRPC、Apache、Thrift优点:简单,常见。因为没有中间件代理,系统更简单缺点:只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应降低了可用性,因为客户端和服务端在请求过程中必须都是可用的第二种:消息使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。示例:Apache Kafka、RabbitMQ优点:

  • 把客户端和服务端解耦,更松耦合 提高可用性,因为消息中间件缓存了消息,直到消费者可以消费
  • 支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应

缺点:消息中间件有额外的复杂性springcloud 与dubbo有哪些区别?
相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理。不同点:SpringCloud是一套目前比较网站微服务框架了,整合了分布式常用解决方案遇到了问题注册中心Eureka、负载均衡器Ribbon ,客户端调用工具Rest和Feign,分布式配置中心Config,服务保护Hystrix,网关Zuul Gateway ,服务链路Zipkin,消息总线Bus等。Dubbo内部实现功能没有SpringCloud强大(全家桶),只是实现服务治理,缺少分布式配置中心、网关、链路、总线等,如果需要用到这些组件,需要整合其他框架。