微服务平台可靠性设计
- 格式:docx
- 大小:849.94 KB
- 文档页数:33
微服务架构是一种将应用程序拆分成小型、独立的服务单元的架构设计模式。
每个服务单元都有自己的独立部署和运行环境,可以通过API接口进行通信和协作。
相比传统的单体架构,微服务架构具有以下主要特点:1.高可伸缩性微服务架构的每个服务单元都是独立的,可以根据需求进行灵活的扩展或缩减,从而实现高可伸缩性。
当应用程序需要处理更多的请求时,可以通过增加服务单元来提高系统的吞吐量;当请求量降低时,可以减少服务单元以节省资源。
2.高可靠性由于微服务架构中的每个服务单元都是独立的,因此当其中一个服务单元发生故障时,其他服务单元不会受到影响。
这种设计模式可以提高系统的可靠性,避免单点故障。
3.独立部署微服务架构的每个服务单元都可以独立部署和运行,这意味着一个服务单元的升级或修改不会影响其他服务单元的运行。
这种设计模式可以大大减少应用程序的部署时间和风险。
4.技术多样性由于微服务架构中的每个服务单元都是独立的,因此可以使用不同的技术栈来开发和运行不同的服务单元。
这种设计模式可以让开发团队根据自己的需求和技能来选择最适合的技术,提高开发效率和质量。
5.易于维护由于微服务架构的每个服务单元都是独立的,因此可以更容易地进行维护和更新。
开发团队可以只关注一个服务单元的维护,而不需要关注整个应用程序的维护。
这种设计模式可以大大降低维护成本和风险。
微服务架构具有高可伸缩性、高可靠性、独立部署、技术多样性和易于维护等主要特点。
这种设计模式已经成为现代应用程序开发的主流趋势,可以帮助企业实现快速迭代、快速响应市场需求和降低开发成本。
微服务架构也带来了一些挑战,如服务治理、服务发现和服务监控等方面的问题需要得到解决。
微服务架构是一种高效、灵活和可靠的架构设计模式,可以帮助企业实现业务创新和技术创新。
随着云计算、大数据和人工智能等技术的不断发展,微服务架构也将继续发挥重要作用,成为企业数字化转型的重要基石。
微服务平台可靠性设计目录1.背景 (5)1.1.无处不在的故障 (5)1.1.1.分布式部署和调用 (5)1.1.2.大型系统微服务进程内合设 (6)1.1.3.微服务健康度 (7)1.1.4.同步的I/O操作 (8)1.1.5.第三方SDK API调用 (9)1.2.微服务可靠性 (9)1.2.1.关键的可靠性因素 (10)2.异步I/O操作 (10)2.1.网络I/O (10)2.1.1.使用同步阻塞I/O的问题 (10)2.1.2.使用非阻塞I/O通信 (11)2.2.磁盘I/O (12)2.3.数据库操作 (15)3.故障隔离 (16)3.1.通信链路隔离 (16)3.2.调度资源隔离 (18)3.2.1.微服务之间隔离 (18)3.2.2.第三方依赖隔离 (19)3.3.进程级隔离 (19)3.3.1.容器隔离 (19)3.3.2.VM隔离 (20)4.集群容错 (21)4.1.路由容错 (21)4.2.服务降级 (21)4.2.1.强制降级 (22)4.2.2.容错降级 (22)4.2.3.服务降级Portal (23)4.3.熔断机制 (23)4.3.1.工作原理 (24)4.3.2.微服务健康度 (25)5.流量控制 (25)5.1.动态流控 (26)5.2.静态流控 (27)5.3.用户自定义流控机制 (27)6.使用Hystrix提升微服务可靠性 (28)6.1.Hystrix简介 (28)6.2.Hystrix的核心功能 (28)6.2.1.依赖隔离 (28)6.2.2.熔断器 (29)6.2.3.优雅降级 (30)6.2.4.Reactive编程 (31)6.2.5.信号量隔离 (31)6.3.集成Hystrix (32)6.3.1.集成架构 (32)6.3.2.集成Hystrix带来的优点 (33)7.附录 (33)7.1.参考文献 (33)1.背景微服务化之后,系统分布式部署,传统单个流程的本地API调用被拆分成多个微服务之间的跨网络调用,由于引入了网络通信、序列化和反序列化等操作,系统发生故障的概率提高了很多。
前后端微服务架构设计方案前后端微服务架构是一种将应用程序拆分为独立的小服务,并通过网络相互通信的软件设计模式。
在这种架构下,前端和后端服务可以独立开发、部署和扩展,从而提高开发速度和系统的可伸缩性。
下面是一个基本的前后端微服务架构设计方案。
1. 选择适当的技术栈:在设计前后端微服务架构之前,首先需要选择适合项目需求的技术栈。
例如,选择合适的前端框架和语言、后端框架和语言、数据库等等。
技术栈的选择要考虑到团队的技术栈熟悉度、项目要求和性能等方面因素。
2. 划分前后端服务:根据项目的功能和需求,将应用程序拆分为独立的前后端服务。
可以按照功能模块、业务模块或者用户角色来进行服务的划分。
划分的原则是将高度相关的功能放在同一个服务中,避免过度耦合和功能重叠。
3. 设计服务接口:在前后端微服务架构中,服务与服务之间通过API接口进行通信。
设计良好的服务接口可以提高系统的可维护性和扩展性。
可以使用规范的API设计原则和工具来设计服务接口,比如RESTful风格,使用JSON或者XML作为数据格式。
4. 设计前端架构:前端架构需要考虑到用户界面和用户体验。
可以使用现代的前端框架如React、Vue或Angular来设计前端应用程序。
前端架构应该将用户界面和业务逻辑分离,将用户交互和业务处理分离。
前端应用程序可以向后端API请求数据并将数据展示给用户。
5. 设计后端架构:后端架构需要考虑到服务的可扩展性、高性能和可靠性。
可以选择使用微服务框架如Spring Cloud或者Netflix OSS来设计后端架构。
后端架构应该将业务逻辑和数据持久化层分离,实现服务的可组合性和可复用性。
后端服务可以使用数据库、消息队列和缓存来处理数据和交互。
6. 实现服务通信:前后端服务之间的通信可以使用HTTP或者消息队列等方式。
可以使用API网关或者服务注册中心来管理服务之间的通信。
API网关可以处理服务的鉴权、限流、负载均衡等问题。
微服务架构设计方案微服务架构技术设计方案序言本文是一份微服务架构技术设计方案,旨在为读者提供有关微服务的选用、架构设计、思维设计、系统架构设计、总体设计和服务拆分原则等方面的详细信息。
微服务的选用微服务是一种面向服务的架构风格,它将应用程序设计为由多个小型自治服务组成的集合。
这些服务可以独立部署、升级和扩展,从而提高了应用程序的可靠性、可维护性和可扩展性。
在选择微服务架构时,需要考虑以下因素:业务需求、技术架构、团队能力和运维成本等。
架构设计微服务架构需要考虑以下几个方面的设计:服务拆分、服务通信、数据管理、部署和监控。
服务拆分是将应用程序拆分成多个小型自治服务的过程,需要根据业务需求和技术架构进行拆分。
服务通信需要考虑使用何种通信协议和通信方式。
数据管理需要考虑如何处理数据的一致性和可靠性。
部署需要考虑如何自动化部署和管理服务。
监控需要考虑如何监控服务的性能和可用性。
思维设计微服务架构需要考虑以下几个方面的思维设计:服务自治、服务可替换、服务可重用、服务可组合和服务可测试。
服务自治是指每个服务都有自己的生命周期和管理方式。
服务可替换是指可以随时替换服务,而不影响整个应用程序。
服务可重用是指可以将服务用于多个应用程序。
服务可组合是指可以将多个服务组合成一个更大的服务。
服务可测试是指可以对服务进行单元测试和集成测试。
系统架构设计微服务架构需要考虑以下几个方面的系统架构设计:服务网关、服务注册和发现、配置管理和安全管理。
服务网关是指将所有服务的入口点集中到一个网关上,从而简化客户端的调用过程。
服务注册和发现是指将所有服务的信息注册到一个中心化的服务注册表中,并通过服务发现机制来查找服务。
配置管理是指管理所有服务的配置信息。
安全管理是指保护服务的安全性,包括身份验证和授权等方面。
总体设计微服务架构需要考虑以下几个方面的总体设计:应用程序拆分、服务治理、监控和日志管理。
应用程序拆分是将应用程序拆分成多个小型自治服务的过程。
微服务系列(⼀):微服务架构的优势与不⾜微服务在当下引起⼴泛关注,成为⽂章、博客、社交媒体讨论和⼤会演讲的热点;在 Gartner 的 “Hype Cycle” 上排名也⾮常靠前。
与此同时,在软件社区也有⼈质疑微服务并⾮新事物。
反对者认为微服务只是 SOA (Service Oriented Architecture)的⼆度包装。
然⽽,⽆论是追捧还是质疑,微服务架构拥有巨⼤优势,尤其是它让敏捷开发和复杂的企业应⽤交付成为可能。
本系列包含 7 篇⽂章,介绍了微服务的设计、构建和部署,并与传统的单体架构进⾏了⽐较。
本系列将分析微服务架构的各种因素,你也将了解微服务架构模型的优劣、是否适合你的项⽬,以及如何应⽤。
Chris Richardson 微服务系列全 7 篇:1. 微服务架构的优势与不⾜⾸先让我们了解为何要将微服务纳⼊考量。
构建单体应⽤假设我们要开发⼀款全新的与 Uber 和 Hailo 竞争的打车软件。
在前期的会议和需求整理后,你要么需要⼿动创建⼀个新项⽬,要么可以使⽤ Rails、Spring Boot、Play 或者 Maven 来⽣成。
这个新应⽤可能采⽤了六边形架构模块,如下图所⽰:应⽤的核⼼是商业逻辑,它由定义服务、域对象和事件各模块来完成。
各种适配器围绕核⼼与外部交互。
适配器包括数据库访问组件、⽣成和 consume 信息的消息组件,以及提供 API 或者 UI 访问⽀持的 web 模块。
尽管拥有逻辑缜密的模块化设计,整个应⽤仍然以整体打包和部署,实际格式依赖于应⽤的语⾔和框架。
譬如,许多 Java 应⽤被打包为WAR ⽂件,部署在 Tomcat 或者 Jetty 这样的应⽤服务器。
有些 Java 应⽤本⾝就是包涵 JARs 的软件包。
与此类似,Rails 和 Node.js 应⽤也通过⽬录层级打包。
采⽤此种风格的应⽤⾮常普遍。
由于 IDE 和其他⼯具擅长构建单⼀应⽤,这类应⽤也易于部署。
微服务注意的地方全文共四篇示例,供读者参考第一篇示例:微服务架构并非银弹,其实现过程中需要注意一些关键的地方,以确保系统稳定、性能高效、可维护性强。
以下是在设计和实施微服务架构时需要注意的地方:1. 拆分粒度:拆分粒度是设计微服务架构时需要考虑的一个关键因素。
拆分得太细会造成服务过多、难以管理,而拆分得太粗则会失去微服务架构的优势。
在拆分时需要根据业务功能或领域来确定合适的粒度,避免过度细化或过度粗糙。
2. 服务通讯:微服务之间的通讯是整个架构的关键。
通常采用HTTP、RPC 等通信协议进行服务之间的调用和数据传输。
在设计时需要考虑通讯的稳定性、性能和安全性,避免出现瓶颈和单点故障。
3. 服务治理:微服务架构中有大量的服务需要管理和监控,因此需要建立完善的服务治理机制,包括服务注册与发现、负载均衡、熔断、限流、降级等。
通过服务治理可以确保系统的稳定性和可用性。
4. 数据管理:微服务架构中的每个服务通常都有自己的数据存储,因此需要考虑数据的一致性和同步。
可以采用事件驱动、消息队列等机制来实现数据同步,确保数据的准确性和完整性。
5. 安全性:在微服务架构中,不同的服务之间可能存在较多的网络通讯,因此需要加强对服务间通讯的安全性管理,包括数据加密、身份认证、访问控制等。
需要注意保护敏感数据和避免出现安全漏洞。
6. 分布式事务:在微服务架构中,可能存在跨服务的业务交互,因此需要考虑分布式事务的处理方式。
可以采用两阶段提交、消息事务等方式来保证多个服务之间的事务一致性。
7. 重构和性能优化:随着业务发展和需求变化,可能需要对微服务架构进行重构和优化。
需要建立合适的开发流程和工具链,保证代码的质量和性能。
微服务架构是一种灵活、高效的软件架构模式,但也需要在设计和实施过程中注意上述关键地方,确保系统的稳定性、性能和安全性。
只有在不断的实践和迭代中,才能真正发挥微服务架构的优势,促进业务的快速发展和创新。
第二篇示例:微服务是一种面向服务的架构风格,它将单一的应用程序划分为一组小型的服务,这些服务都可以独立部署、独立运行,彼此之间通过轻量级的通信机制进行交互。
基于微服务架构的物联网云平台设计与实现随着物联网技术的发展和普及,物联网云平台的设计与实现成为了各个行业的关注重点。
基于微服务架构的物联网云平台具有高可扩展性、灵活性和可靠性等优势,在满足任务需求的同时,能够满足不断增长的用户和设备需求。
本文将深入探讨基于微服务架构的物联网云平台的设计与实现,帮助读者了解该平台的关键特性和实施方法。
I. 介绍物联网云平台是一个集成了物联网设备管理、数据存储与分析、用户界面等功能的综合平台。
基于微服务架构的物联网云平台将各个功能模块拆分为独立的微服务,并通过消息队列、API网关等工具进行模块之间的通信。
这种架构使得云平台具有更好的可伸缩性,能够适应不同规模和需求的物联网应用。
II. 物联网云平台设计与实现1. 架构设计基于微服务架构的物联网云平台主要由以下几个核心模块构成:- 设备管理模块:用于管理设备的注册、认证、配置和监控等功能。
- 数据存储模块:负责存储设备数据,并支持数据的查询和分析。
- 用户界面模块:提供用户友好的界面,用于设备管理和数据可视化等操作。
- 认证与授权模块:用于用户身份验证和对API的访问授权。
这些模块可以通过API网关进行统一的访问,从而简化开发和部署的复杂性。
2. 微服务设计每个功能模块都可以独立部署和扩展,通过消息队列和API网关进行通信。
在微服务的设计中,需要考虑以下几个方面的问题:- 模块划分:根据功能进行模块的划分,避免模块之间的耦合性。
- 数据管理:使用数据库和缓存等技术进行数据的存储和管理。
- 通信机制:选择合适的通信机制,例如消息队列和RESTful API。
- 安全性:通过身份验证和访问控制等手段确保系统的安全性和可靠性。
3. 技术选择在实现物联网云平台时,需要选择适合的技术栈来支持微服务的设计与部署。
以下是一些常用的技术选型:- Spring Boot:用于实现微服务的快速开发和部署。
- Docker:用于将微服务打包为容器,并进行快速部署与扩展。
微服务的4个设计原则和19个解决方案微服务是一种架构风格,目的是将应用程序设计为一组小型服务,每个服务都可以独立部署、可独立扩展,并通过轻量级通信机制互相交互。
微服务架构具有许多设计原则和解决方案,其中包括四个重要的设计原则和19个常见的解决方案。
设计原则:1. 单一职责原则(Single Responsibility Principle):每个微服务应该只关注一个具体的业务功能,负责一个特定的功能领域,而不是一次实现所有功能。
单一职责原则有助于确保微服务的高内聚和低耦合,提高系统的可维护性和可扩展性。
2. 自包含性原则(Self-Contained Principle):每个微服务应该是一个独立的单位,包含所有必要的组件和资源,如数据库、配置文件等,以便可以独立部署和运行。
自包含性原则有助于降低微服务间的依赖性,提高系统的可靠性和可伸缩性。
3. 按业务边界划分原则(Bounded Context Principle):微服务应该根据业务需求进行划分,每个微服务都应该提供一组紧密相关的业务功能。
按业务边界划分原则有助于减少微服务间的交互,降低微服务的复杂性和维护成本。
4. 隔离性原则(Isolation Principle):微服务应该相互独立,任何一个微服务的故障和异常都不应该影响其他微服务的正常运行。
隔离性原则有助于提高系统的容错性和可用性。
解决方案:1. 服务注册与发现(Service Registration and Discovery):使用服务注册与发现机制来管理和发现微服务的位置和状态,实现微服务间的通信和协作。
2. 负载均衡(Load Balancing):使用负载均衡机制来分配请求到不同的微服务实例,提高系统的性能和可伸缩性。
3. 服务容错(Service Resilience):使用熔断、降级和限流等策略来处理微服务的故障和异常,提高系统的容错性和可用性。
4. 配置管理(Configuration Management):使用配置管理工具来管理微服务的配置信息,实现配置的动态更新和统一管理。
微服务平台可靠性设计目录1.背景 (5)1.1.无处不在的故障 (5)1.1.1.分布式部署和调用 (5)1.1.2.大型系统微服务进程内合设 (6)1.1.3.微服务健康度 (7)1.1.4.同步的I/O操作 (8)1.1.5.第三方SDK API调用 (9)1.2.微服务可靠性 (9)1.2.1.关键的可靠性因素 (10)2.异步I/O操作 (10)2.1.网络I/O (10)2.1.1.使用同步阻塞I/O的问题 (10)2.1.2.使用非阻塞I/O通信 (11)2.2.磁盘I/O (12)2.3.数据库操作 (15)3.故障隔离 (16)3.1.通信链路隔离 (16)3.2.调度资源隔离 (18)3.2.1.微服务之间隔离 (18)3.2.2.第三方依赖隔离 (19)3.3.进程级隔离 (19)3.3.1.容器隔离 (19)3.3.2.VM隔离 (20)4.集群容错 (21)4.1.路由容错 (21)4.2.服务降级 (21)4.2.1.强制降级 (22)4.2.2.容错降级 (22)4.2.3.服务降级Portal (23)4.3.熔断机制 (23)4.3.1.工作原理 (24)4.3.2.微服务健康度 (25)5.流量控制 (25)5.1.动态流控 (26)5.2.静态流控 (27)5.3.用户自定义流控机制 (27)6.使用Hystrix提升微服务可靠性 (28)6.1.Hystrix简介 (28)6.2.Hystrix的核心功能 (28)6.2.1.依赖隔离 (28)6.2.2.熔断器 (29)6.2.3.优雅降级 (30)6.2.4.Reactive编程 (31)6.2.5.信号量隔离 (31)6.3.集成Hystrix (32)6.3.1.集成架构 (32)6.3.2.集成Hystrix带来的优点 (33)7.附录 (33)7.1.参考文献 (33)1.背景微服务化之后,系统分布式部署,传统单个流程的本地API调用被拆分成多个微服务之间的跨网络调用,由于引入了网络通信、序列化和反序列化等操作,系统发生故障的概率提高了很多。
微服务故障,有些是由于业务自身设计或者编码不当导致,有些是底层的微服务化框架容错能力不足导致。
在实际项目中,需要从业务和平台两方面入手,提升微服务的可靠性。
1.1.无处不在的故障1.1.1.分布式部署和调用传统单体架构一个完整的业务流程往往在同一个进程内部完成处理,不需要进行分布式协作,它的工作原理如下所示:图1-1 传统单体架构本地方法调用微服务化之后,不同的微服务采用分布式集群部署方式,服务的消费者和提供者通常运行在不同的进程中,需要跨网络做RPC调用,它的工作原理如下所示:图1-2 微服务分布式RPC调用分布式调用之后,相比于传统单体架构的本地方法调用,主要引入了如下潜在故障点:✓序列化与反序列化:微服务的请求和应答都需要经过序列化和反序列化,做消息的跨网络通信,由于数据结构不一致、不支持的数据类型、对方编解码错误等都会导致序列化和反序列化失败,进而导致微服务调用失败。
✓网络问题:常见的包括网络超时、网络闪断、网络单通、网络拥塞等,都可能会导致微服务远程调用的失败。
1.1.2.大型系统微服务进程内合设理想情况下,每个微服务都独立打包和部署,微服务之间天然就支持进程级隔离,但事实上,对于一个大规模的企业IT系统、或者大型网站,是由成百上千个微服务组成的,在实践中,微服务通常是不可能做到百分之百独立部署的,原因如下:1.方便开发:通常会按照业务域划分团队,同一个业务域往往包含多个微服务,由一个团队负责开发。
为了方便CI/CD,同一业务域的微服务往往打包和部署在一起,而不是每个微服务独立打包部署。
2.方便运维:海量的微服务进程(以1000个微服务* 10个进程实例为例),会增加部署、数据采集(性能KPI和日志等)、告警、问题定位等成本,如果运维自动化程度不高,很难支撑大规模的微服务独立部署。
3.提升性能:一些业务对时延非常敏感,如果该业务链上的所有微服务调用都跨网络通信,时延往往无法满足业务要求。
通过将微服务合设在同一个进程之内,利用路由短路,把RPC调用转化成本地方法调用,可以极大的提升性能。
4.简化分布式事务处理:分布式部署之后,会带来分布式事务问题。
有时候业务为了简化分布式事务的处理,将事务相关的微服务部署在同一个进程中,把分布式事务转换成本地事务,简化事务处理。
不同的微服务合设在同一个进程之中,就会引入一系列潜在的故障点,例如:✓处理较慢的微服务会阻塞其它微服务✓某个微服务故障蔓延,可能导致整个进程不可用✓低优先级的微服务,抢占高优先级微服务的资源1.1.3.微服务健康度传统情况下,往往使用服务注册中心检测微服务的状态,当检测到服务提供者不可用时,会将故障的服务信息广播到集群所有节点,消费者接收到服务故障通知消息之后,根据故障信息中的服务名称、IP地址等信息,对故障节点进行隔离。
它的工作原理如下所示:图1-3 微服务状态检测使用基于心跳或者会话的微服务状态检测,可以发现微服务所在进程宕机、网络故障等问题,但在实际业务中,微服务并非“非死即活”,它可能处于“亚健康状态”,服务调用失败率很高,但又不是全部失败。
或者微服务已经处于过负荷流控状态,业务质量受损,但是又没有全部中断。
使用简单的微服务状态检测,很难应对上述这些场景。
通过对微服务的运行质量建模,利用微服务健康度模型,根据采集的各种指标对微服务健康度实时打分,依据打分结果采取相应的可靠性对策,可以更有针对性的保障系统的可靠性。
1.1.4.同步的I/O操作在整个微服务调用过程中,主要会涉及到三类I/O操作:✓网络I/O操作,涉及到网络读写✓磁盘I/O操作,主要是记录日志、话单、写本地文件等✓数据库访问,例如Java使用JDBC驱动进行数据库操作图1-4 微服务涉及的主要I/O操作凡是涉及到I/O操作的,如果I/O操作是同步阻塞模式,例如Java的BIO、文件File 的读写操作、数据库访问的JDBC接口等,都是同步阻塞的。
只要访问的网络、磁盘或者数据库实例比较慢,都会导致调用方线程的阻塞。
由于线程是Java虚拟机比较重要的资源,当大量微服务调用线程被阻塞之后,系统的吞吐量将严重下降。
1.1.5.第三方SDK API调用在微服务中,调用第三方SDK API,也可能会引入新的故障点,例如通过FTP客户端访问远端的FTP服务,或者使用MQ客户端访问MQ服务,如果这些客户端API的容错性设计不好,也会导致调用方的级联故障,这些故障是潜在和隐性的,在设计的时候往往容易被忽视,但它带来的风险和危害是巨大的。
1.2.微服务可靠性软件可靠性是指在给定时间内,特定环境下软件无错运行的概率。
软件可靠性包含了以下三个要素:1)规定的时间:软件可靠性只是体现在其运行阶段,所以将运行时间作为规定的时间的度量。
运行时间包括软件系统运行后工作与挂起(启动但空闲)的累计时间。
由于软件运行的环境与程序路径选取的随机性,软件的失效为随机事件,所以运行时间属于随机变量。
2)规定的环境条件:环境条件指软件的运行环境。
它涉及软件系统运行时所需的各种支持要素,如支持硬件、操作系统、其它支持软件、输入数据格式和范围以及操作规程等。
3)规定的功能:软件可靠性还与规定的任务和功能有关。
由于要完成的任务不同,则调用的子模块就不同(即程序路径选择不同),其可靠性也就可能不同。
所以要准确度量软件系统的可靠性必须首先明确它的任务和功能。
1.2.1.关键的可靠性因素微服务的运行质量,除了自身的可靠性因素之外,还受到其它因素的影响,包括网络、数据库访问、其它相关联的微服务运行质量等。
微服务的可靠性设计,需要考虑上述综合因素,总结如下:图1-5 微服务可靠性设计模型2.异步I/O操作2.1.网络I/O2.1.1.使用同步阻塞I/O的问题以Java为例,在JDK 1.4推出JAVA NIO1.0之前,基于JAVA的所有Socket通信都采用了同步阻塞模式(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在可靠性和性能方面存在巨大的弊端:2-1 传统Java 同步阻塞I/O模型采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,接收到客户端连接之后为客户端连接创建一个新的线程处理请求消息,处理完成之后,返回应答消息给客户端,线程销毁,这就是典型的一请求一应答模型。
该架构最大的问题就是不具备弹性伸缩能力,当并发访问量增加后,服务端的线程个数和并发访问数成线性正比,由于线程是JAVA虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能急剧下降,随着并发量的继续增加,可能会发生句柄溢出、线程堆栈溢出等问题,并导致服务器最终宕机。
2.1.2.使用非阻塞I/O通信微服务进行远程通信时,通过使用非阻塞I/O,可以解决由于网络时延大、高并发接入等导致的服务端线程数膨胀或者线程被阻塞等问题。
以Java为例,从JDK1.4开始,JDK提供了一套专门的类库支持非阻塞I/O,可以在java.nio包及其子包中找到相关的类和接口。
JDK1.7之后,又提供了NIO2.0类库,支持异步I/O操作。
利用JDK的异步非阻塞I/O,可以实现一个I/O线程同时处理多个客户端链路,读写操作不会因为网络原因被阻塞,I/O线程可以高效的并发处理多个客户端链路,实现I/O多路复用,它的工作原理如下所示:2-2 Java非阻塞I/O模型使用非阻塞I/O进行通信,以Java语言为例,建议策略如下:1)TCP私有协议:建议直接基于Netty开发。
2)HTTP/Restful/SOAP等:选择支持非阻塞I/O的Web框架。
也可以选择基于Netty构建的开源应用层协议栈框架,例如支持异步Restful的RestExpress。
2.2.磁盘I/O微服务对磁盘I/O的操作分为两类:✓直接文件操作:例如调用File的open、write、read等接口,进行文件操作。
✓间接文件操作:例如调用日志类库写日志,虽然微服务并没有直接操作日志文件,但是日志类库底层还是会进行文件的读写等操作。
在实际项目中,最容易被忽视的就是日志操作。
不同的日志类库,写日志的机制不同,以Log4j 1.2.X版本为例,当日志队列满之后,有多种策略:✓同步等待,直到新的日志消息能够入队列,它会阻塞当前业务线程。
✓丢弃当前的日志消息,不会阻塞当前业务线程。
✓不入队列,由当前调用写日志的业务线程执行日志I/O操作,如果此时磁盘I/O写入速度慢,则会阻塞当前业务线程。
在实际生产环境中,我们就遇到过类似问题,在某些时段,磁盘WIO达到10+持续几秒钟-10几秒钟,然后又恢复正常。