从 SOA 到微服务,企业分布式应用架构在云原生时代如何重塑?

阿里妹导读:从十余年前的各种分布式系统研发到现在的容器云,从支撑原有业务到孵化各个新业务,企业的发展离不开统一的、与时俱进的技术架构。本篇文章从企业分布式应用架构层面介绍了云原生计算架构带来的变化,希望能够帮助更多企业的 IT 转型,利用云计算技术推动其成为市场竞争中的敏捷力量。

进入 21 世纪以来,我们见证了企业分布式应用架构从 SOA (Service-oriented Architecture),到微服务架构,再到云原生应用架构的演化。

为了说明企业架构演化背后的思考,我们先谈一些玄学。

  • 第一,企业 IT 系统的复杂性(熵)符合热力学第二定律。随着时间的推演,业务的变化,企业 IT 系统的复杂度会越来越高;
  • 第二,在计算机交互设计中有一个著名的复杂性守恒定律[1]。应用交互的复杂性不会消失,只会换一种方式存在。这个原理也同样适用于软件架构。引入新的软件架构,不会降低IT系统的整体复杂性。

听到这里,是否让生命不息、折腾不止的我们感到一丝凉凉?

现代软件架构的核心任务之一就是定义基础设施与应用的边界,合理切分复杂性,减少应用开发者需要面对的复杂性。换句话说,就是让开发者专注在核心价值创新上,而把一些问题交给更合适的人和系统来解决。

我们就从下面这张图开始,探究企业分布式应用架构演进背后的逻辑。

蜕变之痛:SOA

2004 年,IBM 建立 SOA 全球设计中心,我作为研发 TL 和架构师参与了一系列全球客户的 pilot 项目,帮助 Pepboys, Office Depot 等国际企业利用 SOA 优化企业内部和企业间的业务流程,提升业务敏捷性。

当时的大背景是:随着经济全球化逐渐深入,企业面对的竞争加剧,商业变革也开始提速。在大型企业内部的 IT 系统已经经过了数十年的演化,整个的技术体系变得异常复杂,并存着诸如主机系统上的 CISC/COBOL 交易应用,小型机 AS400 中的 RPG 业务系统,和 X86/Power 等分布式系统的 C/JEE/.Net 应用。

大量应用系统由三方供应商提供,一些系统甚至已经无人维护。而且随着业务迭代,一些新的业务系统被持续构建出来,由于缺乏合理的方法论指导,系统之间缺乏有机的链接,形成了若干的孤岛,持续加剧了 IT 架构的复杂性,无法支撑业务的发展诉求。这就仿佛各派高手为了帮助受伤的令狐冲,把异种真气输入体中,虽然短时间可以缓解伤势。可是多道真气无法融合,互相激荡,长时间下来会伤上加伤。

因此,企业 IT 所面临的首要挑战就是整合企业中大量竖桶型(silo-ed)的 IT 系统,支撑日益复杂的业务流程,进行高效的业务决策和支撑业务快速变化。

在这种背景下,IBM 等公司提出了 SOA(面向服务的架构)理念,将应用系统抽象成一个个粗粒度的服务,构建松耦合服务架构,可以通过业务流程对服务进行灵活组合,提升企业 IT 资产复用,提高了系统的适应性、灵活性和扩展性,解决“信息孤岛”问题。

SOA 提出了一系列构建分布式系统的原则,这些思考直到今天也依然适用:

  • 服务具备明确定义的标准化的接口。通过服务定义描述,将服务消费者(Service Consumer)和服务提供者 (Service Provider) 的实现进行解耦,并且服务应该采用 contract-first 而非 code-first 方式进行开发。服务间通信采用面向文档的消息而非特定语言 RPC 协议,一方面可以解决服务与实现语言的解耦,另一方面可以灵活选择同步或者异步的通信实现,提升系统可用性和可伸缩性;
  • 服务应该是松耦合的,服务之间不应存在时间、空间、技术、团队上的依赖;
  • 服务应该是无状态的,使得服务调用与会话上下文状态实现解耦;
  • 服务应该是自治和自包含的,服务的实现是可以独立进行部署、版本控制、自我管理和恢复;
  • 服务是可发现、可组合的。比如可以通过 Service Registry 进行服务发现,实现了服务消费者和服务提供者的动态绑定。业务流程中可以对来自不同系统的的业务服务进行编排组装。

在初始构建 SOA 系统的时候,大多采用点对点的通信连接,服务调用和集成逻辑被内嵌在应用实现中。这种方式在服务数量比较少的时候,确实是一种简单和高效的开发方式。但其最大的问题是,随着服务规模的增长,服务之间通信愈发复杂,连接路径和复杂性会剧增,给服务治理带来巨大的挑战。

为了解决上述挑战,企业服务总线 (Enterprise Service Bus,ESB) 开始被引入。企业服务总线提供了服务之间的连接(connection),转换(transformantion), 以及中介处理(mediation)的能力。可以将企业内部和各种服务连接到服务总线上,实现信息系统之间的松耦合架构,屏蔽了系统集成的复杂性,提高了 IT 系统架构的灵活性,降低企业内部信息共享的成本。

SOA 方法论的目标就像易筋经可以帮助梳理、归聚不同的真气,融会贯通,为我所用。然而修炼过程却绝非易事。大量雄心勃勃的 SOA 项目并未取得预期的效果,其背后的原因是什么?

任何 IT 架构的成功,都离不开与业务目标、技术基础和组织能力的相互配合。

在业务上,当时 SOA 重点解决的是企业 IT 的存量市场的问题。这使得 SOA 方法论很大程度被窄化为 Enterprise Application Integration (EAI 企业应用集成)。

在 SOA 理念中,打通信息系统间的经络只是第一步,还需要勤修内功,持续重构迭代企业 IT 架构,这样才能保持企业 IT 架构的敏捷、柔性,持续支撑业务的发展和变化。

在组织结构上,由于当时在大部分企业的 IT 部门仍然是成本中心,是业务的附属支撑部门,大多数企业缺乏长远的 IT 战略规划,IT 团队也缺乏成长认同,SOA 沦为项目制运作而没有组织化保障和持续投入。

即使当时成功的项目也会在复杂性日积月累的侵蚀下,逐渐失去活力。去年在美国生活的朋友发过来照片,15 年前我们为客户构建的业务系统还在支撑其现有全国门店的业务。这是技术项目的成功,却反映了企业技术战略的缺失。

在技术上,ESB 架构虽然实现了业务逻辑与服务集成的解耦,可以更好地进行中央化的服务治理,也暴露出一些严肃问题:

  • 由于过度强调业务系统的可复用性,而不是对企业 IT 架构的治理和重构。大量服务集成的实现逻辑被下沉到 ESB 内部(如上图最右侧所示),这些逻辑非常难以维护,难以移植和扩展,成为 ESB 不可承受之重。我们必须在合适的地点合理地处理复杂性,而非将其简单转移;
  • ESB 基于一个中心化的消息处理系统,但随着互联网的高速发展,ESB 已经无法应对企业IT规模化成长的挑战;
  • ESB 这样的 Smart Pipes, Dumb endpoints 的系统架构是一个无法适应快速变化和大众创新的一个架构。

类比一下,电信运营商曾经希望将视频通信,电话会议等复杂功能纳入电信基础设施,只需一个 Dummy 电话终端就可以享受丰富的通信服务。然而随着智能电话的普及,微信和钉钉这样的分布式协同工具创新彻底颠覆了人们沟通交流的方式,而电信网络重回管道的宿命。

羽化之美:微服务

随着互联网的发展,尤其是移动互联时代的到来,整个世界的经济形态发生了巨大的变化改变。企业 IT 的重点从传统的 System of Record(交易系统,如 ERP、SCM 等)演化到 System of Engagement(互动系统,如全渠道营销)。

这些系统需要能够应对互联网规模的快速增长,并且能够快速迭代,低成本试错。企业 IT 已经成为创新驱动的引擎之一,技术拓展商业边界的理想也帮助 IT 团队更有使命感,进一步加速推动了企业 IT 的进化。

以 Netflix、阿里为首的一系列互联网公司主导了企业架构新的变革 - 微服务架构。Apache Dubbo, Spring Cloud 等微服务框架得到了广泛应用。

微服务的核心思想便是应用功能拆分与解耦,降低业务系统实现复杂性。微服务强调将应用功能拆解为一组松耦合服务,每个服务遵守单一责任原则(Single Responsibility Principle)。微服务架构解决了传统单体式架构存在的几个固有问题:每个服务可以独立部署和交付,大大提升了业务敏捷性;每个服务可以独立横向扩展/收缩,应对互联网规模的挑战。

原图来自于 Martin Fowler 对微服务架构的定义[3]

当然,将大型的单体应用拆解为多个微服务,也一定会增加 IT 系统研发协同、交付、运维的复杂性。这时候微服务架构与 DevOps 和容器自然走到了一起,构成了云原生应用架构的雏形。

微服务架构继承了 SOA 的架构原则,但是在实现层面,它倾向于通过构造智能端点和哑管道的去中心化分布式架构风格来替代 ESB。

微服务架构首先要面对分布式架构的内生复杂性,请参考分布式计算的误区[4]。微服务框架需要能够解决服务通信和服务治理的复杂性,比如服务发现、熔断、限流、全链路追踪等挑战。

微服务框架,如 HSF/Dubbo 或 Spring Cloud 以代码库的方式来封装这些能力。这些代码库被构建在应用程序本身中,随着应用一起发布和维护。

服务通信和治理本质是横向的系统级关注,是与业务逻辑正交的。但在微服务架构中,其实现方式和生命周期与业务逻辑耦合在一起的。

微服务框架的升级会导致整个服务应用的重新构建和部署。此外由于代码库通常与特定语言所绑定,难以支持企业应用的多语言(polyglot)实现。

进化之光:云原生

SOA 采用中心化的服务总线架构,解耦了业务逻辑和服务治理逻辑;微服务架构回归了去中心化的点对点调用方式,在提升敏捷性和可伸缩性的同时,也牺牲了业务逻辑和服务治理逻辑解耦所带来的灵活性。

为了解决上述挑战,社区提出了 Service Mesh(服务网格)架构。它重新将服务治理能力下沉到基础设施,在服务的消费者和提供者两侧以独立进程的方式部署。

这样既达到了去中心化的目的,保障了系统的可伸缩性;也实现了服务治理和业务逻辑的解耦,二者可以独立演进不相互干扰,提升了整体架构演进的灵活性。同时服务网格架构减少了对业务逻辑的侵入性,降低了多语言支持的复杂性。

Google, IBM,Lyft 主导发起的 Istio 项目就是服务网格架构的一个典型的实现,也成为了新的现象级“网红”项目。

 

上图是 Istio 的架构,逻辑上分为数据平面和控制平面:

  • 数据平面由一组以 sidecar 方式部署的智能代理组成,负责截获应用网络流量,收集遥测数据并且执行服务治理策略;
  • 控制平面中,Galley 负责配置管理,Pilot 负责下发配置,Mixer 负责策略检查和遥测数据聚合,Citadel 负责通信中安全证书管理。

Istio 提供了一系列高阶的服务治理能力,比如:服务发现和负载均衡,渐进式交付(灰度发布),混沌注入与分析,全链路追踪,零信任网络安全等,可以供上层业务系统将其编排到自己的 IT 架构和发布系统之中。

但是 Service Mesh 不是银弹,其架构选择是通过增加部署复杂性(sidecar)和损失性能(增加两跳),来换取架构的灵活性和系统的可演化性。

为了解决部署复杂性的挑战,社区和云服务商都在共同进行努力:

  • 一方面简化服务网格自动化运维水平(比如阿里云通过 operator 大大简化了 Istio的升级运维和跨 K8s 集群部署的复杂度);
  • 另一方面提供托管的服务网格服务,帮助用户关注在业务层面的服务治理而非基础架构实现。

关于性能问题:

  • 一方面 Service Mesh 需要降低自身控制平面和服务平面的性能开销,比如尽可能 offload mixer 负载,将治理策略执行下沉到数据平面完成;
  • 另一方面还需要重新思考整个通信栈中应用与网络基础设施的边界。

为了实现容器应用之间的互联互通,Kubernetes 社区提出 CNI 网络模型,将容器网络连通性与底层网络实现的进行解耦,同时 K8s 提供了 Service, Ingress, Network policy 等基本元语来支持应用层的服务通信和访问控制。但是这些能力远不能满足应用对服务治理的需求。

服务网格在 L4/L7 增加了流量管理、全链路可观测性、安全互联等新功能,这些是通过引入运行在用户空间的 Envoy 代理实现的,在提升灵活性的同时也不可避免地增加了性能开销。

为了系统化解决这个问题,社区在进行有趣的探索。比如在 Cillium 容器网络中,可以利用 eBPF/XDP 等操作系统和底层网络能力,将应用层的服务控制能力(如 Kube-Proxy 提供的 service, network policy)下沉到操作系统内核和网络层解决,并优化了 Service Mesh 数据链路,减少上下文切换和数据拷贝,有效地减少了性能开销。

目前 Service Mesh 技术还处在技术成熟度曲线的初期,除了在 L4/L7 层提供灵活的服务通信功能,社区也在探索通过网络 Service Mesh[6] 实现灵活的 L2/L3 组网能力。我们相信其会成为未来企业分布式应用通信基础设施。

在这个过程中会有一些新的理念和项目被持续创造出来,我们需要能够理性地分析其业务价值和技术局限性。我们要避免将 Service Mesh 作为万灵药,不要将应用集成、应用侧安全等业务逻辑下沉到服务网格中,避免我们重蹈复杂性覆辙。可以参考 Application Safety and Correctness Cannot Be Offloaded to Istio or Any Service Mesh[7]。

回望历史

天下大势,分久必合,合久必分。企业分布式应用架构也走过一条分分合合的进化道路。在新技术迭起的今天,我们既要拥抱新技术带来的架构变化,更加要关注其背后的演进逻辑和核心价值,系统化地控制复杂性。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些年,我们见过的 Java 服务端“问题”

导读 明代著名的心学集大成者王阳明先生在《传习录》中有云: 道无精粗,人之所见有精粗。如这一间房,人初进来,只见一个大规模如此。处久,便柱壁之类,一一看得明白。再久,如柱上有些文藻&#x…

中兴通讯uSmart云电脑,开启安全办公新时代

2020年春天,以5G、人工智能、云计算为代表的“新基建”蔚然成风,着眼国家数字经济体系建设,打造数字经济体系底座的“新基建”,无疑成为中国经济整体应对未来发展的核心方案。可以说,没有任何一个时期比现在更能够彰显…

阿里张磊:云计算生态价值点正迅速聚焦到“应用”上

导读:云原生不再只是基础设施的开发和运维人员的关注点,在应用交付领域小组成立之后,CNCF 基金会正在同应用开发和应用运维人员更紧密的联系在一起。 云原生的理念如今正如火如荼。它不仅仅是一种技术,更是社区基于对云的思考&…

SpringBoot 整合 Spring Cloud Alibaba Nacos 连通性+负载均衡

文章目录一、整合版本说明1. 毕业版本依赖关系(推荐使用)2. 组件版本关系3. 演示版本二、整合实战2.1. 聚合模块设计2.2. 创建聚合parent2.3. 依次创建子项目三、子模块配置3.1. 订单模块3.2. 产品模块3.3. 用户模块3.4. 扣库存模块3.5. 购物车模块四、测试案例4.1. 订单模块4.…

使用dubbo后尽量不用要@Service可能引起冲突

如下有几个包都含有Service dubbo最新版本2.7.8,已经把Service换成DubboService 示例实现类 package com.dubboprovider.service;import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Component;//zookeeper 服务注…

面试中遇到这 3 个SQL问题,最容易掉坑里!

作者 | Nathan R译者 | 天道酬勤,责编 | Carol封图 | CSDN下载自视觉中国在本文中,作者将介绍来自3个在技术面试中的真实的SQL问题,这些问题都是在实际公司进行技术筛选时提出的。最常见的读者问题:我应该如何准备SQL面试&#xf…

云原生数据库POLARDB专场“硬核”解析

POLARDB是阿里巴巴自主研发的云原生关系型数据库,目前兼容三种数据库引擎:MySQL、PostgreSQL、Oracle。POLARDB的计算能力最高可扩展至1000核以上,存储容量可达100TB。 POLARDB融合了商业数据库稳定、可靠、高性能的特征,同时具有…

K8s 从懵圈到熟练 – 集群网络详解

导读:阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案;另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似,不同的地方在于 terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。本…

使用dubbo后尽量不用要@Reference可能引起冲突

使用dubbo后尽量不用要Reference可能引起冲突 dubbo最新版本2.7.8,已经把Reference换成DubboReference

年薪高达30万,人才缺口40万,这个神仙职业今年太火了!

我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式&#xff0…

不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式

出身豪门、大厂背书的 Kubernetes 项目自 2014 年 6 月开源以来,在众多厂商和开源爱好者的共同努力下迅速崛起,时至今日已成长为容器管理领域的事实标准。凭借超前的设计理念、开放的参与门槛、国内外大厂和开发者的大力支持,它的成功不言而喻…

当我们在聊 Serverless 时你应该知道这些

作者 | 杨泽强(竹涧)阿里云技术专家 说起当前最火的技术,除了最新的区块链、AI,还有一个不得不提的概念是 Serverless。Serverless 作为一种新型的互联网架构,直接或间接推动了云计算的发展,从 AWS Lambda…

nacos集成dubbo实现远程服务调用

文章目录1. 模块划分设计2. 创建父工程3. 创建公共接口4. 服务端5. 客户端6. nacos7. 测试8. 码云开源地址1. 模块划分设计 模块名工程名端口父工程nacos-dubbo无服务端nacos-dubbo-provider9000消费端nacos-dubbo-consumer8000公共接口nacos-dubbo-interface无 2. 创建父工程…

如何在容器内高效编程?

作者 | Daniel Lemire译者 | 苏本如,责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN(ID:CSDNnews)以下为译文:我个人的编程环境中包括了一些服务器、笔记本电脑和台式电脑。我的服务器是在不同的时间购买和配置的&am…

(企业案例)Nacos Config 进阶使用

文章目录一、SpringBoot 使用 Nacos Config 实现多环境切换1. 现象2. 引入依赖3. 添加bootstrap.yaml配置文件4. 配置对应关系图5. 文件格式简述6. 启动nacos7. 添加生产配置8. 添加测试controller9. 启动Springboot工程并观察到如下日志则为成功10. 浏览器验证11. 调整激活环境…

OceanBase如何获得TPC-C测试第1名?

阿里妹导读:TPC-C是TPC组织(国际事务性能委员会)制定的关于商品销售的订单创建和订单支付等的基准测试标准,是数据库联机交易处理系统的权威基准测试标准。 蚂蚁金服自研的分布式关系数据库OceanBase获得TPC-C测试第一名后&#…

由一次磁盘告警引发的“血案”——你知道 du 和 ls 区别吗?

来源 | 程序猿石头责编 | Carol封图 | CSDN下载自视觉中国图来源于 SkyPixel知道为什么会有上面的结果吗?什么又是稀疏文件?这篇文章将为你揭秘。问题背景确切地说,不是收到的自动告警短信或者邮件告诉我某机器上的磁盘满了,而是某…

如何优化大规模推荐?下一代算法技术JTM来了

阿里妹导读:搜索,推荐和广告是互联网内容提供商进行价值创造的核心业务,在阿里巴巴的电子商务交易平台上,搜索,推荐和广告业务同样具有举足轻重的意义和价值。现在,阿里推荐技术又双叒优化了,新…

Sentinel 基于Nacos规则持久化-推模式

文章目录一、推模式架构图二、原理简述2.1. 组件版本关系2.2. 控制台推送规则三、Sentinel控制台改造3.1. 下载源码3.2. 修改pom3.3. 重要文件复制3.4. 注册地址修改3.5. 请求实例需改3.6. 菜单新增四、编译 & 启动4.1. 先启动nacos4.2. 编译打包4.3. 创建微服务 &&…

都听我的,会养猪种菜的工程师最帅了!

来了!今天,阿里数字农业事业部在黑龙江首次亮相,并且定了一个小目标:到2022年,阿里涉农产品全年网络销售额破4000亿元。 黑龙江省牡丹江市的阿里巴巴响水大米种植基地,又到了收割季 数字农业事业部将建立产…