热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2020:我们处在一个什么样的技术浪潮当中?

2020:我们处在一个什么样的技术浪潮当中?引子:云计算时代在软件架构领域,经历了从单体应用到SOA再到微服务ÿ
2020:我们处在一个什么样的技术浪潮当中?

引子:云计算时代

在软件架构领域,经历了从单体应用到 SOA 再到微服务;
在云计算领域,经历了从虚拟机到容器;
在数据库领域,从关系数据库到 NoSQL 再到 NewSQL;
在大数据领域,从批处理到流处理;
在运维领域,从手工运维到 DevOps、AIOps;
在前端领域,从 jQuery 到 React 等三大框架;
……
除此之外,还有一些新兴的领域如 AI、区块链等等,开启了一波又一波的风口。

单个去看这些领域的发展,会觉得纷繁杂乱没有头绪,但如果从整体上去看,会发现它们相互之间有联系,它们的发展源于一种共同的推动力,遵循着相似的逻辑。

云计算:从虚拟化到容器到 Serverless

2005 年亚马逊发布了 AWS,算是拉开了云计算的序幕。但是,在很长一段时间里云计算都没有兑现自己的“自动扩容、按使用付费”的宣传语。

云计算最重要的技术是分布式计算和分布式存储,分布式计算方面,最开始的技术是虚拟化,也就是所谓的“Software defined xxx”,通过对计算 / 存储和网络资源的虚拟化,同时能够给用户任意分配资源。但这里面一开始做的最好的只有文件存储这一块,AWS S3 及类似的对象存储产品给人们带来了云时代的一些实际的体验,但云服务器则还是走回了卖服务器的老路。

2014 年 AWS 推出 Lambda 服务,Serverless 开始成为热词,从理论上说,Serverless 可以做到 NoOps、自动扩容和按使用付费,也被视为云计算的未来。但是,Serverless 本身有一些问题,比如难以解决的冷启动性能问题,因此,围绕 Serverless 的研发,以及将 Serverless 和容器技术融合也是当前的前沿课题。

Serverless 是我们过去 25 年来在 SaaS 中走的最后一步,因为我们已经渐渐将越来越多的职责交给了服务提供商。
——Joe Emison 《为什么 Serverless 比其他软件开发方法更具优势》

架构:微服务、Service Mesh 和 Serverless

云计算为应用打造了分布式的基础设施,但是,如果应用还是以传统的单体应用的思路开发,则云计算意义并不大。

这些年里,软件架构逐渐从 SOA 进化到微服务,很多人认为微服务是一种细粒度的 SOA,在去掉了 SOA 中的 ESB 之后,微服务变得更加灵活、性能更强。但是,实施微服务需要一些前提。

Martin Fowler 曾经总结过微服务实施的前提包括:

计算资源的快速分配
基本的监控
快速部署
这基本就是 Kubernetes 所起到的主要作用,虽然如 Spring Cloud、Dubbo 微服务框架在各方面已经非常完善,但随着云原生计算基金会的壮大,基于 Kubernetes 的微服务在社区中的热度越来越高,也开始有很多公司开始利用这一套技术栈来构建微服务。

到 2016 年,Service Mesh 开始引起社区的注意,Kubernetes 加上 Service Mesh,再加上 CNCF 的一些开源项目,基于 k8s 的微服务技术栈基本就完善了。2018 年 Istio 1.0 发布,更是为这股浪潮加了一把火,未来的微服务将是 k8s 和 Service Mesh 的天下。

从 SOA 到微服务是一个服务粒度逐渐拆分得更小的过程,FaaS 里的 Function 可以视为更小的、原子化的服务,它天然的契合微服务里面的一些理念。

Serverlless 无服务器架构


  • 简史

    • Ken Form,2012

      • 《Why The Future of Software and Apps is Serverless》
    • AWS Lambda, 2014

      • 不需要在服务器上持续运行进程以等待HTTP请求或API调用,而是可以通过某种事件机制触发代码的执行,通常这只需要在AWS的某台服务器上配置一个简单的功能。
  • “无服务器架构是基于互联网的系统,其中应用开发不使用常规的服务进程。相反,它们仅依赖于第三方服务(例如AWS Lambda服务),客户端逻辑和服务托管远程过程调用的组合。”

  • 解决的问题

    • 帮助开发者摆脱运行后端应用程序所需的服务器设备的设置和管理工作。
    • 让开发人员关注代码的运行而不需要管理任何的基础设施。
  • 解决方案

    • 第三方云计算供应商负责后端基础结构的维护,以服务的方式为开发者提供所需功能,例如数据库、消息,以及身份验证等。
  • 案例

    • AWS Lambda

      • 通过事件驱动的方法去触发对函数的调用
    • Serverless架构服务的供应商

      • Google Cloud Functions
      • Microsoft Azure Functions
      • IBM OpenWhisk
  • Serverless架构的优点

    • 降低运营成本

      • 基础设施的成本和人员(运营/开发)的成本。
    • 降低开发成本

      • 整个应用程序组件被商品化
      • IaaS和PaaS存在的前提是,服务器和操作系统管理可以商品化
    • 自动扩展

      • 横向扩展是完全自动的、有弹性的、且由服务提供者所管理
    • 计算资源充分利用

      • 按照《福布斯》杂志的统计,在商业和企业数据中心的典型服务器仅提供5%~15%的平均最大处理能力的输出。这无疑是一种资源的巨大浪费。随着Serverless架构的出现,让服务提供商提供我们的计算能力最大限度满足实时需求。这将使我们更有效地利用计算资源。

从IaaS到FaaS


函数服务化: Function as a Services(FaaS)


  • “函数”(Function)提供的是相比微服务更加细小的程序单元
  • “大部分PaaS应用无法针对每个请求启动和停止整个应用程序,而FaaS平台生来就是为了实现这样的目的。”
  • FaaS和PaaS在运维方面最大的差异在于缩放能力。
  • “如果你的PaaS能够有效地在20毫秒内启动实例并运行半秒,那么就可以称之为Serverless”。

PaaS


  • 平台即服务(Platform as a Service)是一种云计算服务,提供运算平台与解决方案堆栈即服务。在云计算的典型层级中,平台即服务层介于软件即服务与基础设施即服务之间。 平台即服务提供用户能将云基础设施部署与创建至客户端,或者借此获得使用编程语言、程序库与服务。用户不需要管理与控制云基础设施,包含网络、服务器、操作系统或存储,但需要控制上层的应用程序部署与应用托管的环境。

FaaS框架


  • Fission

    • 一款基于Kubernetes的FaaS框架
    • 通过Fission可以轻而易举地将函数发布成HTTP服务。
    • Kubernetes提供了强大的弹性编排系统,并且拥有易于理解的后端API和不断发展壮大的社区。所以Fission将容器编排功能交给了K8s,让自己专注于FaaS的特性。

数据库:从 NoSQL 到 NewSQL


NoSQL


  • 2009 年 MongoDB 开源,掀开了 NoSQL 的序幕,一时之间 NoSQL 的概念受人追捧,MongoDB 也因为其易用性迅速在社区普及。NoSQL 抛弃了传统关系数据库中的事务和数据一致性,从而在性能上取得了极大提升,并且天然支持分布式集群。

NewSQL


  • 然而,不支持事务始终是 NoSQL 的痛点,让它无法在关键系统中使用。2012 年,Google 发布了 Spanner 论文,从此既支持分布式又支持事务的数据库逐渐诞生,以 TiDB、蟑螂数据库等为代表的 NewSQL 身兼传统关系数据库和 NoSQL 的优点,开始崭露头角。

  • Amazon Aurora

    • 基于新型 NVME SSD 虚拟存储层的 Aurora,它实现了完全兼容 MySQL(甚至连 bug 都兼容)的超大单机数据库,同时在性能上高出 5 倍以上。

大数据:从批处理到流处理


大数据时代


  • Google 在 03-06 年发布了关于 GFS、BigTable、MapReduce 的三篇论文,开启了大数据时代。

  • 以 HDFS/HBase/MapReduce 为主的 Hadoop 技术栈

  • Spark

    • 大数据处理引擎
  • Storm

  • Flink

    • Apache Flink 已经被业界公认是最好的流计算引擎。然而 Flink 的计算能力不仅仅局限于做流处理。Apache Flink 的定位是一套兼具流、批、机器学习等多种计算功能的大数据引擎

运维:从手工运维到 DevOps

DevOps 的出现,运维的身份职责发生了转变,它不再是专门跑任务脚本或者与机器打交道的人,而是变成了 OpenStack 或者 Kubernetes 的专家,通过搭建 / 管理相关的分布式集群,为研发提供可靠的应用运行环境。

DevOps 更重要的方面还是改变了应用交付的流程,从传统的搭火车模式走向持续交付,应用的架构和形态改变了,其方法论也随之而改变。DevOps 和持续交付也被认为是云原生应用的要素。

至于 AIOps 是 DevOps 在实践 AI 过程中的一些应用,称不上是范式的改变,AI 在运维领域还远远取代不了人的作用。

前端:前后端分离

2008 年 Nodejs 的出现彻底激发了前端的生态,将 Javascript 的疆域拓展到服务端和桌面,最终催生出大前端的概念。

如果纯粹看传统的前端开发的变化,不仅主流技术从 jQuery 转移到三大框架,更重要的是 SPA 和前后端分离的出现。

SPA 代表着前端的应用化,也就意味着胖客户端,部分业务逻辑可以从服务端转移到客户端完成。前后端分离更是将前端从后端独立出来,划定了领域边界。后端对前端来说,成为了数据层,只要接口能够正确返回数据,前端并不关心后端是如何做到的。

事实上,胖客户端的转变正好与后端的进化方向吻合。无论是微服务还是 Serverless,都强调无状态,这意味着你不应该用后端去生成有状态的 UI,而是让客户端自行处理状态。

为了应对越来越大型的客户端代码,前端发展出的技术包括 TypeScript、Redux/MobX、WebAssembly、WebWorker 等

AI:互联网的新基础设施

现代的 AI 是基于大数据和机器学习的,在很多公司里大数据和 AI 属于同一个数据科学的团队。在过去两年,AI 已经用各方面的成绩证明它可以成为整个互联网的基础设施之一,帮助让我们的互联网更加的智能化。

感知层的 AI


  • 计算机视觉

    • 人脸识别、物体检测、运动检测
  • NLP


深度学习发展并没有想象的快。


区块链:不确定性

一方面是公链上一些痛点解决方案的探索和突破。包括比 POW 更好的共识机制、并发交易性能、数据存储和处理、跨链交易等等。当然,问题还远远没有得到解决。由于利益牵扯太多,这一领域也没有公认的主流解决方案。

另一方面是联盟链的逐渐成熟,其中代表技术为超级账本,一部分早期采用者在探索联盟链的适用场景,一部分则是做起卖水的生意,推出 BlockChain as a Service。

物联网与边缘计算

从互联网到移动互联网,是一个不断扩张的过程,不但终端节点大量增加,而且每时每刻都在线,如果将这个逻辑延伸一下就是物联网了,终端从智能手机变成任何可联网的设备。

技术的本质与技术发展的逻辑

技术在不断的推陈出新,令人眼花缭乱,但如果抓住了这些技术的本质,会发现太阳底下并没有新鲜事。

如果将上面的各个领域的重要技术变革提炼一下,会发现其中的一些有共同点:

  • 虚拟化:将硬件资源虚拟为软件资源,然后进行统一调度和管理。
  • 隔离:从虚拟机到容器,再到虚拟机与容器融合,隔离的技术定义了云的形态。
  • 解耦:无论是后端的微服务、前端的前后端分离、组件化等等,都是将关注点分离,解耦合的过程。
  • 编排:大量不同的服务、任务,让他们组成一个整体,相互间能良好的协作。
  • 智能化:让服务个性化,或者让自动化替代以前需要人工完成的事情。
  • 实时化:计算和处理在极短时间内完成,从而实时的给予反馈。

当然,其中会有一些遗漏,或者有些你并不认同,但我想表达的是,这些技术存在一些共同的本质,它们是不同的领域技术发展的共同逻辑。

软件进步的源头


  • 软件并不是凭空发展起来的,它必须要运行在各种硬件上,软件的发展,也离不开硬件的支持。
  • 或者说,正是硬件的不断升级和变革,支撑了软件的发展进步。云计算的诞生,正是源于大型机已经无法支撑高并发,才让人们转而采用一般硬件和虚拟化、分布式的软件技术。
  • 软件的颠覆式创新,一定是在硬件支持的基础上,随着现有的软件架构对现有硬件能力的挖掘,再发生颠覆的可能性已经较小了。
  • 软件厂商反过来驱动硬件的进步,谷歌、阿里、华为等都开始自研用于云和终端的芯片。

软件运行需要的三大资源


  • 计算:AI 对于计算的特殊需求,催生了相关芯片的研发。而更多非通用性芯片将推动物联网和边缘计算的发展。而在远处忽隐忽现的量子计算,一旦能普及,也必将产生颠覆。
  • 存储:Nano Flash 类非易失性存储还有提升的空间,在云和端的利用也没有普及。如果非易失性存储能在内存领域有所突破,对于软件架构必将带来另一次颠覆。
  • 网络:网络方面,WiFi 技术即将进入第六代,带来拥挤场合的大幅性能提升;蓝牙进入第五代,连接距离将提升至 300 米;更重要的则是 5G,相较于 4G 数百倍的数据传输速度和低至几毫秒的延时,让很多应用都有了更大的想象空间。



Kotlin 开发者社区

国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。


推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文介绍了在 Spring Boot 中使用 JPA 进行数据删除操作时遇到的 SQL 错误及其解决方法。错误表现为:删除操作失败,原因是无法打开 JPA EntityManager 以进行事务处理。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在尝试将 mysqldump 文件加载到新的 MySQL 服务器时,遇到因使用保留关键字 'table' 导致的语法错误。 ... [详细]
  • 本文详细介绍了如何将Spring框架与Hibernate ORM框架进行集成,包括配置文件的设置和数据持久化操作的实现。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
author-avatar
dtd3795290
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有