微服务架构的核心要点和实现原理
软件研发使用微服务架构提升系统可维护性

软件研发使用微服务架构提升系统可维护性随着互联网技术的迅猛发展,越来越多的企业开始依赖软件系统来支撑业务运营。
然而,传统的单体应用架构面临着很多挑战,比如系统可维护性差、扩展性受限、团队协作不便等等。
为了解决这些问题,微服务架构应运而生。
本文将探讨如何使用微服务架构来提升软件系统的可维护性。
一、什么是微服务架构微服务架构是一种以组件化的方式构建应用的架构风格。
它将一个复杂的应用拆分成一些独立部署、灵活组合的小型服务。
每个服务都有自己独立的数据库,并通过轻量级的通信机制来实现服务之间的协作。
微服务架构的核心思想是将大系统拆分成小的、自治的服务,每个服务都能够独立进行开发、测试、部署和扩展。
二、微服务架构对系统可维护性的提升1. 解耦性增强微服务架构通过将系统拆分成多个服务,每个服务都有明确的边界和职责。
这种解耦性使得各个服务之间耦合度降低,一个服务的修改不会对其他服务产生影响。
这样一来,当需要修改一个功能或者修复一个Bug时,只需要关注特定的服务,而不需要担心对整个系统的影响。
这显著提高了系统的可维护性,减少了修改和扩展的风险。
2. 独立部署在微服务架构中,每个服务都可以独立进行部署和升级。
这种独立部署的特性使得团队可以更加灵活地开发和发布新功能,无需等待整个系统的部署过程。
同时,当一个服务需要进行水平扩展时,也可以单独扩展该服务,而不需要对整个系统进行扩容。
这种独立部署的能力大大提高了系统的可维护性,减少了系统维护和升级的难度。
3. 技术栈灵活在传统的单体应用架构中,系统的技术栈通常是固定的。
而在微服务架构中,每个服务都可以选择最适合自己的技术栈。
这样一来,团队可以更加自由地选择和尝试新的技术,无需受到整个系统的限制。
这种技术栈灵活性的提升,使得系统的可维护性得到了很大的加强。
4. 易于扩展和替换微服务架构将一个系统分解成多个小的服务,这使得每个服务可以根据自身需求进行灵活的扩展。
当系统需要处理更多的请求时,可以针对性地扩展某些服务,而不需要对整个系统进行扩容。
软件研发基于微服务的架构设计

软件研发基于微服务的架构设计在当今数字化时代,软件研发已经成为了各行各业的关键能力之一。
随着技术的不断发展和互联网的普及,微服务架构逐渐崭露头角。
本文将介绍基于微服务的架构设计,以及如何在软件研发中应用微服务架构,从而提高系统的可扩展性、灵活性与可维护性。
第一部分:微服务架构的概念及优势(约500字)微服务架构是一种将软件应用拆分为一组更小的、松耦合的服务的设计风格。
它的核心思想是将复杂的单体应用拆分成多个小型服务应用,每个服务应用负责独立的业务功能。
微服务架构的优势主要包括以下几个方面:1. 模块化开发:每个服务应用独立开发,开发人员可以集中精力在特定功能的开发上,提高开发效率。
2. 独立可部署:每个服务应用可以独立部署,使得系统的扩展和升级更加容易。
3. 弹性可伸缩:由于每个服务应用都是独立的,可以根据实际需求对某些服务进行水平扩展,提高系统的性能和并发能力。
4. 技术选型灵活:不同的服务应用可以使用不同的技术栈,根据实际需求选择最适合的技术框架和语言。
5. 容错与隔离:由于每个服务应用是独立的,单个服务的故障不会影响整个系统的运行。
第二部分:软件研发基于微服务的架构设计(约700字)在软件研发中应用微服务架构的关键是如何进行架构设计。
以下是一些基本的步骤和原则:1. 拆分和划分服务:根据业务领域和功能需求将系统拆分为多个独立的服务。
每个服务应该关注特定的业务功能,实现高内聚低耦合的设计原则。
2. 服务间通信与协作:由于每个服务都是独立的,它们之间需要进行通信与协作。
可以使用轻量级的通信协议,如RESTful API或消息队列,实现服务间的数据传输和消息传递。
3. 数据管理和一致性:在微服务架构中,每个服务应用都有自己的数据存储,因此需要考虑数据管理和一致性的问题。
可以采用数据库复制、事件驱动等方式来保证多个服务之间数据的一致性。
4. 安全与权限控制:由于每个服务都是独立的,需要对服务的安全性进行考虑。
Java微服务架构实现高可用与容错性

Java微服务架构实现高可用与容错性在当今互联网时代,微服务架构已成为一种流行的架构模式,它通过将一个大型应用拆分成多个小型服务,来提供更灵活、可伸缩和可维护的解决方案。
在微服务架构中,高可用性和容错性是非常重要的特性之一。
本文将探讨如何在Java微服务架构中实现高可用性和容错性。
一、服务注册与发现在微服务架构中,服务的注册与发现是一个核心组件。
通过将服务注册到服务注册中心,其他服务可以通过服务注册中心来发现和调用该服务,从而实现服务间的通信。
常用的服务注册中心有Netflix的Eureka和Consul等。
二、负载均衡负载均衡是实现高可用性的重要手段之一。
在微服务架构中,通过将用户请求分发到不同的服务实例上,可以提高系统的负载能力和可用性。
常见的负载均衡算法有轮询、随机、加权轮询等。
在Java中,可以通过集成Spring Cloud Ribbon来实现负载均衡。
三、熔断机制熔断机制是实现容错性的关键技术之一。
当一个服务出现故障或不可用时,熔断机制可以快速返回一个默认值或错误信息,避免故障向下游服务的传递。
常见的熔断框架有Netflix的Hystrix和Resilience4j 等。
通过集成这些框架,可以在Java微服务架构中实现熔断机制。
四、服务容器化将服务容器化是实现高可用性和容错性的一种重要手段。
通过将服务打包成镜像,并在容器平台上进行部署和管理,可以提高服务的弹性和可靠性。
Docker和Kubernetes是目前非常流行的容器化工具,它们可以帮助我们快速构建和管理容器化的微服务。
五、分布式日志与监控在微服务架构中,分布式日志和监控是保障服务可用性和容错性的重要组成部分。
通过对服务的日志和指标进行收集、分析和可视化,可以及时发现和解决问题,提高系统的稳定性和可用性。
常见的分布式日志和监控系统有ELK、Prometheus和Grafana等。
六、灰度发布灰度发布是实现高可用性和容错性的一种重要策略。
云原生和微服务架构的设计和部署方法

云原生和微服务架构的设计和部署方法云原生和微服务架构是当今软件开发和部署领域的热门话题。
它们是为了应对当今复杂的软件系统所提出的新的设计理念和部署方法。
本文将分析云原生和微服务架构的概念、设计方法和部署策略,并探讨它们在实际案例中的应用。
一、云原生架构云原生架构是指将应用程序设计和部署在云平台上的一种软件架构。
它的核心理念是将软件系统拆分成多个模块化的组件,并在容器化和自动化的环境中进行部署和管理。
云原生架构的设计和部署方法主要包括以下几个方面:1.微服务化云原生架构倡导将软件系统拆分成多个微服务,每个微服务可以独立部署和扩展。
微服务之间通过API或消息队列进行通信,从而实现松耦合和高内聚的架构。
微服务可以使用不同的编程语言和技术栈,因此可以更好地利用现有的开发资源和技术积累。
微服务化的设计方法需要注意服务之间的依赖关系和通信机制,以及服务发现和负载均衡的策略。
2.基于容器的部署云原生架构通常使用容器技术来进行部署和管理。
容器可以提供隔离和易复制的运行环境,从而更容易地在不同的云平台上进行部署和迁移。
常见的容器化平台包括Docker和Kubernetes。
设计时需要考虑容器镜像的构建和存储,以及容器编排和调度的策略。
3.自动化运维云原生架构倡导使用自动化工具来进行持续集成、持续交付和持续部署。
自动化运维可以减少人为操作的错误和延迟,从而提高软件系统的可靠性和稳定性。
设计时需要考虑自动化测试、部署流程和监控报警的策略。
二、微服务架构微服务架构是云原生架构的基础理念和设计模式之一。
它是一种将软件系统拆分成多个独立的服务单元,并通过轻量级通信机制进行协同工作的软件架构。
微服务架构的设计和部署方法主要包括以下几个方面:1.服务设计原则微服务架构倡导将软件系统拆分成多个独立的服务单元,每个服务单元都有自己的数据存储和业务逻辑。
服务之间通过API或消息队列进行通信,从而实现松耦合和高内聚的架构。
设计时需要考虑服务粒度的划分和服务之间的依赖关系。
2024微服务接口架构设计

2
实现合理的身份、访问管理框架
云架构可以不再依赖网络层访问控制,云访问控制框架应管理不同角色的整个访问过程,包括用户。
3
实现安全管理API
所有的安全服务都应被打包成API(REST/SOAP)形式部署,以支持自动化开通和编排。API有助于在应用部署时实现自动化的防火墙策略、配置加固、访问控制。
面临的问题目前在客户管理、服务和产品创新等方面无法满足业务要求无法适应新形势下移动化、智能化、个性化要求业务响应慢,现有系统问题无法快速调整新应用实施难、上线慢等等
业务挑战保险客户对全生命周期的用户体验、个性化服务等各方面要求越来越高市场竞争日趋激烈,在同质化竞争的大背景下,保险公司的业务创新能力至关重要,对灵活快速的险种产品创新、服务创新、渠道创新等提出更高要求日趋成熟的新技术对保险业务发展来说既是机会也是挑战,要求保险公司能充分利用移动互联网、云计算、大数据等技术,更好的满足客户保险服务要求对内要满足精细化管理要求,对外也要满足日趋严格的监管要求等等
微服务带来的管理提升之四:开发部署能力
22
Dev
开发支持
开发者门户
PaaS提供的开发者自助服务门户
集成IDE
符合开发者习惯的IDE环境
敏捷工具
协同的敏捷开发工具,包括协同、计划、任务、缺陷、文档等
开发框架
主流语言
Java、.net
微服务 实施方案

微服务实施方案随着互联网和移动互联网的快速发展,传统的单体架构在面对高并发、大流量的情况下逐渐显露出了一些瓶颈和不足。
为了更好地应对这些挑战,许多企业开始转向微服务架构,这种架构可以更好地满足业务的需求,提高系统的弹性和可伸缩性。
一、微服务架构概述。
微服务架构是一种以业务功能为中心的架构模式,它将一个大型的单体应用拆分成多个小型的服务。
每个服务都可以独立部署、独立运行,并且可以使用不同的编程语言和技术栈。
微服务之间通过轻量级的通信机制进行交互,比如RESTful API。
二、微服务实施方案。
1. 服务拆分。
在实施微服务架构时,首先需要对现有的单体应用进行服务拆分。
这个过程需要深入了解业务逻辑,将应用拆分成多个功能单一的服务,每个服务都应该具有清晰的边界和明确的职责。
同时,需要考虑服务之间的依赖关系,确保拆分后的服务能够独立运行。
2. 服务治理。
在微服务架构中,服务的数量会大大增加,因此需要引入服务治理机制来管理这些服务。
服务治理包括服务注册与发现、负载均衡、熔断、限流等功能,这些功能可以帮助我们更好地管理和监控服务的运行状态。
3. 弹性设计。
微服务架构中的每个服务都应该具有弹性设计,能够在面对高并发、大流量的情况下保持稳定运行。
这包括对服务的水平扩展、容错机制、自动化运维等方面的考虑。
4. 数据管理。
在微服务架构中,数据管理也是一个重要的问题。
传统的单体应用通常会使用单一的数据库来存储所有的数据,但在微服务架构中,每个服务都应该有自己的数据存储,这就需要考虑数据的一致性和同步的问题。
5. 监控与日志。
微服务架构中的每个服务都应该具有良好的监控和日志功能,这可以帮助我们及时发现和解决问题。
同时,需要建立统一的监控和日志平台,对整个微服务架构进行全面的监控和管理。
三、总结。
微服务架构是一种适应于互联网时代的架构模式,它可以帮助我们更好地应对高并发、大流量的挑战,提高系统的弹性和可伸缩性。
在实施微服务架构时,需要考虑服务拆分、服务治理、弹性设计、数据管理、监控与日志等方面的问题,只有综合考虑这些方面,才能够顺利地实施微服务架构并取得成功。
基于微服务的云计算架构设计与实现

基于微服务的云计算架构设计与实现第一章:简介随着互联网的快速发展,企业对于高效、稳定、安全的信息化技术需求也越来越高。
基于微服务的云计算架构设计已成为企业信息化建设的重要方向。
本文将对基于微服务的云计算架构设计与实现进行详细介绍。
第二章:云计算架构设计2.1 传统架构和微服务架构的对比传统架构是采用集中式的架构风格,将所有功能集中到一个应用中,各个模块之间高度耦合。
而微服务架构是采用分布式、去中心化的架构风格,将应用拆分成一个个小的服务单元,各个服务单元之间独立运行,各司其职,互不干扰。
相比传统架构,微服务架构具有更高的可扩展性、可维护性和可部署性。
2.2 微服务架构的设计原则微服务架构虽然具有很多优点,但在实际应用中需要遵循一些设计原则:(1)单一职责原则:每个服务只需要负责一个功能;(2)服务间松耦合:服务之间通过API接口进行通信,不直接依赖其他服务的实现;(3)无状态服务:服务不保存状态,以便快速实现高可用和水平扩展;(4)自动化部署:通过自动化部署工具实现服务的快速部署;(5)容错设计:通过多节点部署和负载均衡实现服务的高可用性;(6)团队自治:将服务团队化,团队有自主选择技术、开发和运维的权利。
2.3 云计算应用场景云计算主要应用于以下场景:(1)存储和备份:云存储提供高效的存储和备份功能;(2)虚拟机:云计算提供强大的虚拟机技术,企业可以通过云计算快速实现应用上云;(3)容器技术:容器技术是云计算的一种重要应用方式,可以提供轻量级应用隔离和快速部署;(4)大数据处理:云计算提供高效的大数据处理和分析能力,帮助企业做出更准确的业务决策;(5)人工智能:云计算已成为人工智能的重要技术基础,是实现人工智能普及化和商业化的有力工具。
第三章:基于微服务的云计算案例分析3.1 微服务架构的设计与实现以在线购物平台为例,将整个平台拆分成多个独立的服务。
每个服务只需要负责一个功能,比如商品服务、订单服务、用户服务等。
通过PHP实现微服务架构打造可扩展的分布式系统

通过PHP实现微服务架构打造可扩展的分布式系统随着互联网的快速发展,业务规模的不断扩大,单一的服务器已经无法满足大规模用户的需求,而分布式系统的出现为解决这一问题提供了一种可行的方案。
本文将介绍如何使用PHP语言实现微服务架构,进而打造一个可扩展的分布式系统。
一、什么是微服务架构微服务架构是一种软件架构设计风格,它将一个大型软件应用拆分为多个小型的、独立的服务单元,每个服务单元都能够独立部署和扩展,服务之间通过轻量级的通信机制进行协作。
每个服务单元可以由不同的技术栈实现,因此具有更高的灵活性和独立性。
二、为什么选择PHP作为实现微服务架构的语言1. 开发人员数量众多:PHP是一种非常流行的开发语言,有着庞大的开发人员基础。
使用PHP实现微服务架构可以更容易找到合适的人才参与开发工作。
2. 成熟的生态系统:PHP有着丰富的开源组件和框架,如Laravel、Symfony等,这些成熟的组件和框架可以为微服务架构的实现提供良好的支持。
3. 可扩展性强:PHP支持水平扩展,可以通过增加服务器节点来应对负载压力,同时PHP也支持分布式文件系统,使得数据的存储和访问更加方便。
三、实现微服务架构的步骤1. 定义服务边界:将一个大型应用拆分为多个服务单元,每个服务单元负责一个特定的业务功能。
在定义服务边界时,需要考虑到服务之间的依赖关系和通信方式。
2. 使用RESTful API进行通信:服务之间通过RESTful API进行通信是一种常见的方式。
通过HTTP协议和JSON数据格式可以实现不同服务之间的数据传输和调用。
3. 使用消息队列实现异步通信:对于大量的异步任务处理,可以使用消息队列来实现。
PHP有多个消息队列的实现,如RabbitMQ、Kafka等,这些工具可以帮助我们更好地处理异步任务。
4. 配置和服务发现:微服务架构中,每个服务单元都需要有自己的配置文件和服务注册中心。
PHP提供了多种配置管理和服务发现的工具,如Consul、Etcd等,可以帮助我们管理服务的配置和发现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微服务架构的核心要点和实现原理目录一、微服务架构中职能团队的划分 (3)二、微服务的去中心化治理 (5)三、微服务的交互模式 (6)四、微服务的分解和组合模式 (11)五、微服务的容错模式 (32)六、微服务的粒度 (43)一、微服务架构中职能团队的划分传统单体架构将系统分成具有不同职责的层次,对应的项目管理也倾向于将大的团队分成不同的职能团队,主要包括:用户交互UI团队、后台业务逻辑处理团队与数据存取ORM团队、DBA团队等。
每个团队只对自己分层的职责负责,并对使用方提供组件服务质量保证。
如果其中一个模块化组件需要升级、更新,那么这个变更会涉及不同的分层团队,即使升级和变更的改变很小,也需要进行跨团队沟通:需求阶段需要跨团队沟通产品功能,设计阶段需要跨团队沟通设计方案,开发阶段需要跨团队沟通具体的接口定义,测试阶段需要沟通业务回归等事宜,甚至上线都需要跨团队沟通应用的上线顺序。
可见在传统的整体架构下,后期的维护成本很高,出现事故的风险很大。
根据康威定律,团队的交流机制应该与架构设计机制相对应。
因此,在微服务架构下,职能团队的划分方法是我们首先要考虑的一个核心要素。
微服务时代的团队沟通方式如图1-9所示。
图1-9微服务架构按照业务的功能进行划分,每个单一的业务功能叫作一个服务,每个服务对应一个独立的职能团队,团队里包含用户交互UI设计师、后台服务开发人员、DBA、运营和运维人员。
在传统的整体架构中,软件是有生命周期的,经历需求分析、开发和测试,然后被交付给运维团队,这时开发团队将会解散,这是对软件的一个“放手”。
而在微服务架构中,提倡运维人员也是服务项目团队的一员,倡导谁开发、谁维护,实施终生维护制度。
在业务服务的内部实现需要升级或者变更时,团队内的各角色成员进行沟通即可,而不需要进行跨团队沟通,这大大提高了沟通效率。
只有服务之间的接口需要变更时才需要跨部门沟通,如果前期在服务之间的交互上定义了良好的接口,则接口变更的概率并不大,即使接口模式有变更,也可以通过一定的设计模式和规范来解决,可参考1.3.3节。
二、微服务的去中心化治理笔者曾经在一个互联网平台上工作,平台的决策者倡导建设API网关,所有外部服务和内部服务都由统一的API网关进行管理。
在项目初期,中心化的API网关统一了所有API的入口,这看起来很规范,但从技术角度来看限制了API的多样化。
随着业务的发展,API网关开始暴露问题,每个用户请求经过机房时只要有服务之间的交互,则都会从API网关进行路由,服务上量以后,由于内部服务之间的交互都会叠加在API网关的调用上,所以在很大程度上放大了API网关的调用TPS,API网关很快就遇到了性能瓶颈。
这个案例是典型的微服务的反模式,微服务倡导去中心化的治理,不推荐每个微服务都使用相同的标准和技术来开发和使用服务。
在微服务架构下可以使用C++开发一个服务,来对接Java 开发的另外一个服务,对于异构系统之间的交互标准,通常可以使用工具来补偿。
开发者可以开发共用的工具,并分享给异构系统的开发者使用,来解决异构系统不一致的问题,例如:Thrift 远程调用框架使用中间语言(IDL)来定义接口,中间语言是独立于任何语言的,并提供了工具来生成中间语言,以及在中间语言与具体语言之间的代码转换。
微服务架构倡导去中心化的服务管理和治理,尽量不设置中心化的管理服务,最差也需要在中心化的管理服务宕机时有替代方案和设计。
在笔者工作的支付平台服务化建设中,第1层SOA 服务化采用Dubbo框架进行定制化,如果Dubbo服务化出现了大面积的崩溃,则服务化体系会切换到点对点的hessian远程调用,这被称为服务化降级,降级后点对点的hessian远程调用时没有中心化节点,整体上符合微服务的原理。
三、微服务的交互模式本节介绍微服务之间交互的通用设计模式,这些设计模式对微服务之间的交互定义契约,服务的生产者和调用者都需要遵守这些契约,才能保证微服务不出问题。
1. 读者容错模式读者容错模式(Tolerant Reader)指微服务化中服务提供者和消费者之间如何对接口的改变进行容错。
从字面上来讲,消费者需要对提供者提供的功能进行兼容性设计,尤其对服务提供者返回的内容进行兼容,或者解决在服务提供者改变接口或者数据的格式的情况下,如何让服务消费者正常运行。
任何一个产品在设计时都无法预见将来可能增加的所有需求,服务的开发者通常通过迭代及时地增加新功能,或者让服务提供的API自然地演进。
不过,服务提供者对外提供的接口的数据格式的改变、增加和删除,都会导致服务的消费者不能正常工作。
因此,在服务消费者处理服务提供者返回的消息的过程中,需要对服务返回的消息进行过滤,只提取自己需要的内容,对多余或者未知的内容采取抛弃的策略,而不是硬生生地抛错处理。
在实现过程中不推荐使用严格的校验策略,而是推荐使用宽松的校验策略,即使服务消费者拿到的消息报文发生了改变,程序也只需尽最大努力提取需要的数据,同时忽略不可识别的数据。
只有在服务消费者完全不能识别接收到的消息,或者无法通过识别的信息继续处理流程时,才能抛出异常。
服务的消费者的容错模式忽略了新的消息项、可选的消息项、未知的数据值及服务消费者不需要的数据项。
笔者当前在某个支付公司工作,公司里几乎每个业务都需要使用枚举类型,在微服务平台下,笔者在研发流程规范中定义了一条枚举值使用规范:在服务接口的定义中,参数可以使用枚举值,在返回值的DTO中禁止使用枚举值。
这条规范就是读者容错模式在实践中的一个实例,之所以在参数中允许使用枚举值,是因为如果服务的提供者升级了接口,增加了枚举值,若服务的消费者并没有感知,则服务的消费者得知新的枚举值就可以传递新的枚举值了;但是如果接口的返回DTO中使用了枚举值,并且因为某种原因增加了枚举值,则服务消费者在反序列化枚举时就会报错,因此在返回值中我们应该使用字符串等互相认可的类型,来做到双方的互相兼容,并实现读者容错模式。
2. 消费者驱动契约模式消费者驱动契约模式用来定义服务化中服务之间交互接口改变的最佳规则。
服务契约分为:提供者契约、消费者契约及消费者驱动的契约,它从期望与约束的角度描述了服务提供者与服务消费者之间的联动关系。
∙提供者契约:是我们最常用的一种服务契约,顾名思义,提供者契约是以提供者为中心的,提供者提供了什么功能和消息格式,各消费者都会无条件地遵守这些约定,不论消费者实际需要多少功能,消费者接受了提供者契约时,都会根据服务提供者的规则来使用服务。
∙消费者契约:是对某个消费者的需求进行更为精确的描述,在一次具体的服务交互场景下,代表消费者需要提供者提供功能中的哪部分数据。
消费者契约可以被用来标识现有的提供者契约,也可以用来发现一个尚未明确的提供者契约。
∙消费者驱动的契约:代表服务提供者向其所有当前消费者承诺遵守的约束。
一旦各消费者把自己的具体期望告知提供者,则提供者无论在什么时间和场景下,都不应该打破契约。
在现实的服务交互设计中,上面这三种契约是同时存在的,笔者所在的支付平台里,交易系统在完成一笔支付后,需要到账务系统为商户入账,在这个过程中,服务契约表现如下。
∙生产者契约:账务系统提供Dubbo服务化接口,参数为商户账户ID、入账订单号和入账金额。
∙消费者契约:账务系统返回DTO,包含商户账户ID、入账订单号、入账金额、入账时间、账务流水号、入账状态等,而交易系统只需使用其中的入账订单号和入账状态。
∙消费者驱动的契约:为了保证资金安全,交易系统作为入账的发起者向账务提出要求,需要账务做幂等和滤重处理,对重复的入账请求进行拦截;账务系统在接受这个契约后,即使将来有任何改变,也不能打破这个限制,否则就会造成资金的损失,这在金融系统中是最严重的问题。
服务之间的交互需要使用的三种服务契约如图1-10所示。
图1-10从图1-10可以看到,服务提供者契约是服务提供者单方面定下的规则,而一个消费者契约会成为提供者契约的一部分,多个服务消费者可以对服务提供者提出约束,服务提供者需要在将来遵守服务消费者提出的契约,这就是消费者驱动的契约。
3. 去数据共享模式与SOA服务化对比,微服务是去ESB总线、去中心化及分布式的;而SOA还是以ESB为核心实现遗留系统的集成,以及基于Web Service为标准实现的通用的面向服务的架构。
在微服务领域,微服务之间的交互通过定义良好的接口来实现,不允许使用共享数据来实现。
在实践的过程中,有些方案的设计使用缓存或者数据库作为两个微服务之间的纽带,在业务流程的处理过程中,为了处理简单,前一个服务将中间结果存入数据库或者缓存,下一个服务从缓存或者数据库中拿出数据继续处理。
处理流程如图1-11所示。
图1-11这种交互流程的缺点如下。
∙使得微服务之间的交互除了接口契约,还存在数据存储契约。
∙上游的数据格式发生变化时,可能导致下游的处理逻辑出现问题。
∙多个服务共享一个资源服务,对资源服务的运维难以划清职责和界限。
∙在做双机房独立部署时,需要考虑服务和资源的路由情况,跨机房的服务调用不能使用独立的资源部署模式,因此难以实现服务自治。
因此,在设计微服务架构时,一定不要共享缓存和数据库等资源,也不要使用总线模式,服务之间的通信和交互只能依赖定义良好的接口,通常使用RESTful样式的API或者透明的RPC 调用框架。
四、微服务的分解和组合模式使用微服务架构划分服务和团队是微服务架构实施的重要一步,良好的划分和拆分使系统达到松耦合和高内聚的效果,然后通过微服务的灵活组装可以满足上层的各种各样的业务处理需求。
在微服务架构的需求分析和架构设计过程中,通常是用领域的动词和名词来划分微服务的,例如,对于一个电商后台系统,可以分解为订单、商品、商品目录、库存、购物车、交易、支付、发票、物流等子系统,每个名词和动词都可以是一个微服务,将这几个微服务组合在一起,就实现了电商平台用户购买商品的整个业务流。
这样拆分以后,系统具有敏捷性、灵活性、可伸缩性等,拆分后有多个高度自治的微服务,那么以什么方式组合微服务呢?1. 服务代理模式服务代理模式是最简单的服务组合模式,它根据业务的需求选择调用后端的某个服务。
在返回给使用端之前,代理可以对后端服务的输出进行加工,也可以直接把后端服务的返回结果返回给使用端。
服务代理模式的架构如图1-12所示。
图1-12在笔者工作的微服务化架构平台下,经常会使用这种模式,典型的案例是做平滑的系统迁移,通常经历如下4个阶段。
∙在新老系统上双写。
∙迁移双写之前的历史遗留数据。
∙将读请求切换到新系统。
∙下调双写逻辑,只写新系统。
服务代理模式常常应用到第3步,一般会对读请求切换设计一个开关,开关打开时查询新系统,开关关闭时查询老系统。