第 2 章 世界是分布的

只需要问任何达人:现代的、分布式的系统已经到来,单体应用已经过时。

但是,不仅是达人,渐进的 IT 领袖,企业架构师,以及精明的开发者,在探寻和评估现代分布式应用的时候,也在呼应这些相同的想法。许多已经踏入。遵循这些特性、模式和分布式微服务应用程序的实践,他们正在设计新的,对现存的企业应用程序重平台化。

但是,变革带来很多问题......

  • 到底什么是分布式应用?
  • 为什么它变得流行?
  • 代价是什么?
  • 以及,更加重要的,折衷了什么?

为了开始,我们重新回顾过去的 15 年,在这段时间中,我们典型地以单体式构建应用程序。图 1-1 展示了其架构。

注意对于订单、身份和市场模块是如何运行在单个服务器进程中的。应用程序的数据保存在共享的数据库中。业务功能以 HTML 和 RESTful 接口的方式暴露出来。

从很多方面来说,单体应用是简单明了的,它简单在:

  • 构建
  • 测试
  • 部署
  • 错误定位
  • 纵向扩展

但是,单体架构会遇到明显的挑战

随着时间的演进,你会到达失去控制的一个点:

  • 单体应用变得无比复杂,以至于没有一个人可以完全理解它。
  • 你害怕做出变更,因为每次都会带来未预期的结果和昂贵的副作用
  • 新的特性/补丁在实现的时候变得耗时和代价高昂
  • 即使最小的变更也需要完全部署完整的应用程序,代价高昂且高风险
  • 单个不稳定的组件可以导致整个系统的崩溃
  • 增加新的技术和框架变得不可行
  • 难于实施敏捷交付方法论
  • 由于代码对于永无尽头的 "特例" 的劣化,导致架构腐化
  • 顾问总是告诉你重写系统

IT 实践者称这种情况为恐怖循环。如果你在任何技术公司的时间足够长,你就会有机会体验这一点。充满压力并耗尽你的 IT 预算。没有构建新的和创建方案,你的大多数预算都花费在维护遗留系统上。

与害怕相反,业务需要速度和敏捷。它寻求一种架构风格,可以迅速响应市场的变化。它需要即时更新并可以独立扩展运行的应用程序中的单个小的部分。

早期的达到速度和敏捷的尝试是面向服务的架构,或者说 SOA。在该模型下,服务的消费者和服务的提供者之间,通过中间件消息组件协作。通常称为企业消息总线,或者 ESB。图 1-2 展示了该架构。

对于 SOA,中心化的服务提供者使用 ESB 注册。业务逻辑构建到 ESB 中来集成提供者和消费者。服务消费者随后使用 ESB 来查找,与这些提供者进行通讯。

尽管 SOA 承诺,实现这种方式通常增加了复杂性,引入瓶颈。维护费用变高,ESB 中间件昂贵。服务趋向于更大。他们经常共享依赖和数据存储。最终,SOA 经常导致 "分布式的单体" 结构,使用中心化的服务抵抗变化。

如今,大多数的组织通过适配分布式的微服务架构方式来构建系统,以实现速度和敏捷。图 1-3 展示了使用分布式技术和实践构建的相同系统。

请注意同样的应用程序是如何解构为分布式的服务集合的。每个服务是自包含并封装了自己的代码,依赖。每个服务部署在单个的软件容器中,通过容器的协调器进行改成。与多个服务共享单个数据库相反,每个服务拥有私有的数据库。其它服务不能直接访问该数据库,只能通过该服务暴露的 public API 来获取数据。请注意有些微服务需要完全的关系数据库,但是,其它的是 NoSQL 数据存储。购物车服务在分布式的键值缓存中存储其状态。请注意入站的流量通过 API 网关服务进行路由。它负责对服务的直接访问和强制横切关注点。最重要的是,应用程序获得了现代云平台的扩展性、可用性、弹性的完全优势。

但是,虽然分布式的服务可以提供敏捷和速度,也带来了一系列的挑战,考虑下面列出的这些:

  • 分布式的服务如何发现其它服务,它们之间如何实现同步通讯?
  • 如何实现异步消息?
  • 如何在服务之间实现事务上下文的传递
  • 如何在失效的情况下支持弹性服务
  • 如何支持动态扩展以支持负载波动
  • 如何支持监控和处理过程的可观察

对于这些挑战中的每一个,许多产品都通常是可以提供的。但是,将你的应用程序与产品细节进行隔离,保持代码的可维护性并方便性也成为一个新挑战。

本书介绍 Dapr,Dapr 是分布式应用程序运行时。它直接面对伴随分布式应用程序而来的诸多挑战。展望未来,Dapr 有可能对分布式应用程序的开发产生深远影响。

总结

在本章中,我们讨论了适配分布式应用程序的问题。比较了单体系统方式与分布式服务。在考虑分布式方式的时候,我们指出了许多公共的挑战。

现在,坐下来,放松,让我们向您介绍 Dapr 的新世界。

Dapr-2: 世界是分布式的的更多相关文章

  1. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...

  2. Git是目前世界上最先进的分布式版本控制系统

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  3. Git是目前世界上最先进的分布式版本控制系统(没有之一)。

    http://zhidao.baidu.com/link?url=NSYPiSvtGTMoqMA9vt68FRRF8WbfYVmwWeMh47_2lkp0K3jFMl--1Co1tg1R4VshTQV ...

  4. Dapr实现分布式有状态服务的细节

    Dapr是为云上环境设计的跨语言, 事件驱动, 可以便捷的构建微服务的系统. balabala一堆, 有兴趣的小伙伴可以去了解一下. Dapr提供有状态和无状态的微服务. 大部分人都是做无状态服务(微 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式

    在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...

  6. Dapr中国社区活动之 分布式运行时开发者日 (2022.09.03)

    自2019年10月首次发布以来,Dapr(Distributed Application Runtime,分布式应用运行时)因其"更稳定"."更可靠".&quo ...

  7. 在 k8s 以外的分布式环境中使用 Dapr

    在Dapr 文档和实践案例中多是推荐采用k8s, 其实我目前也是在k8s 上操作的,有公有云TKE,AKS,还有私有云的Rancher ,它并没有传闻中的那么难,而且我认为它非常容易上手.不过,我还是 ...

  8. 手把手教你学Dapr - 1. .Net开发者的大时代

    Dapr全称 Distributed Application Runtime,分布式应用运行时 Dapr的口号 简化云原生应用开发,聚焦在应用的核心逻辑,让代码简单.可移植 Dapr的目标 最佳实践的 ...

  9. Dapr 能否取代 Spring Cloud?

    很多人都是使用SpringBoot 和 Spring Cloud来开发微服务.Dapr 也是开发微服务的框架,它和Spring Cloud有什么区别呢,其实这不是一个区别的问题,它是不同的时代需要不同 ...

  10. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

随机推荐

  1. vue 赶鸭子上架入门笔记(一) 安装开发环境

    准备接手一个 vue 的前端项目,从零开始学习 vue.目标不高大上,能看得懂代码,能进行简单的修改,改完能打包和部署. 首先解决 vue 开发环境的准备.访问 Node.js 官方网站,下载适合你操 ...

  2. CentOS7 控制台上安装运行 vmware workstation 备忘录

    目标平台 CentOS 7.5.1804 无桌面,要跑个 Ubuntu.vmx 1.安装依赖库 yum -y install perl gcc kernel-devel libX11 libXiner ...

  3. js 中什么情况下返回 undefined 值

    1. 声明变量没有赋值 <script> let num console.log(num) //undefined </script> 2. 访问不存在的属性 <scri ...

  4. python-requests模拟上传文件-带参数

    方法1: 1.安装requests_toolbelt依赖库 #代码实现def upload(self): login_token = self.token.loadTokenList() for to ...

  5. Oracle的用户如何优雅地达成软件合规目标

    企业一旦发展到了一定规模,就会衍生软件100%合规正版化的需求. 而对于使用到Oracle的用户,当然,具体核定的购买数量和off等商务问题,需要客户管理层直接和对应的Oracle销售代表进行商务谈判 ...

  6. CSS:Transform属性

    本文将深入探讨css动画中transform属性,这是一种强大的工具,可以实现元素的旋转.缩放.移动和倾斜等效果.本文将通过详细的解释和实际案例,帮助你掌握transform属性的使用方法来增强你的网 ...

  7. 枚举(C语言)

    1.枚举定义 枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读. 枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性. 定义一个枚 ...

  8. 『玩转Streamlit』--页面布局

    一个优秀的数据应用不仅仅是功能的强大,更在于其用户体验的打造. 而良好的页面布局,作为用户体验的重要组成部分,不仅能够提升信息的可读性,还能引导用户高效地完成操作. 反之,混乱的布局会让人感到困惑和挫 ...

  9. 登陆mysql,Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) "

    今天ssh到slave机器上,登陆mysql,遇到下图的报错. 查了一圈,最终解决办法简洁的出乎意料. 首先,要查看mysql服务是否已经启动(真的太容易漏掉) 第2步,你可能会自然而然的以为密码也是 ...

  10. 关于STL容器的简单总结

    关于STL容器的简单总结 转载自 1.结构体中重载运算符的示例 //结构体小于符号的重载 struct buf { int a,b; bool operator < (const buf& ...