1 引言
微服务是一种架构风格,它将应用构建位为一个小型自治服务的集合,以业务领域为模型。通俗地说,就像蜜蜂通过对蜡制的等边六边形单元来构建它们的蜂巢。它们最初从使用材料的小单元开始,一点点的搭建出一个大型蜂巢。这些小单元组成坚固的结构,将蜂窝的特定部分固定在一起。这里,每个小单元都独立于另一个,但它也与其他小单元相关。这意味着对于一个小单元的损害不会损害其他单元,因此,蜜蜂可以在不影响完整蜂巢的情况下重建这些单元。
微服务架构是一种将单个应用程序开发为一组小型服务的方法,每个服务在自己的进程中运行,并通过轻量级的通信机制(如 HTTP API)进行交互。这些服务围绕业务功能构建,可以通过完全自动化的部署机制独立部署。服务可以使用不同的编程语言编写,并使用不同的数据存储,我们可以以一个非常轻量级的中心化管理方式来协调服务。
在这种模式中,服务通过使用HTTP/REST等同步协议或AMQP(高级消息队列协议)等异步协议进行通信。服务可以独立开发和部署,每个服务都有自己的数据库。服务之间的数据一致性是通过使用Saga模式(一系列本地事务)来维护的。
2 微服务有哪些特点?
- 解耦:系统内的服务很大程度上是分离的。因此整个应用可以被轻松构建、修改和扩展;
- 组件化:微服务被视为可以被轻松替换和升级的独立组件;
- 业务能力:微服务非常简单,专注于单一功能;
- 自治:开发人员和团队可以相互独立工作,从而提高效率;
- 持续交付:允许频繁发版,通过系统自动化完成对软件的创建、测试和审核;
- 责任:微服务不把程序作为项目去关注。相反,他们将程序视为自己负责的产品;
- 分散治理:重点是用正确的工具去做正确的事;
- 敏捷性:微服务支持敏捷开发,任何新功能都可以快速开发并被再次丢弃。
3 设计微服务的最佳时间是什么?
- 为每个微服务分开数据存储;
- 将代码保持在类似的成熟度等级上;
- 为每个微服务进行单独的构建;
- 部署到容器中;
- 将服务视为无状态的;
4 微服务架构的优点和缺点是什么?
微服务以其特有的优势在解决一些问题的同时,也引入了其他问题,这几点,必须要深刻的思考。
优点 | 缺点 |
---|---|
可以自由使用不同技术 | 增加故障排查的难度 |
每个微服务都专注于单一功能 | 由于远程调用而导致延迟增加 |
支持单个可部署单元 | 增加配置和其他操作的工作量 |
允许软件的持续发布 | 难以维持处理的安全性 |
可以确保每项服务的安全性 | 很难跟踪各种边界的数据 |
并行开发和部署多个服务 | 服务之间难以编码 |
5 单体应用、SOA和微服务架构有什么区别?
- 单体应用:类似于一个大容器,其中程序的所有组件都被组装在一起并紧密包装;
- SOA:一组相互通信的服务。通信可以涉及简单的数据传送,也可以涉及两个或多个协调某些活动的服务;
- 微服务架构:是一种架构风格,它将应用程序构建为以业务为模型的小型自治服务集合;
6 什么是内聚?什么耦合?
内聚:是一个模块内部各元素之间相关联系程度的度量;
耦合:组件之间依赖关系强度的度量被称为耦合;
好的设计总是高内聚、低耦合的。
7 什么是REST/RESTful? 它的用途是?
Representational State Transfer(REST)/ RESTful (表述性状态转移)是一种帮助计算机系统通过 Internet 进行通信的架构风格。这使得微服务更容易理解和实现。
微服务可以用 RESTful API 来实现,当然也可以不用,但是用 RESTful API 去构建松散耦合的微服务总是更容易些。
8 什么是Spring Boot的执行器是什么?
Spring Boot执行器提供RESTful服务,以访问在生产环境中运行程序的当前状态。在执行器的帮助下,你可以检查各种指标并监控自己的程序。
9 什么是Spring Cloud?
根据Spring Cloud的官方网站,Spring Cloud为开发人员提供了一些快速构建分布式系统常见模式的工具(例如配置管理、服务发现、断路器、智能路由、领导选举、分布式会话、集群状态)。
10 微服务之间是如何通讯的?
第一种:远程过程调用(Remote Procedure Invocation)
直接通过远程过程调用来访问别的service。
示例:REST、gRPC、Apache、Thrift
优点:简单,常见。因为没有中间件代理,系统更简单
缺点:只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应
降低了可用性,因为客户端和服务端在请求过程中必须都是可用的
第二种:消息
使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。
示例:Apache Kafka、RabbitMQ
优点:
- 把客户端和服务端解耦,更松耦合 提高可用性,因为消息中间件缓存了消息,直到消费者可以消费
- 支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应
缺点:消息中间件有额外的复杂性
11 Spring Cloud 与Dubbo有哪些区别?
相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理。
区别:
- 初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
- 生态环境不同:SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。
- 调用方式:SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定。但调用时采用Netty的NIO方式,性能较好。
- 组件差异比较多,例如SpringCloud注册中心一般用Eureka,而Dubbo用的是Zookeeper
SpringCloud生态丰富,功能完善,更像是品牌机,Dubbo则相对灵活,可定制性强,更像是组装机。
SpringCloud
:Spring公司开源的微服务框架,SpirngCloud 定位为微服务架构下的一站式解决方案。
Dubbo
:阿里巴巴开源的RPC框架,Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断
SpringCloud是一套目前比较网站微服务框架了,整合了分布式常用解决方案如:注册中心Eureka、负载均衡器Ribbon ,客户端调用工具Rest和Feign,分布式配置中心Config,服务保护Hystrix,网关Zuul Gateway ,服务链路Zipkin,消息总线Bus等。
Dubbo内部实现功能没有SpringCloud强大(全家桶),只是实现服务治理,缺少分布式配置中心、网关、链路、总线等,如果需要用到这些组件,需要整合其他框架。