原文地址:微服务面试相关内容了解下~(二)
1、使用微服务架构有哪些挑战?
-
自动化组件:难以自动化,因为有许多较小的组件,因此对每个组件都必须遵循Build、Deploy、Monitor的各个阶段。
-
易感性:将大量组件维护在一起变得难以部署、维护、监控、识别问题,需在所有组件周围具有很好的感知能力。
-
配置管理:在各种环境中维护组件的配置变得困难。
-
调试:很难找到错误的每一项服务,维护集中式日志记录和仪表盘用以调试问题至关重要。
2、SOA和微服务架构间的主要区别?
SOA:
-
遵循【尽可能多的共享】架构方法。
-
重要性在于【业务功能】重用。
-
有共同的治理和标准。
-
使用企业服务总线(ESB)进行通信。
-
支持多种消息协议。
-
多线程,有更多的开销来处理I/O。
-
最大化应用程序服务的可重用性。
-
常用传统的关系型数据库。
-
系统的变化需修改整体。
-
DevOps/Continuous Delivery正在变得流行,但还不是主流。
微服务架构:
-
遵循【尽可能少分享】架构方法。
-
重要性在于【有界背景】概念。
-
专注于人们的合作和其它选择的自由。
-
简单的消息系统。
-
使用轻量级协议,如HTTP/REST等。
-
单线程,通常使用Event Loop功能进行非锁定I/O处理。
-
专注于解耦。
-
常用现代关系型数据库。
-
系统的变化是创造一种新的服务。
-
专注于DevOps/持续交付。
3、微服务的特点?
总结如下:
-
围绕业务功能进行组织(organized around business capability),不再是纵向分割,调整为按业务功能横向划分,一个微服务最好由一个小团队针对一个业务单元来构建。
-
做产品而非做项目(product not project),不再是做完一个个项目,交付后就完工了,而是做产品,从设计编码到产品运维,做到全过程掌握和负责,也就是自己构建,自己维护(you build it,you run it)。
-
智能终端加简单通道(smart endpoints and dumb pipe),使用基于资源的API,将大量逻辑放在客户端,而服务端侧重于提供资源,推荐基于Web,而不是在Web之后做复杂逻辑(be of the Web,not behind the Web)。
-
去中心化管理(decentralized governance),自我管理,自己干自己的,不必局限在一个系统里,不必围绕着一个中心。
-
去中心化数据管理(decentralized data management),只管理和维护自己的数据,相互之间不直接访问彼此的数据,只通过API来存取数据。
-
基础设施自动化(infrastructure automation),每个微服务应该关注于自己的业务功能的实现,基础设施应尽量自动化,也就是构建自动化、测试自动化、部署自动化、监控自动化。
-
为应对失败而设计(design for failure),设计之初就要考虑高可靠性(high reliability)和灾难恢复(disaster recover),并考虑如何着手进行错误监测和错误诊断。
-
演进设计(evolutionary design),没有完美的架构,唯一不变的是变化,要善于应对变化,容易改变其设计和实现,因其小,固其易变。
4、领域驱动设计(Domain Driven Design)?
对应解释如下:
-
关注核心域逻辑(focuse on core domain logic)。
-
在领域模型上找到复杂的设计(find complex design on models of the domain)。
-
不断与领域专家合作,以改进应用程序模型并解决与领域相关的问题(constantly collaborate with domain experts to improve application model and toresolve domain related issues)。
个人理解DDD三要素如下:
-
专业知识:前期与客户沟通问题过程中,学习到关于业务方面的知识,这类知识并不仅是对需求的理解,还需思考业务需求实际要解决的是什么问题。
-
抽象能力:发现核心业务对象,简化问题空间的能力,将复杂的需求抽象出需要解决的实际问题,如系统录单,可理解为信息入库,而不需在一开始就考虑是用手机录入还是用电脑录入。
-
细分问题:将业务问题细化为更小更容易解决的子问题,从业务角度来看,一个业务领域可划分为多个子领域,对应的业务问题也可划分为更多小问题。
抽象和划分领域决定了系统设计的下限,专业知识决定系统设计的上限。
5、为什么需要领域驱动设计(DDD)?
翻译如下:
-
映射到域(mapping to domain)。
-
降低复杂性(reduced complexity)。
-
可测试性(testability)。
-
可维护性(maintainability)。
-
知识丰富的设计(knowledge rich design)。
-
将业务和服务结合在一起(brings business and service together)。
-
以上下文为中心(context focused)。
-
统一语言和语境(ubiquitous language)。
6、什么是无所不在的语言?
如必须定义统一业务语言和语境(ubiquitous language),那么UL是特定域的开发人员和用户使用的通用语言,通过该语言可轻松解释域,无所不在的语言必须十分清晰,以便其将所有团队成员放在同一平面上,并以机器可以理解的方式进行翻译。
7、什么是凝聚力?
模块内部元素所属程度被认为是凝聚力。
8、什么是耦合?
组件之间依赖关系强度的度量被认为是耦合,一个好的设计总是被认为具有高内聚力和低耦合性。
9、REST/RESTful及用途?
Representational State Transfer(REST)/RESTful Web服务是一种帮助计算机通过Internet进行通信的架构风格,使得微服务更易理解和实现。
微服务可使用也可不使用RESTful API实现,但使用RESTful API构建松散耦合的微服务是比较容易的。
10、不同类型的微服务测试?
使用微服务时,由于有多个微服务协同工作,测试工作就变得非常复杂,也正是如此,测试工作可分为不同的级别,如下:
-
底层有面向技术的测试,如单元测试和性能测试,完全是自动化的。
-
中间层可进行如压力测试和可用性测试之类的探索性测试。
-
顶层验收测试数量很少,这些测试有助于利益相关者理解和验证软件功能。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。