容器十年 ——一部软件交付编年史

作者| 张磊,阿里云容器平台高级技术专家,CNCF Ambassador (CNCF 官方大使),Kubernetes 项目资深成员与维护者,曾就职于 Hyper、微软研究院(MSR),现在负责 Kubernetes 技术及上下游相关工作。

2019年,全世界的开发人员都开始习惯用容器测试自己的软件,用容器做线上发布,开始对容器化的软件构建和交付流程习以为常。全世界的架构师们都在对“云原生”侃侃而谈,描绘多云时代的应用治理方式,不经意间就把 “sidecar” 这种容器组织方式当做了默认选项。在“云”已经成为了大众基础设施的今天,我们已经习惯了把“容器“当做现代软件基础设施的基本依赖。这就像我们每天打开 Eclipse 编写 Java 代码一样自然。
 
但往回倒数两年, 整个容器生态都还在围着 Docker 公司争得不可开交,看起来完全没有定数。当时的国内很多公有云厂商,甚至都没有正式的 Kubernetes 服务。在那个时候,要依托容器技术在云上托管完整的软件生命周期,可以说是相当前沿的探索。谁能想到短短两年之后,容器这个站在巨人肩膀上的设计,就真的成为技术人员日常工作的一部分呢?
 
伴随着容器技术普及到“千家万户”,我们在这两年期间所经历的,是现代软件交付形式的一次重要变革。

源起:属于 Jails 们的时代

虚拟化容器技术(virtualized container)的历史,其实可以一直追溯上世纪 70 年代末。时间回到 1979 年,贝尔实验室( Bell Laboratories 正在为 Unix V7 (Version 7 Unix)操作系统的发布进行最后的开发和测试工作。

Ken Thompson(sitting) and Dennis Ritchie at PDP-11 ©wikipedia

在那个时候,Unix 操作系统还是贝尔实验室的内部项目,而运行 Unix 的机器则是长得像音响一样的、名叫 PDP 系列的巨型盒子。在那个“软件危机(The Software Crisis)”横行的末期,开发和维护 Unix 这样一套操作系统项目,即使对贝尔实验室来说也绝非易事。更何况,那里的程序员们还得一边开发 Unix ,一边开发 C 语言本身呢。
 
而在 Unix V7 的开发过程中,系统级别软件构建(Build)和测试(Test)的效率其实是其中一个最为棘手的难题。这里的原因也容易理解:当一个系统软件编译和安装完成后,整个测试环境其实就被“污染”了。如果要进行下一次构建、安装和测试,就必须重新搭建和配置整改测试环境。在有云计算能力的今天,我们或许可以通过虚拟机等方法来完整的复现一个集群。但在那个一块 64K 的内存条要卖 419 美元的年代,“快速销毁和重建基础设施”的想法还是有点“科幻”了。
 
所以,贝尔实验室的聪明脑袋们开始构思一种在现有操作系统环境下“隔离”出一个可供软件进行构建和测试的环境。更确切的说,就是我能否简单的执行一些指令,就改变一个程序的“视图”,让它把当前目录当做自己的根目录呢?这样,我每次只要在当前目录里放置一个完整操作系统文件系统部分,该软件运行所需的所有依赖就完备了。
 
更为重要的是,有了这个能力,开发者实际上就间接拥有了应用基础设施“快速销毁和重现”的能力,而不需要在环境搭好之后进入到环境里去进行应用所需的依赖安装和配置。这当然是因为,现在我的整个软件运行的依赖,是以一个操作系统文件目录的形式事先准备好的,而开发者只需要构建和测试应用的时候,切换应用“眼中”的根目录到这个文件目录即可。
 
于是,一个叫做 chroot(Change Root)的系统调用就此诞生了。
 
顾名思义,chroot 的作用是“重定向进程及其子进程的根目录到一个文件系统上的新位置”,使得该进程再也看不到也没法接触到这个位置上层的“世界”。所以这个被隔离出来的新环境就有一个非常形象的名字,叫做 Chroot Jail。
 
值得一提的是,这款孕育了 chroot 的 Unix V7 操作系统,成为了贝尔实验室 Unix 内部发行版的绝唱。在这一年末尾, Unix 操作系统正式被 AT&T 公司商业化,并被允许授权给外部使用,自此开启了一代经典操作系统的传奇之旅。
 
而 Chroot 的诞生,也第一次为世人打开了“进程隔离”的大门。
 
伴随着这种机被更广泛的用户接触到, chroot 也逐渐成为了开发测试环境配置和应用依赖管理的一个重要工具。而 “Jail” 这个用来描述进程被隔离环境的概念,也开始激发出这个技术领域更多的灵感。
 
在 2000 年,同属 Unix 家族的 FreeBSD 操作系统发布了"jail"命令
宣布了 FreeBSD Jails 隔离环境的正式发布。相比于 Chroot Jail,FreeBSD Jails 把”隔离“这个概念扩展到了进程的完整视图,隔离出了独立进程环境和用户体系,并为 Jails 环境分配了独立的 IP 地址。所以确切的说,尽管 chroot 开创了进程环境隔离的思想,但 FreeBSD Jails,其实才真正实现了进程的沙箱化。而这里的关键在于,这种沙箱的实现,依靠的是操作系统级别的隔离与限制能力而非硬件虚拟化技术。

不过,无论是 FreeBSD Jails(Unix 平台),还是紧接着出现的 Oracle Solaris Containers(Solaris 平台),都没有能在更广泛的软件开发和交付场景中扮演到更重要的角色。在这段属于 Jails 们的时代,进程沙箱技术因为“云”的概念尚未普及,始终被局限在了小众而有限的世界里。

发展:云,与应用容器

事实上,在 Jails 大行其道的这几年间,同样在迅速发展的 Linux 阵营上也陆续出现多个类似的沙箱技术比如 Linux VServer 和 Open VZ(未进入内核主干)。但跟 Jails 的发展路径比较类似,这些沙箱技术最后也都沦为了小众功能。我们再次看到了,进程沙箱技术的发展过程中“云”的角色缺失所带来的影响,其实还是非常巨大的。而既然说到“云”,我们就不得不提到基础设施领域的翘楚:Google。
 
Google 在云计算背后最核心的基础设施领域的强大影响力,是被业界公认的一个事实,无论是当初震惊世界的三大论文,还是像 Borg/Omega 等领先业界多年的内部基础设施项目,都在这个领域扮演者重要的启迪者角色。然而,放眼当今的云计算市场, 仅仅比 Google 云计算发布早一年多的 AWS 却是“云”这个产业毫无争议的领导者。而每每谈到这里的原因,大家都会提到一个充满了争议的项目:GAE。

GAE 对于中国的某几代技术人员来说,可以说是一个挥之不去的记忆。然而,即使是这批 GAE 的忠实用户,恐怕也很难理解这个服务竟然就是 Google 当年决定用来对抗 AWS 的核心云产品了。事实上,GAE 本身与其说是 PaaS,倒不如说是简化版的 Serverless。在 2008 年,在绝大多数人还完全不知道云计算为何物的情况下,这样的产品要想取得成功拿下企业用户,确实有些困难。
 
不过,在这里我们想要讨论的并不是 Google 的云战略,而是为什么从技术的角度上,Google 也认为 GAE 这样的应用托管服务就是云计算呢?
 
这里的一个重要原因可能很多人都了解过,那就是 Google 的基础设施技术栈其实是一个标准容器技术栈,而不是一个虚拟机技术栈。更为重要的是,在 Google 的这套体系下,得益于 Borg 项目提供的独有的应用编排与管理能力,容器不再是一个简单的隔离进程的沙箱,而成为了对应用本身的一种封装方式。依托于这种轻量级的应用封装,Google 的基础设施可以说是一个天然以应用为中心的托管架构和编程框架,这也是很多前 Googler 调侃“离开了 Borg 都不知道怎么写代码”的真实含义。这样一种架构和形态,映射到外部的云服务成为 GAE 这样的一个 PaaS/Serverless 产品,也就容易理解了。
 
而 Google 这套容器化基础设施的规模化应用与成熟,可以追溯到 2004~2007 年之间,而这其中一个最为关键的节点,正是一种名叫 Process Container 技术的发布。
 
Process Container 的目的非常直白,它希望能够像虚拟化技术那样给进程提供操作系统级别的资源限制、优先级控制、资源审计能力和进程控制能力,这与前面提到的沙箱技术的目标其实是一致的。这种能力,是前面提到的 Google 内部基础设施得以实现的基本诉求和基础依赖,同时也成为了 Google 眼中“容器”技术的雏形。带着这样的设思路,Process Container 在 2006 年由 Google 的工程师正式推出后,第二年就进入了 Linux 内核主干。
 
不过,由于 Container 这个术语在 Linux 内核中另有它用,Process Container 在 Linux 中被正式改名叫作:Cgroups。Cgroups 技术的出现和成熟,标志在 Linux 阵营中“容器”的概念开始被重新审视和实现。更重要的是,这一次“容器”这个概念的倡导者变成了 Google:一个正在大规模使用容器技术定义世界级基础设施的开拓者。
 
在 2008 年,通过将 Cgroups 的资源管理能力和 Linux Namespace 的视图隔离能力组合在一起,LXC(Linux Container)这样的完整的容器技术出现在了 Linux 内核当中。尽管 LXC 提供给用户的能力跟前面提到的各种 Jails 以及 OpenVZ 等早期 Linux 沙箱技术是非常相似的,但伴随着 Linux 操作系统开始迅速占领商用服务器市场的契机,LXC 的境遇比前面的这些前辈要好上不少。
 
而更为重要的是,2008 年之后 AWS ,Microsoft 等巨头们持续不断的开始在公有云市场上进行发力,很快就催生出了一个全新的、名叫 PaaS 的新兴产业。
 
老牌云计算厂商在 IaaS 层的先发优势以及这一部分的技术壁垒,使得越来越多受到公有云影响的技术厂商以及云计算的后来者,开始思考如何在 IaaS 之上构建新的技术与商业价值,同时避免走入 GAE 当年的歧途。在这样的背景之下,一批以开源和开放为主要特点的平台级项目应运而生,将 “PaaS” 这个原本虚无缥缈的概念第一次实现和落地。这些 PaaS 项目的定位是应用托管服务,而不同于 GAE 等公有云托管服务 ,这些开放 PaaS 项目希望构建的则是完全独立于 IaaS 层的一套应用管理生态,目标是借助 PaaS 离开发者足够近的优势锁定云乃至所有数据中心的更上层入口。这样的定位,实际上就意味着 PaaS 项目必须能够不依赖 IaaS 层虚拟机技术,就能够将用户提交的应用进行封装,然后快速的部署到下层基础设施上。而这其中,开源、中立,同时又轻量、敏捷的 Linux 容器技术,自然就成为了 PaaS 进行托管和部署应用的最佳选择。
 
在 2009 年,VMware 公司在收购了 SpringSource 公司(Spring 框架的创始公司)之后,将 SpringSource 内部的一个 Java PaaS 项目的名字,套在了自己的一个内部 PaaS 头上,然后于 2011 年宣布了这个项目的开源。这个项目的名字,就叫做:Cloud Foundry。2009年,Cloud Foundry 项目的诞生,第一次对 PaaS 的概念完成了清晰而完整的定义。

这其中,“PaaS 项目通过对应用的直接管理、编排和调度让开发者专注于业务逻辑而非基础设施”,以及“PaaS 项目通过容器技术来封装和启动应用”等理念,也第一次出现在云计算产业当中并得到认可。值得一提的是,Cloud Foundry 用来操作和启动容器的项目叫做:Warden,它最开始是一个 LXC 的封装,后来重构成了直接对 Cgroups 以及 Linux Namespace 操作的架构。
 
Cloud Foundry 等 PaaS 项目的逐渐流行,与当初 Google 发布 GAE 的初衷是完全一样的。说到底,这些服务都认为应用的开发者不应该关注于虚拟机等底层基础设施,而应该专注在编写业务逻辑这件最有价值的事情上。这个理念,在越来越多的人得以通过云的普及开始感受到管理基础设施的复杂性和高成本之后,才变得越来越有说服力。在这幅蓝图中,Linux 容器已经跳出了进程沙箱的局限性,开始扮演的“应用容器”的角色。在这个新的舞台上, 容器和应用终于画上了等号,这才最终使得平台层系统能够实现应用的全生命周期托管。
 
按照这个剧本,容器技术以及云计算的发展,理应向着 PaaS 的和以应用为中心的方向继续演进下去。如果不是有一家叫做 Docker 的公司出现的话。

容器:改写的软件交付的历程

如果不是亲历者的话,你很难想象 PaaS 乃至云计算产业的发展,会如何因为 2013 年一个创业公司开源项目的发布而被彻底改变。但这件事情本身,确实是过去 5 年间整个云计算产业变革的真实缩影。
Docker 项目的发布,以及它与 PaaS 的关系,想必我们已经无需在做赘述。一个“降维打击”,就足以给当初业界的争论不休画上一个干净利落的句号。
 
我们都知道, Docker 项目发布时,无非也是 LXC 的一个使用者,它创建和使用应用容器的逻辑跟 Warden 等没有本质不同。不过,我们现在也知道,真正让 PaaS 项目无所适从的,是 Docker 项目最厉害的杀手锏:容器镜像。
 
关于如何封装应用,这本身不是开发者所关心的事情,所以 PaaS 项目有着无数的发挥空间。但到这如何定义应用这个问题,就是跟每一位技术人员息息相关了。在那个时候,Cloud Foundry 给出的方法是 Buildpack,它是一个应用可运行文件(比如 WAR 包)的封装,然后在里面内置了 Cloud Foundry 可以识别的启动和停止脚本,以及配置信息。
 
然而,Docker 项目通过容器镜像,直接将一个应用运行所需的完整环境,即:整个操作系统的文件系统也打包了进去。这种思路,可算是解决了困扰 PaaS 用户已久的一致性问题,制作一个“一次发布、随处运行”的 Docker 镜像的意义,一下子就比制作一个连开发和测试环境都无法统一的 Buildpack 高明了太多。
 
更为重要的是,Docker 项目还在容器镜像的制作上引入了“层”的概念,这种基于“层”(也就是“commit” ) 进行 build,push,update 的思路,显然是借鉴了 Git 的思想。所以这个做法的好处也跟 Github 如出一辙:制作 Docker 镜像不再是一个枯燥而乏味的事情,因为通过 DockerHub 这样的镜像托管仓库,你和你的软件立刻就可以参与到全世界软件分发的流程当中。
 
至此,你就应该明白,Docker 项目实际上解决的确实是一个更高维度的问题:软件究竟应该通过什么样的方式进行交付?更重要的是,一旦当软件的交付方式定义的如此清晰并且完备的时候,利用这个定义在去做一个托管软件的平台比如 PaaS,就变得非常简单而明了了。这也是为什么 Docker 项目会多次表示自己只是“站在巨人肩膀上”的根本原因:没有最近十年 Linux 容器等技术的提出与完善,要通过一个开源项目来定义并且统一软件的交付历程,恐怕如痴人说梦。

云,应用,与云原生

时至今日,容器镜像已经成为了现代软件交付与分发的事实标准。然而, Docker 公司却并没有在这个领域取得同样的领导地位。这里的原因相比大家已经了然于心:在容器技术取得巨大的成功之后,Docker 公司在接下来的“编排之争”中犯下了错误。事实上,Docker 公司凭借“容器镜像”这个巧妙的创新已经成功解决了“应用交付”所面临的最关键的技术问题。但在如何定义和管理应用这个更为上层的问题上,容器技术并不是“银弹”。在“应用”这个与开发者息息相关的领域里,从来就少不了复杂性和灵活性的诉求,而容器技术又天然要求应用的“微服务化”和“单一职责化”,这对于绝大多数真实企业用户来说都是非常困难的。而这部分用户,又偏偏是云计算产业的关键所在。
 
而相比于 Docker 体系以“单一容器”为核心的应用定义方式,Kubernetes 项目则提出了一整套容器化设计模式和对应的控制模型,从而明确了如何真正以容器为核心构建能够真正跟开发者对接起来的应用交付和开发范式。而 Docker 公司、Mesosphere 公司 以及 Kubernetes 项目在“应用”这一层上的不同理解和顶层设计,其实就是所谓“编排之争”的核心所在。
 
2017 年末,Google 在过去十年编织全世界最先进的容器化基础设施的经验,最终帮助 Kubernetes 项目取得到了关键的领导地位,并将 CNCF 这个以“云原生”为关键词的组织和生态推向了巅峰。
 
而最为有意思的是, Google 公司在 Kubernetes 项目倾其全力注入的“灵魂”,既不是 Borg/Omega 多年来积累下来的大规模调度与资源管理能力,也不是“三大论文”这样让当年业界望尘莫及的领先科技。Kubernetes 项目里最能体现 Google 容器理念的设计,是“源自 Borg/Omega 体系的应用编排与管理能力”。
 
我们知道,Kubernetes 是一个“重 API 层” 的项目,但我们还应该理解的是,Kubernetes 是一个“以 API 为中心”的项目。围绕着这套声明式 API,Kubernetes 的容器设计模式,控制器模型,以及异常复杂的 apiserver 实现与扩展机制才有了意义。而这些看似繁杂的设计与实现背后,实际上只服务于一个目的,那就是:如何让用户在管理应用的时候能最大程度的发挥容器和云的价值。
 
本着这个目的,Kubernetes 才会把容器进行组合,用 Pod 的概念来模拟进程组的行为。才会坚持用声明式 API 加控制器模型来进行应用编排,用 API 资源对象的创建与更新(PATCH)来驱动整个系统的持续运转。更确切的说,有了 Pod 和容器设计模式,我们的应用基础设施才能够与应用(而不是容器)进行交互和响应的能力,实现了“云”与“应用”的直接对接。而有了声明式 API,我们的应用基础而设施才能真正同下层资源、调度、编排、网络、存储等云的细节与逻辑解耦。我们现在,可以把这些设计称为“云原生的应用管理思想”,这是我们“让开发者专注于业务逻辑”、“最大程度发挥云的价值”的关键路径。
 
所以说,Kubernetes 项目一直在做的,其实是在进一步清晰和明确“应用交付”这个亘古不变的话题。只不过,相比于交付一个容器和容器镜像, Kubernetes 项目正在尝试明确的定义云时代“应用”的概念。在这里,应用是一组容器的有机组合,同时也包括了应用运行所需的网络、存储的需求的描述。而像这样一个“描述”应用的 YAML 文件,放在 etcd 里存起来,然后通过控制器模型驱动整个基础设施的状态不断地向用户声明的状态逼近,就是 Kubernetes 的核心工作原理了。

未来:应用交付的革命不会停止

说到这里,我们已经回到了 2019 年这个软件交付已经被 Kubernetes 和容器重新定义的时间点。
 
在这个时间点上,Kubernetes 项目正在继续尝试将应用的定义、管理和交付推向一个全新的高度。我们其实已经看到了现有模型的一些问题与不足之处,尤其是声明式 API 如何更好的与用户的体验达成一致。在这个事情上,Kubernetes 项目还有不少路要走,但也在快速前行。
 
我们也能够看到,整个云计算生态正在尝试重新思考 PaaS 的故事。Google Cloud Next 2019 上发布的 Cloud Run,其实已经间接宣告了 GAE 正凭借 Kubernetes 和 Knative 的标准 API “浴火重生”。而另一个典型的例子,则是越来越多很多应用被更“极端”的抽象成了 Function,以便完全托管于与基础设施无关的环境(FaaS)中。如果说容器是完整的应用环境封装从而将应用交付的自由交还给开发者,那么 Function 则是剥离了应用与环境的关系,将应用交付的权利交给了 FaaS 平台。我们不难看到,云计算在向 PaaS 的发展过程中被 Docker “搅局”之后,又开始带着“容器”这个全新的思路向 “PaaS” 不断收敛。只不过这一次,PaaS 可能会换一个新的名字叫做:Serverless。
 
我们还能够看到,云的边界正在被技术和开源迅速的抹平。越来越多的软件和框架从设计上就不再会跟某云产生直接绑定。毕竟,你没办法抚平用户对商业竞争担忧和焦虑,也不可能阻止越来越多的用户把 Kubernetes 部署在全世界的所有云上和数据中心里。我们常常把云比作“水、电、煤”,并劝诫开发者不应该关心“发电”和“烧煤”的事情。但实际上,开发者不仅不关心这些事情,他们恐怕连“水、电、煤”是哪来的都不想知道。在未来的云的世界里,开发者完全无差别的交付自己的应用到世界任何一个地方,很有可能会像现在我们会把电脑插头插在房间里任何一个插孔里那样自然。这也是为什么,我们看到越来越多的开发者在讨论“云原生”。
 
我们无法预见未来,但代码与技术演进的正在告诉我们这样一个事实:未来的软件一定是生长于云上的。这将会是“软件交付”这个本质问题的不断自我革命的终极走向,也是“云原生”理念的最核心假设。而所谓“云原生”,实际上就是在定义一条能够让应用最大程度利用云的能力、发挥云的价值的最佳路径。在这条路径上,脱离了“应用”这个载体,“云原生”就无从谈起;容器技术,则是将这个理念落地、将软件交付的革命持续进行下去的重要手段之一。
 
而至于 Kubernetes 项目,它的确是整个“云原生”理念落地的核心与关键所在。但更为重要的是,在这次关于“软件”的技术革命中,Kubernetes 并不需要尝试在 PaaS 领域里分到一杯羹:它会成为连通“云”与“应用”的高速公路,以标准、高效的方式将“应用”快速交付到世界上任何一个位置。而这里的交付目的地,既可以是最终用户,也可以是 PaaS/Serverless 从而催生出更加多样化的应用托管生态。“云”的价值,一定会回归到应用本身。


一起进入云原生架构时代

在云的趋势下,越来越多的企业开始将业务与技术向“云原生”演进。这个过程中最为艰难的挑战其实来自于如何将应用和软件向 Kubernetes 体系进行迁移、交付和持续发布。而在这次技术变革的浪潮中,”云原生应用交付“,已经成为了 2019 年云计算市场上最热门的技术关键词之一。
 
阿里巴巴从 2011 年开始通过容器实践云原生技术体系,在整个业界都还没有任何范例可供参考的大背境下,逐渐摸索出了一套比肩全球一线技术公司并且服务于整个阿里集团的容器化基础设施架构。在这些数以万计的集群管理经验当中,阿里容器平台团队探索并总结了四个让交付更加智能与标准化的方法: Everything on Kubernetes,利用 K8s 来管理一切,包括 K8s 自身; 应用发布回滚策略,按规则进行灰度发布,当然也包括发布 kubelet 本身;将环境进行镜像切分,分为模拟环境和生产环境;并且在监控侧下足功夫,将Kubernetes 变得更白盒化和透明化,及早发现问题、预防问题、解决问题。
 
而近期,阿里云容器平台团队也官宣了两个社区项目:Cloud Native App Hub —— 面向所有开发者的 Kubernetes 应用管理中心,OpenKruise —— 源自全球顶级互联网场景的 Kubernetes 自动化开源项目集。
 
云原生应用中心(Cloud Native App Hub),它首先为国内开发者提供了一个 Helm 应用中国镜像站,方便用户获得云原生应用资源,同时推进标准化应用打包格式,并可以一键将应用交付到K8s 集群当中,大大简化了面向多集群交付云原生应用的步骤;而OpenKruise/Kruise 项目致力于成为“云原生应用自动化引擎”,解决大规模应用场景下的诸多运维痛点。OpenKruise 项目源自于阿里巴巴经济体过去多年的大规模应用部署、发布与管理的最佳实践,从不同维度解决了 Kubernetes 之上应用的自动化问题,包括部署、升级、弹性扩缩容、QoS 调节、健康检查,迁移修复等等。

在接下来,阿里云容器平台团队还会以此为基础,继续同整个生态一起推进云原生应用定义、K8s CRD 与 Operator 编程范式、增强型 K8s 自动化插件等一系列能够让云原生应用在规模化多集群场景下实现快速交付、更新和部署等技术的标准化与社区化。

我们期待与您一起共建,共同体迎接云原生时代的来临!


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

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

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

相关文章

Java-自定义注解

// 自定义注解 public class Test03 {// 注解可以显示赋值, 如果没有默认值,我们就必须给注解赋值MyAnnotation2(name"wang")public void test1(){}// 当只有 一个值 为value 时, 可以不用写 value""MyAnnotation3("…

如何带领团队“攻城略地”?优秀的架构师这样做

阿里妹导读:架构师是一个既能掌控整体又能洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。看似完美的“人格模型”背后,是艰辛的探索。今天,阿里巴巴技术专家九摩将多年经验,进行系统性地总结,帮助更…

资深程序员总结:分析Linux进程的6个方法,我全都告诉你

来源 | 后端技术学堂封图| CSDN下载于视觉中国操作系统「进程」是学计算机都要接触的基本概念,抛开那些纯理论的操作系统底层实现,在Linux下做软件开发这么多年,每次程序运行出现问题,都要一步一步分析进程各种状态,去…

蚂蚁金服胡喜:金融服务将成为开源的下个前沿领域

近日,全球知名开源组织云原生计算基金会 CNCF 宣布,蚂蚁金服正式成为 CNCF 黄金会员。为什么蚂蚁金服会拥抱开源,科技公司和开源社区如何实现双赢且可持续发展?蚂蚁金服副CTO胡喜在TechCrunch上发表专栏阐述了自己的见解。 自诞生…

Java-反射概述

// 什么叫反射 public class Test02 {public static void main(String[] args) throws ClassNotFoundException {// 通过反射获取类的 Class 对象Class c1 Class.forName("reflection.User");Class c2 Class.forName("reflection.User");Class c3 Class…

PLSQL 设置日期格式为年月日不显示时分秒

在这里插入代码片nls_date_format YYYY-MM-DDnls_timestamp_format YYYY-MM-DD

云原生应用 Kubernetes 监控与弹性实践

前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider、CRD Controller、Operator等等的方式从Kubernetes的标准接口向业务层…

零基础小白10分钟用Python搭建小说网站!网友:我可以!

都说Python什么都能做,本来我是不信的!直到我在CSDN站内看到了一件真事儿:一位博主贴出了自己10分钟用Python搭建小说网站的全过程!全程只用了2步操作,简直太秀了!!……第一步:爬取小…

Java-得到 Class 类的几种方式

public class Test03 {public static void main(String[] args) throws ClassNotFoundException {Person person new Student();System.out.println("这个人是:"person.name);// 方式一: 通过对象获取Class c1 person.getClass();System.out…

就是要你懂负载均衡--lvs和转发模式

本文希望阐述清楚LVS的各种转发模式,以及他们的工作流程和优缺点,同时从网络包的流转原理上解释清楚优缺点的来由,并结合阿里云的slb来说明优缺点。 如果对网络包是怎么流转的不太清楚,推荐先看这篇基础:程序员的网络知…

JVM-SANDBOX:从阿里精准测试走出的开源贡献奖

阿里妹导读:稳定性是历年双11的技术质量保障核心。从 2016 年开始淘宝技术质量部潜心修行,创新地研发了一套实时无侵入的字节码增强框架,于是「JVM-SANDBOX」诞生了,并且顺手在 MTSC 大会上拿了开源贡献奖,今天&#x…

EMR Spark Runtime Filter性能优化

背景 Join是一个非常耗费资源耗费时间的操作,特别是数据量很大的情况下。一般流程上会涉及底层表的扫描/shuffle/Join等过程, 如果我们能够尽可能的在靠近源头上减少参与计算的数据,一方面可以提高查询性能,另一方面也可以减少资源的消耗(网…

集齐最后一块拼图,全栈Serverless时代正式开启

近日腾讯云正式发布国内首个Serverless数据库新品——PostgreSQL for Serverless。相比普通云上数据库,该数据库能够最快1秒完成部署,成本降低70%。这款新型数据库将为数百万开发者带来更灵活的业务开发模式、更快捷的上云体验,以及更大空间的…

Java-所有类型的Class对象

public class Test04 {public static void main(String[] args) {Class c1 Object.class; // 类Class c2 Comparable.class; // 接口Class c3 String[].class; // 一位数组Class c4 int[][].class; // 二维数组Class c5 Override.class; // 注解Class c6 ElementType.cla…

分布式服务架构下的混沌工程实践

本文来自阿里巴巴高可用架构团队高级开发工程师肖长军(花名穹谷)在 GIAC(全球互联网架构大会)上的分享,包含三部分内容:(阿里巴巴中间件公众号对话框发送“混沌工程”,获取分享PPT&a…

Java-类加载内存分析

没有听懂 public class Test05 {public static void main(String[] args) {A a new A();System.out.println(A.m);/*1. 加载到内存&#xff0c;会产生一个类对应Class对象2. 链接&#xff0c; 链接结束后 m 03. 初始化<clinit>(){System.out.println("A类静态代码…

小谈CDN回源函数计算的应用场景

CDN团队联合函数计算团队近期推出了一个全新功能&#xff0c;即通过CDN把回源流量指向函数计算进行处理&#xff0c;该功能旨在帮助CDN用户能通过函数计算快速处理和便捷处理回源数据为目的&#xff0c;用户仅仅需要在CDN回源地址填写函数计算的自定义域名即可把请求转发到函数…

只需12 个步骤,就能在AWS中创建自定义VPC,用过都惊了!

作者| Kunal Yadav译者 | 天道酬勤 责编| 徐威龙封图| CSDN下载于视觉中国在本文中&#xff0c;作者将创建一个具有公共子网和私有子网的自定义VPC。每个子网中都有一个EC2实例&#xff08;已安装WordPress&#xff09;。亚马逊VPC图标公共子网中的实例可以通过互联网访问&…

阿里前端委员会主席圆心:未来前端的机会在哪里?

阿里妹导读&#xff1a;在近期举办的行业大会上&#xff0c;阿里前端技术委员会主席&#xff0c;淘系技术部资深总监圆心发表了《前端路上的思考》的演讲&#xff0c;分别从前端的发展历程、今天的机会、如何引领新技术、前端价值这四个方面进行深入探讨。流年笑掷&#xff0c;…

Java-分析类初始化

public class Test06 {static {System.out.println("Main类被加载");}public static void main(String[] args) throws ClassNotFoundException {// 1. 主动引用 // Son son new Son();/* 结果Main类被加载父类被加载子类被加载*/// 反射也会产生主动引用 //…