随着云计算的快速发展,数据中心网络架构正面临着深刻的变革。云原生网络作为一种新的网络架构模式,正在成为数据中心网络发展的必然趋势。
云原生网络是指基于云计算理念和技术构建的网络架构。它具有以下主要特征:
云原生网络相对于传统网络架构具有以下优势:
目前,许多企业和组织已经开始采用云原生网络架构,以满足其不断增长的业务需求。以下是一些云原生网络的成功案例:
云原生网络作为一种新兴的网络架构模式,正在不断演进。以下是一些云原生网络的未来趋势:
云原生网络作为数据中心网络架构的未来,正在重塑网络管理和运维的方式。它通过自动化、可扩展性、可编程性和云原生集成,为企业和组织提供了敏捷、高效和安全的网络解决方案。随着云计算和云原生技术的不断发展,云原生网络将在数据中心网络领域扮演越来越重要的角色。
云原生是一个组合词,“云”表示应用程序运行于分布式云环境中,“原生”表示应用程序在设计之初就充分考虑到了云平台的弹性和分布式特性,就是为云设计的。云原生并不是简单地使用云平台运行现有的应用程序,它是一种能充分利用云计算优势对应用程序进行设计、实现、部署、交付和操作的应用架构方法。
云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统做出频繁和可预测的重大变更。
云原生的四要素
微服务是架构
微服务是云原生的核心特征,就是把程序单体进行切分,划分为多个细粒度的服务。将一个大的服务不断拆分成子服务甚至微服务,让每个微服务只聚焦解决好一个子问题,那么边界清晰、决策容易、快速开发的业务敏捷性就体现出来了。
容器化是载体
容器化为微服务提供实施保障,一个容器就装载着一个服务镜像,实际上容器的最重要的作用也是起到应用隔离作用。Docker是应用最为广泛的容器引擎,在思科谷歌等公司的基础设施中大量使用,是基于LXC技术搞的,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡
DevOps是思维,持续交付是打法
DevOps,对应着develop(开发)和operation(运维),为云原生提供持续交付能力。而持续交付,意味着轻量与灵活,他不误时开发,不停机更新,就像小步快跑一样。
云原生计算加速了应用与基础设施资源之间的解耦,通过定义开放标准,向下封装资源,将复杂性下沉到基础设施层;向上支撑应用,让开发者更关注业务价值。此外,云原生计算提供统一的技术栈,动态、混合、分布式的云原生环境将成为新常态。
总而言之,符合云原生架构的应用程序应该是:采用开源堆栈进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。
云原生应用并未完全颠覆传统的应用,采用云原生的设计模式可以优化和改进传统应用模式,使应用更加适合在云平台上运行。简单来说,云原生就是利用云的优势来更快地处理企业业务并降低IT成本,目标就是根据需求快速、敏捷地向用户交付软件产品。基于云原生技术带给企业的应用开发的技术价值,可以大幅降低企业IT开发和运维成本,从而提升企业业务的创新效率和产业价值。
随着云计算时代的演进,一种全新的网络架构——云原生网络功能(CNF)崭露头角,它颠覆了传统的软件定义网络(SDN)理念。CNF将网络功能分解为可独立部署的服务,融入了云原生的开放、敏捷与可扩展性。它的核心理念在于网络层的弹性、自动化配置和声明式管理,尤其是在OSI模型的底层,致力于降低复杂度,提高效率。
Ed Warnicke在Mesh项目的洞察中,强调了数据包在网络服务中的核心地位。在云原生应用中,CNF整合了多维度的网络服务,例如CoreDNS、NFF和Envoy,共同构建起网络服务的生态网。CNF的出现,推动了网络技术的成熟,从粗犷的部署模式升级到支持高级特性,如遥测、服务发现和策略管理。CNF的独特之处在于它的数据平面,它成功地解耦了转发和硬件,探索了诸如VPP和eBPF这样的前沿技术。在云原生数据中心中,三层网络架构被优化,Kubernetes的网络模型自动分配IP地址,赋予网络部署更高的灵活性和可扩展性,满足了电信行业的严苛需求,同时也推动了供应商向更云原生的模式转变。
然而,实现云原生网络功能的成熟解决方案并非易事,尤其是在性能需求高的组件解耦方面。CNF的数据平面研究成为关键,它扩展了我们对CNF的理解,揭示了网络软件解耦的无限可能。通过聚焦核心网络和基础架构,云原生数据中心的网络简化得以实现,但可能并不适用于所有场景。对CNF的持续优化将带来部署效率的提升,以及部署弹性和可配置性的显著增强。
想要深入了解这个前沿领域,不妨加入Cloud Native computing Foundation(CNCF)的CNF工作小组,关注于2022年的服务网格峰会,那里会有更深入的探讨和实践案例,尽管具体的注册链接已不再赘述,但你只需稍作搜索,便能找到参与的入口。
云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。
云原生是一种新型技术体系,是云计算未来的发展方向。
而分布式云是浪潮云的一种云计算服务,即云服务提供商管(Cloud Service Provider,CSP)将公有云服务分发到不同的物理位置,由CSP统一负责云服务的运营、治理、更新和演进。
云原生的相关特点:
云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。
云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。
云原生这个词汇由来已久,云原生开始大规模出现在受众视线中,与Pivotal(已被VMvare收购)提出的云原生应用的理念有着莫大的关系。我们现在谈到云原生,不仅仅是指一些具体的技术,更多指的是一套方法论和技术体系的集合,是一种文化。云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。
未来,云原生将和算力网络紧密结合,应用不需要了解所需算力的大小、所在资源池、所需网络带宽等,仅需关注业务需求,资源、调度地点、网络需求等自动实现成本最优化,实现算力和网络的融合智能编排,最终达到算网原生。
云原生的发展
Pivotal公司的Matt Stine于2013年首次提出云原生(Cloud Native)的概念,并在2015年《迁移到云原生应用架构》一书中定义了符合云原生架构的几个特征。到了2017年,Pivotal又在其官网上将云原生的定义概况为DevOps、持续交付、微服务、容器这四大特征,这也成了很多人对Cloud Native的基础印象。
2015年,Linux基金会发起了云原生计算基金会,CNCF基金会的成立标志着云原生正式进入高速发展轨道,Google、Cisco、Docker各大厂纷纷加入,逐步构建出围绕Cloud Native的具体工具,而云原生的概念也逐渐变得更具体化。
云原生不仅仅是一套技术体系,究其本质,凡是能够提高云上资源利用率和应用交付效率的行为或方式都是云原生的,是一套符合云计算发展趋势的应用设计理念的方法论。
云计算最近几年已经火得不行, 云原生 (Cloud Native)这个概念又来了,如果上云不“原生”,那就等于白上云。究竟什么是云原生?云原生有何优势?怎么从“不原生”一步一步做到云原生?本文将给出切实可行的云原生落地指南。
我们先从云计算说起 。在云计算普及之前,一个应用想要发布到互联网,就需要企业自己先买几台服务器,找一个IDC机房,租几个机架,把服务器放进去。接下来就是装Linux系统,部署应用。我们就假定用Java写了Web应用,怎么部署上去呢?先配置Tomcat服务器,在把编译好的war包上传到服务器,有用FTP的,安全意识高一点的会选SCP,然后配置Nginx、MySQL这些服务,最后一通调试,把应用跑起来,就算齐活。
这种物理机配合自搭网络环境、自搭Linux、自配环境的方式,有很多缺点,但最主要的问题有这么几个:
解决方案是上云 。上云不能解决所有问题,但部分解决了前两个问题:
但是如果仅仅满足上云,把物理机换成虚拟机,把物理网换成虚拟专用网(VPC),是远远不够的。这些是计算资源和网络资源层面的简化。应用方面,如果延续旧的一套开发、测试、部署流程,做不到快速迭代。
要做到快速迭代,敏捷开发,就需要DevOps,即开发运维由一个团队负责,开发阶段,就要把部署、运维的工作考虑进去,而不是发布一个war包或者jar包后扔给运维不管了。
重开发、轻部署,直接后果就是缺少自动化发布流程。想要把部署规范化,就需要整体考虑一系列问题。
还是以Java应用为例,如果是手动部署,那么就上传war包到服务器,覆盖原有的版本,重启Tomcat,再测试。如果发现有严重问题要回滚怎么办?把老版本再传一遍,然后重启Tomcat。
手动部署,每次部署都是一次生死考验,所以最好不要安排在半夜,以免手抖敲错了命令,本来中断10分钟的服务,变成了灾备恢复,中断3天。
稍微靠谱一点的是写脚本部署,但各家写出来的脚本都有各家特色,不通用,不易维护,所以更好的方式是用成熟的部署方案,比如Ansible,把脚本标准化,比如做成蓝绿发布,把服务器分组,比如A、B两组,先把流量切到B组,升级A组服务器,有问题就回滚,没问题了,再把流量切到A组,升级B组服务器,最后,恢复正常流量,整个部署完成。
但是回滚这个事情,远没有那么简单。做过开发的同学都知道,升级新版本,一般要加配置,改配置,如果回滚到旧版本,忘了把配置改回去,那旧版本可能也不能正常工作。
上云,除了物理变虚拟,简化运维外,最重要的特点——弹性计算,一定要充分利用。
理论指导实践,实践完善理论。如果我们分析大多数基于互联网的应用,可以看到,一个应用,通常用到的资源如下:
上云后,云服务商通常都提供托管的数据库,以及大规模存储系统(S3),可解决存储资源问题。通过云服务商提供的负载均衡(Load Balancer),也无需自行部署Nginx等网关,免去了运维的问题。各种标准的业务组件如Redis、Kafka等,均可直接租用云服务商提供的资源。
我们重点讨论计算资源,也就是云上的虚拟机资源。对于应用来说,可以设计成有状态和无状态两种。一个应用在一台虚拟机内跑着,如果有本地文件的修改,它就是有状态的。有状态的应用既不利于扩展,也不利于部署。反过来,如果一个应用在运行期数据总是存在数据库或者缓存集群,本地文件无任何修改,它就是无状态的。
无状态的应用对应的虚拟机实际上就是不变的计算资源。这里的“不变”非常重要,它是指,一台虚拟机通过一个固定的镜像(预先内置好必要的支持环境,如JRE等)启动后,部署一个应用(对应一个war包或者jar包),该虚拟机状态就不再变化了,直接运行到销毁。
有的同学会问:如果给这台虚拟机重新部署一个新的应用版本,它的状态不就发生了变化?
确实如此。为了确保虚拟机的不变性,一旦启动后部署了某个版本,就不允许再重新部署。这样一来,对虚拟机这种计算资源来说,就具有了不变性。不变性意味着某个虚拟机上的应用版本是确定的,与之打包的配置文件是确定的,不存在今天是版本1,明天变成版本2,后天回滚到版本1的情况。
计算资源不变,能确保启动一台虚拟机,对应发布的应用版本和配置是确定的且不变的,对于运维、排错非常重要。
那么如何在保持计算资源不变的前提下发布新版本?
我们以AWS的CodeDeploy服务为例,假设一组正在运行的某应用v1集群包含3台虚拟机:
现在,我们要把应用从v1升级到v2,绝不能直接把现有的3台虚拟机的应用直接升级,而是由CodeDeploy服务启动3台新的一模一样的虚拟机,只是部署的应用是v2。现在,一共有6台虚拟机,其中3台运行v1版本,另外3台运行v2版本,但此刻负载均衡控制的网络流量仍然导向v1集群,用户感受不到任何变化:
v2集群部署成功后,做一些自动化冒烟测试和内网测试,如果有问题,直接销毁,相当于本次部署失败,但无需回滚。如果没有问题,通过负载均衡把流量从v1集群切到v2,用户可无感知地直接访问v2版本:
稳定一段时间(例如15分钟)后,销毁v1集群。至此,整个升级完成。
上述的蓝绿部署就是CodeDeploy的一种标准部署流程。CodeDeploy也支持灰度发布,适用于更大规模的应用。
把计算资源不可变应用到部署上,实际上是充分利用了弹性计算这个优势,短时间创建和销毁虚拟机,只有上云才能做到,并且针对云计算,把部署流程变得更加简单可靠,每天发几个版本甚至几十、几百个版本都变得可能,DevOps能落地,有点“云原生”的味道了。
说到AWS的CodeDeploy,最早我使用AWS时,对于它的计费采用Reserved Instance预付模型感到很不理解,租用一台虚拟机,按国内阿里云、腾讯云包年包月预付享折扣不是更直观吗?如果仅仅把上云变成租用虚拟机,那就完全丧失了弹性计算的优势,相当于租用了一台虚拟机在里面自己折腾。AWS的Reserved Instance计费并不绑定某一台虚拟机,而是一种规格的虚拟机。
我们还是举例说明,如果我们有1台2v4G规格的虚拟机,并购买了1年的Reserved Instance,那么,我随时可以销毁这台虚拟机,并重新创建一台同样规格的新的虚拟机,Reserved Instance计费会自动匹配到新的虚拟机上,这样才能实现计算资源不变,频繁实施蓝绿部署,真正把部署变成一种云服务。最近阿里云终于推出了节省计划的付费模式,有点真正的云计算的付费味道了,但是腾讯云、华为云还停留在包年包月和按量付费这两种原始租赁模型。
讲了这么多自动化部署,实际上一个指导思想就是如何充分利用云的弹性计算资源。从充分利用云的弹性资源为出发点,设计一整套开发、部署、测试的流程,就是云原生。弹性资源利用得越充分,云原生的“浓度”就越高,就越容易实施小步快跑的快速迭代。
那么虚拟机是不是弹性最好的计算资源呢?从应用的角度看,显然容器是一种比虚拟机更具弹性,更加抽象,也更容易部署的计算资源。
容器和虚拟机相比,它实际上是一种资源隔离的进程,运行在容器中的应用比独占一个虚拟机消耗的资源更少,启动速度更快。此外,容器的镜像包含了完整的运行时环境,部署的时候,无需考虑任何额外的组件,比其他任何部署方式都简单。使用容器,开发部署流程就变成了开发,生成镜像,推送至Docker Hub或云服务商提供的Registry,直接启动容器,整个过程大大简化。
使用容器比使用CodeDeploy部署还要更加简单,因为CodeDeploy需要在虚拟机镜像中预置Agent,由于没有统一的发布标准,还需要配置CodeDeploy,告诉它去哪拉取最新版本,这又涉及到一系列权限配置。而容器作为标准的部署方案,连发布系统都以Registry对各个镜像版本进行了有效管理,所以部署非常简单。
容器作为一种弹性计算资源,也应遵循计算不变性,即不要给容器挂载可变的存储卷。一组不变的容器集群才能更容易地升级。容器的运行方式本身就遵循了不变性原则,因为通过一个镜像启动一个容器,在运行过程中,是不可能换一个镜像的。容器本身也强烈不建议应用写入数据到文件系统,因为重启后这些修改将全部丢失。
容器的启动和销毁非常容易,不过,容器的管理却并不简单。容器的管理涉及到创建、调度、弹性扩容、负载均衡、故障检测等等,Kubernetes作为事实上的容器编排标准平台,已经成为各个云服务商的标配。
如果要直接使用K8s,在云环境中首先要有一组虚拟机资源作为底层资源,然后搭建K8s环境,定义好容器编排并启动容器。云服务商几乎都提供托管的K8s服务,但直接管理K8s仍然需要非常熟悉K8s的工程师。
还有一种更简单的使用容器的方式,即完全将底层虚拟机和K8s托管给云服务商,企业客户只需关心如何部署容器,底层的K8s和虚拟机对企业不可见或者无需关心。AWS的Elastic Container和阿里云的弹性容器均为此类服务。对于中小规模的应用来说,计算资源直接使用容器,再配合云服务商提供的负载均衡,托管的数据库、消息系统、日志系统等组件服务,应该是目前最“云原生”的一种方案。
最后,我们总结一下云原生的特点:
所谓云原生,就是在上云的过程中,充分发挥云平台的弹性计算、弹性存储的优势,尽量把应用设计成适合云计算的架构,把部署设计成简单易用的流程,这样才能实现业务快速上线,快速迭代。
云原生是一个大方向,在上云的过程中,逐步改造应用架构和部署流程,从手动往自动转,逐步增加计算资源的弹性,就能把云原生一步步落地。
云原生技术使企业/组织能够在公共、私有和混合云等现代动态环境中,构建和运行可扩展的应用程序。容器、服务网格、微服务、不可变基础设施和声明式 API 就是这种方法的例证。
这些技术支持具有弹性、可管理和可观察的松散耦合系统。结合强大的自动化,它们使工程师能够以最少的工作频繁且可预测地进行高影响力的更改。
云原生技术以微服务、DevOps、容器、多云业务管理为代表,目前已经成为了加速企业数字化业务高效创新、实现企业数字化转型的最佳技术支撑。
微服务实现了软件的模块化、组件化、共享化,实现了开发团队的独立化、小型化和协同化,为数 字化应用研发创新更敏捷、更高效打下了坚实的基础。
DevOps 实现了软件研运过程标准统一,强化应用研发运营全周期的管理、打破部门壁垒,从应用 需求到生产运维的全流程改进和优化,结合统一工具链,实现文化、流程、工具的一致性,提升数 字化应用创新整体协同效率,提升软件交付效率。
容器技术实现了应用与资源的解耦和应用交付件的标准化,有效解决了异构环境的部署一致性问 题,促进了资源的标准化,为面向应用的服务化、自动化提供了基础。标准容器化的打包方式实现 了真正的应用可移植性,不再受限于特定的基础架构环境。
多云业务管理实现在私有云模式、混合云模式、多云模式下应用的部署、跨云迁移、应用运维和治 理,满足企业多样化 IT 资源需求,同时避免企业被云服务商绑定,实现自主可控。多云业务管理 同时可实现云端+边缘设备的应用一体化交付和管理。
云原生景观图
截图只是部分,网络搜索会有完整景观图。
云原生是一个组合词,可以拆分为“云”和“原生”两个词,“云”我们都知道,即在线网络,传统的应用原本都跑在本地服务器上,很有可能需要停机更新,且无法动态扩展,“云”表示应用程序运行在分布式的云环境中,可以频繁变更,持续交付。 “原生”表示应用程序在设计前期就考虑到了云平台的弹性和分布式特性,也就是为云设计的。 可以简单理解为:云原生=微服务+DevOps+持续交付+容器化| 微服务 |即软件架构,使用微服务架构可以将一个大型的应用程序按照功能模块拆分成多个独立自治的微服务,每个微服务仅仅实现一种功能,具有很明确的边界。 带来的好处有哪些?1)服务的独立部署每个服务都是独立的项目,可以独立部署,不依赖于其他服务,耦合性低。 2)服务的快速启动拆分之后服务启动的速度要比拆分之前快很多,因为依赖的库少了,代码量也少了。 3)更加适合敏捷开发。 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。 服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。 4)职责专一,由专门的团队负责专门的服务。 业务发展迅速时,研发人员也会越来越多,每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。 5)服务可以动态按需扩容当某个服务的访问量较大时,我们只需要将这个服务扩容即可。 6)代码的复用每个服务都提供REST API,所有的基础服务都必须抽出来,很多的底层实现都可以以接口方式提供。 | 容器化 |是云原生的核心技术,它是一种相对于虚拟机来说更加轻量的虚拟化技术。 能为我们提供一种可移植、可重用的方式来打包、分发和运行程序。 容器的基本思想就是将需要执行的所有软件打包到一个可执行程序包。 例如,将一个Java虚拟机、Tomcat服务器以及应用程序本身打包进一个容器镜像。 用户可以在基础设施环境中使用这个容器镜像启动容器并运行应用程序。 而Docker是目前应用最为广泛的容器引擎,容器化为微服务提供实施保障,起到应用隔离作用,K8S是容器编排系统,用于容器管理,容器间的负载均衡,Docker和K8s都采用Go编写,(K8s全称Kubernetes,由首字母K,结尾字母s以及中间的8个字母组成,所以简称为K8s)。 | DevOps |是软件开发人员和IT运维人员之间的合作过程,是一种工作环境、文化和实践的集合,目标是高效地自动执行软件交付和基础架构更改流程。 开发和运维人员通过持续不断的沟通和协作,可以以一种标准化和自动化的方式快速、频繁且可靠地交付应用。 | 持续交付 |就是不误时开发,不停机更新,是一种软件开发方法,它利用自动化来加快新代码的发布。 在持续交付流程中,开发人员对应用所做的更改可通过自动化被推送至代码存储库或容器镜像仓库。
云原生技术:重塑数字化未来的关键架构
云原生技术是一个革命性的概念,它涵盖了docker、kubernetes、Service Mesh和Serverless等关键技术,由Google、IBM等科技巨头推动。本文将深入探讨其定义演变、技术路径、与云计算的融合以及对开发者的挑战,以期全面理解这一趋势的力量和影响。
2015年,Pivotal提出了云原生应用的12因素原则和微服务架构,强调自服务和弹性。随后,CNCF在2015年至2018年间,定义了云原生的核心特性,包括容器化、微服务导向和动态编排,进一步明确了在动态环境中构建可扩展应用的技术基础,如容器、服务网格等。
Cloud Native Computing Foundation (CNCF)的Landscape图谱展示了这一领域的丰富生态,囊括了Kubernetes、etcd等核心项目,以及众多围绕容器、服务管理和服务编排的组件,构成了一幅完整的云原生技术生态图谱。
随着云计算的兴起,开发者需要适应云原生架构,频繁进行可预测的变更,以适应云计算的动态环境。云计算提供了弹性裸金属服务器、分离式存储与计算资源,以及混合云网络的支持,与云原生技术共同推动了企业的数字化转型。
开发者的要求开发者在云原生环境中工作,需要掌握CRD(Custom Resource Definitions)和Controller模式,利用Kubernetes提供的强大平台,以实现应用的快速部署、扩展和故障恢复。同时,理解服务网格(Service Mesh)的原理,如Istio和Linkerd,对于优化服务间的通信至关重要。
云原生的最终目标是实现系统的弹性、容错性和高效性,通过快速迭代和交付,推动业务创新。在这个不断变化的时代,深入理解云原生技术,将赋予开发者在数字化竞争中保持领先地位的优势。
进一步研究:
云原生相关技术
依据CNCF发布的云原生1.0版本的定义,云原生技术主要包括容器、微服务、服务网格、不可变基础设施以及声明式API:
容器技术
容器技术和云原生好比一对螺旋体,容器技术催生了云原生思潮,云原生生态推动了容器技术发展。从2013年Docker技术诞生,到2015年CNCF这个云原生领域重量级联盟成立,这不是历史的巧合而是历史的必然。作为云原生关键技术之一的容器,从2013年诞生以来一直是行业关注的焦点之一。
2013年之前,云计算行业一直在为云原生的正确打开姿势而操心。Platform as a Service(PaaS)看起来是个有前途的方向。2006年Fotango公司发布的Zimi服务,可以说是PaaS行业的鼻祖,具有按使用付费、免运维(Serverless)、API化配置和服务等典型云原生的特征;2008年Google推出Google App Engine(GAE);2011年Pivotal发布Cloud Foundry。
这些早期的PaaS平台在云原生领域进行了非常有益的探索,推动了云原生生态的健康发展,但是这些早期探索技术并没有形成大的行业趋势,而是局限在一些的特定的领域。直到Docker开源,大家才如梦方醒,原来不是方向不对,而是应用分发和交付的手段不行。
Docker真正核心的创新是容器镜像(docker image),一种新型的应用打包、分发和运行机制。容器镜像将应用运行环境,包括代码、依赖库、工具、资源文件和元信息等,打包成一种操作系统发行版无关的不可变更软件包。
容器镜像打包了整个容器运行依赖的环境,以避免依赖运行容器的服务器的操作系统,从而实现“build once, run anywhere”。容器镜像一旦构建完成,就变成read only,成为不可变基础设施的一份子。
微服务
微服务架构是相对于单体架构来说的,两者分属不同的架构风格。在微服务架构中,服务是一个单一的、可独立部署的软件组件,它实现了一些有用的功能,服务的API封装了其内部实现,与单体架构不同,开发人员无法绕过服务的API直接访问服务内部的方法和数据,因此,微服务架构强制实现了应用程序的模块化。
微服务架构的最核心特性是服务之间的松耦合性。服务之间的交互采用API完成,这样做就封装了服务的实现细节,从而实现了在不影响客户端的情况下,对实现方式做出修改。
微服务架构通过将大的系统按照业务服务的粒度进行拆分,每个服务可独立开发、测试、验证和部署,这样分解后,带来的好处有如下几点:
服务网格
服务网格是用于处理服务间通信的专用基础设施层,负责在微服务间进行可靠地请求传递。服务网格通常通过一组轻量级网络代理来实现,这些代理与应用程序代码一起部署,而不需要感知应用程序本身。
随着规模和复杂性的增长,服务网格包含的实现的功能越来越多,它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求,例如A/B测试、金丝雀发布、限流、访问控制和端到端认证等。
服务网格有如下几个特点:
如果用一句话来解释什么是服务网格,可以将它比作是应用程序或者说微服务间的TCP/IP,负责服务之间的网络访问、限流、熔断和监控。对于编写应用程序来说一般无须关心TCP/IP这一层(比如通过HTTP协议的RESTful应用),同样使用服务网格也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如Spring Cloud、OSS,现在只要交给服务网格就可以了,从而极大地方便了微服务应用的开发。
不可变基础设施
一个工作负载(比如容器、虚拟机等)一旦部署以后就不会被修改。当需要更新,修复或修改某些内容的时候,只需要将新的、经过验证的工作负载替换旧的即可。
不可变基础设施的作用主要体现在系统的稳定性方面。传统的应用程序一旦部署到用户特定的服务器上以后,服务器系统是会不断变化的,不是操作系统升级,就是安装了新的应用,可能引起冲突,导致应用程序需要跟着用户系统环境的改变而不断升级,这中间就会不断地出现新的问题。而不可变基础设施就规避了所有的这些问题,因为云原生应用是部署在不可变的基础设施上的,因此就不存在变化的问题。
声明式API
声明式API是一种比命令式API更高级的接口设计方式,简单来说,命令式API提供给用户怎么做的能力,而声明式API给用户提供了做什么的能力。
声明式API是比命令式API更高级的一种接口,举个例子,假如我们有一个炒菜机,如果炒菜机提供的接口是放油、放调料、放食材、大火、小火等操作,那就是命令式API。
如果炒菜机提供的接口是来盘宫保鸡丁、来盘鱼香肉丝之类的,那就是声明式API了。声明式API比较典型的例子就是数据库提供的SQL接口,只需要告诉数据库你需要什么数据即可,至于怎么去获取这些数据,数据库自己会去按步骤操作。
本文地址:http://www.hyyidc.com/article/17254.html