为什么说云原生会成为未来企业技术变迁的趋势

云原生是当下的热点话题,但是很多人对云原生有很多误解,特别是传统产业物联网或工控、物联网行业对云原生显得"后知后觉"。与其在这里说是预测,不如说是现在进行时,只是由于传统产业本身的技术包袱和组织个人认识程度差异,目前发展并不见快。目前大部分的系统还是停留在旧年代,只是不到火候,还没到尝鲜和推倒重来的必要。但是,面对未来业务的持续增长和行业竞争,必然要面临一个技术的现代化转型升级,即:使用新技术代替老技术,使用新观念代替老观念的痛苦过程。否则老系统必然会变成企业发展的一个瓶颈,因为基于老系统的修修补补只会使系统变得更加复杂和难以维护,最后等待他们的是要么推到重来,要么是逐年生锈老化(修修补补又三年)。我这里针对新近的云原生作为一个切入点,来说明一下为什么说云原生会成为未来企业技术变迁的一个趋势。

概念诞生

  云原生(Cloud Native)的概念,由来自Pivotal的MattStine于2013年首次提出,被一直延续使用至今。

  这个概念是Matt Stine根据其多年的架构和咨询经验总结出来的一个思想集合,并得到了社区的不断完善,内容非常多,包括:

  • DevOps

  • 持续交付(Continuous Delivery)

  • 微服务(MicroServices)

  • 敏捷基础设施(Agile Infrastructure)和12要素(The Twelve-Factor App)等几大主题。

  不但包括根据业务能力对公司进行文化组织架构的重组与建设,也包括方法论与原则,还有具体的操作工具。采用基于云原生的技术和管理方法,可以更好地把业务生于“云”或迁移到云平台,从而享受“云”的高效和持续的服务能力。

概念理解

  云原生我这里简单的把它拆成云+原生两个部分来理解。

  云:和本地相对。很多人提到云容易先入为主的认为是阿里云,百度云。其实这朵云可以是阿里的公有云,也可以是自家的私有云,或者是混合云,不能简单的理解云原生就要把应用部署在阿里云。运用跑在哪朵云需要权衡利弊再抉择。

  不同于传统的是,站在研发的整个工程纬度来看,从研发的开始阶段就要设计面向云的系统,而不是先按传统的思路来设计开发,再去做迁移部署,最后导致迁移水土不服。

  什么是设计面向云的系统呢?这就要来理解原生的内涵。

  原生:就是土生土长的意识,也就是应用一出生就带有云的基因。所谓云的基因是基于微服务原理而开发的应用,以容器方式打包,在运行时,容器由运行于云基础设施(PASS或者叫云操作系统)之上的平台进行调度,应用开发采用持续交付和DevOps实践。

  根据刚才的理解,我把这些概念抽象成脑图:

 

  理解了整体概念,其中蕴含的价值也能逐渐明白清晰,接下来我逐个来展开分析,重点看下其中内置的四个子概念。

微服务

  微服务的终极价值在于借鉴乐高思想,把应用服务按照领域划分成一个个微服务。

  微服务是种理念,它的本质就是分而治之。可以是物理的拆分,也可以是领域的划分,或者是软件接口划分等等。

  从中台纬度看,不管是产业互联网、还是传统互联网,亦或是新兴的物联网,他们在系统底层都有相通的技术支撑:比如都需要硬件基础设施层(iaas),需要中台服务层(paas),需要软件服务层(saas)。不同是软硬件规模大小,复杂度高低的差异。

  微服务能力的强大在于,提供了灵活多变定制化能力,比如在物联网领域,从功能维度可以分为:统一身份认证服务、设备管理服务、设备告警监控服务、故障预测服务、报表分析服务等(具体划分可以参看我的另外一篇文章《微服务划分的姿势》),最后达到服务之间的任意拼装,极大的提高了服务的复用,同时降低了重复开发成本

    

容器化

  • 一键部署

  容器化技术通过打包机制和自动化编译发布能力,解决了单个服务部署麻烦的问题。服务在不同的开发、生产环境下再也不用因为环境不一致而头疼。

  服务一次打包,合理编排即可随处运行,极大地提高了部署效率,几乎可以做到一键部署。

  • 混合编排

  应用服务之间需要拼装才能自由组合。容器化技术给混合编排提供了可能,借助k8s的能力,服务的发布和编排变成了一个个yml文件的简单配置

  

DevOps

  DevOps如果从字面上来理解就是Dev(开发人员)+Ops(运维人员),开发和运维不再是分开的两个团队,而是你中有我,我中有你的一个团队。实际上,它是一组过程、方法与系统的统称

  首先,组织架构、企业文化与理念等,需要自上而下设计,用于促进开发部门、运维部门和测试部门之间的沟通、协作与整合,简单而言组织形式类似于系统分层设计

  其次,自动化是指所有的操作都不需要人工参与,全部依赖系统自动完成,比如上述的持续交付过程必须自动化才有可能完成快速迭代。

  再次,DevOps的出现是由于软件行业日益清晰地认识到,为了按时交付软件产品和服务,开发部门和运维部门必须紧密合作

  总之,DevOps强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。在内部沟通上,你可以想象DevOps是一个敏捷思维,是一个沟通的文化。当运营和研发有良好的沟通效率,才可以有更大的生产力。如果你的自动化程度够高,可以自主可控,工作负担降低,DevOps能够带来更好的工作文化、更高的工作效率。

  

持续交付 

  持续交付的意思就是在不影响用户使用服务的前提下频繁把新功能发布给用户使用,换句话说,持续交付就是不误时开发,小步快跑的方式,打破瀑布式开发流程的拖延。要做到这点非常非常难。

  首先我们要理解整个软件的开发模式(具体详见我之前的一篇文章《软件开发模式:瀑布与敏捷》)

  有了软件开发模式的知识储备,我们知道了什么是敏捷开发模式,什么是每日站会,敏捷团队人员数量控制等等。我们再回头看下如何做得持续交付?

  交付的速度要高速度,还要高可用,这怎么落地?为此,我这边还要一个一个概念要分享叫MVP(最小可行性产品),这是产品经理耳熟能详的。

  我把他翻译成白话一点并举个场景的案例:加入我要一辆特斯拉智能电动车,我不会一下子给你在某个时间点交付整车。我会在前期设计一张核心蓝图,交付的过程类似分期付款,我先根据任务的优先级顺序,把最重要最紧急的任务,比如发动机花一个月时间造好了交付给你;接下来根据优先级队列,我可能会取出排在第二的任务,比如说轮胎,再花一周时间造好了给你。直到整个任务池的任务全部完成为止。

  因此,持续交付的优势在于:

  • 它可以缩小开发者认知,重新确认开发方向;

  • 同时可用让这些任务并行开发,甚至采用7*24小时的开发机制,两班倒(通常游戏开发就是这么玩的)

  • 如果中间发现问题,因为船小好调头,修修改改也就特别快了。

  

  

  当然,持续交付也是有代价的,比如沟通成本,前期设计考虑不周导致的返工和修改成本。但是对于市场经济讲求高效和淘汰的原则,这些代价都可用忽略不计。试想,如果王者荣耀采用瀑布式来交付产品,那么市场上早就没有它的一席之地了,更别谈其他同类游戏开发了。

云基础设施

  

  

  我们从三个维度来看云基础设施:

  • 逻辑层面:可以理解成是抽象的超级计算机,通过软件比如k8s,把n台服务器组装成一台抽象的超级计算机,他是属于pass层(平台即服务)

  • 物理层面:

    • 这个集群由很多节点组成,而且可以按需添加更多节点,这些节点可以是物理机也可以是虚拟机。

    • 每个节点都有一定的CPU和内存容量。

    • 整个集群的CPU和容量是所有节点的CPU和容量总和,而且可以按需给这台计算机添加更多的CPU和内存。

    从这个层面理解,它是iaas层。

  • 部署层面

    • 公有云,可以是阿里云,微软或亚马逊云,前提是应用要设计成面向云原生应用。

    • 私有云,可以自建数据中心或者是集团企业的数据中心,这个数据中心可大可小,大到成百上千台服务器,小到1台服务器。当然这里运维的人员也会跟着变动。

    • 混合云,对上面两种部署的混合使用,也就是一部分应用放在公有云,比如说统一认证授权服务;一部分应用放在私有云,比如说核心数据。

  这里为什么没有saas,因为saas是运行于云操作系统至少的应用,面向的是业务层面,不能算是基础设施。

回顾:

  至此,你对云原生的内涵理解应该达到了"充血模型"了,那么我们来总结一下云原生技术变迁:

  • 云原生的技术变迁受到各自因素影响,前期发展缓慢,后期爆发的一个过程。比如业务发展,技术的历史包袱,组织和个人对云原生的重视程度等等,并不会发展得那么快,那么一帆风顺,可能会是一个3-5年甚至更久的过程,但是整个势头是不可阻挡的。

  • 云原生涉及到的不仅仅是技术层面的升级,更是是文化、组织架构、方法论的变更。

  • 微服务因为有了容器技术(k8s)和DevOps的加持,开发成本会持续的接近单体项目的成本,当二者趋向一致的时候,就是引爆的时候。

  以上是个人的浅见,你觉得云原生对于研发团队的意义了吗?你觉得在研发效能,业务规模化变更和推进传统技术现代化升级上有没有价值呢?希望你能留言探讨,倾听您不一样的高见。

参考文章:

  • 畅谈云原生和K8S发展

  • 云原生

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

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

相关文章

C++vector容器-构造函数

vector数据结构和数组非常相似,也称为单端数组,在数组的尾段可以做插入,删除操作 vector不同于普通数组,vector可以动态扩展 动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然…

java对象类型转换分为_java-如何将类对象转换为通用对象类型?

我正在研究一种使用NamedParameterJdbcTemplate从MySQL数据库获取一些数据的方法. listCurrentRecords应该从数据库返回Customer,Product和SalesOrder的对象类型列表. objectType是从在方法(1 || 2 || 3)内传递的参数定义的,并且在类中更早地定义为public变量.public static fi…

BeetleX网关之请求聚合

在网关服务中请求聚合是允许把多个请求打包成一个响应给请求方,这样不仅可以节省请求方的请求数量,还可以根据需求的情况整合不同业务数据响应请求。BeetleX.Bumblebee虽然并没有内置这一功能,但可以通过扩展的形式来支持请求聚合&#xff0c…

C++vector容器-赋值操作

vector赋值操作 功能描述&#xff1a; 给vector容器进行赋值 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector赋值操作void printVector(vector<int> &v) {for (vector<int >…

java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...

https://blog.csdn.net/seagal890/article/details/92067644JAVA算法&#xff1a;按照给定的段落统计单词出现次数(JAVA代码)写一个 JAVA程序以统计一个文本文件 words.txt 中每个单词出现的频率。为了简单起见&#xff0c;你可以假设&#xff1a;words.txt只包括小写字母和 …

EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析&#xff0c;是不是有点意犹未尽的感觉&#xff0c;是的&#xff0c;我也有这种感觉&#xff0c;看到这里相信您和我会有一些疑惑&#xff0c;要是我们接下来通过注解、Fluent APi、DbSet分别对表名进行如下设置&#x…

C++vector容器-容量和大小

vector容量和大小 功能描述&#xff1a; 对vector容器的容量和大小操作 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector容器的容量和大小操作void printVector(vector<int > &v) {…

openresty+mysql+乱码_openresty记录响应body乱码问题

问题背景最近新上了一个功能&#xff0c;openresty通过syslog记录请求日志&#xff0c;然后由logstash推送至ES。测试上线时未发现这个问题&#xff0c;在日常查看日志的过程中&#xff0c;发现logstash推送有错误日志&#xff0c;错误内容为&#xff1a;Error parsing json&am…

【Azure学习.01】先从账号注册开始

本文部分内容配套视频&#xff1a;https://www.bilibili.com/video/av82898957马上要放假了&#xff0c;决定在家里简单了解一下Azure云服务&#xff0c;虽然公司其他部分用到了这个Azure&#xff0c;但是我还是没有接触到&#xff0c;只是听说很贵&#xff0c;好几千每天&…

C++vector容器-插入和删除

vector插入和删除 功能描述&#xff1a; 对vector容器进行插入&#xff0c;删除操作 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector插入和删除void printVector(vector<int > &v…

python hasattr函数_python学习-type(),isinstance(),dir(),getattr(),setattr(),hasattr()

isinstance() 与 type() 区别&#xff1a;type() 不会认为子类是一种父类类型&#xff0c;不考虑继承关系。isinstance() 会认为子类是一种父类类型&#xff0c;考虑继承关系。如果要判断两个类型是否相同推荐使用 isinstance()。使用type()首先&#xff0c;我们来判断对象类型…

C++vector容器-数据存取

vector数据存取 功能描述&#xff1a; 对vector中的数据的存取操作 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector>//vector容器 数据存取 void test01() {vector<int >v1;for (int i 0; i &l…

如何快速融入团队(四)

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;01不知不觉这个系列已经开始第四篇的&#xff0c;其实我的原始意图只是思考一下如果有幸加入一个新团队&#xff0c;我们在思想和行动上该做哪些准备呢。不过随着内容的逐渐…

C++vector容器-互换容器

vector容器互换 功能描述&#xff1a; 实现两个容器内元素进行互换 函数原型&#xff1a; swap(vec);//将vec与本身的元素互换 1.基本使用 代码如下: #include <iostream> using namespace std; //vector容器互换 #include <vector> //1.基本使用void printVect…

java计算字符串中字符出现的次数_java – 计算字符串中字符出现次数

参见英文答案 > Java compressing Strings 18个我正在尝试编写一个Java程序,它接受一个字符串作为输入,并计算一个字符串中出现的字符数,然后打印一个新字符串,该字符串后跟no出现的字符.例如.输入字符串&#xff1a;aaaabb输出字符串&a…

.NET 状态机Automatonymous快速入门

介绍 Automatonymous是.NET开发人员的状态机库。它提供了一种流畅的语法来声明状态机&#xff0c;包括状态&#xff0c;事件&#xff08;支持触发器和数据事件&#xff09;以及状态/事件活动。尽管Automatonymous在简单的状态机上非常容易使用&#xff0c;但它具有许多高级功能…

C++vector容器-预留空间

vector预留空间 功能描述&#xff1a; 减少vector在多态扩展容量时的扩展次数 函数原型&#xff1a; reserve(int len);//容器预留len个元素长度&#xff0c;预留位置不初始化&#xff0c;元素不可访问。 当我们往vector容器中push_back大量的数&#xff0c;vector就会开辟多…

BeetleX实现HTTP协议详解

在传统网络服务中扩展中需要处理Bytes来进行协议的读写&#xff0c;这种原始的处理方式让工作变得相当繁琐复杂&#xff0c;出错和调试的工作量都非常大&#xff1b;组件为了解决这一问题引用Stream读写方式&#xff0c;这种方式可以极大的简化网络协议读写的工作量&#xff0c…

erlang rebar 配置mysql_Erlang Rebar 使用指南之四:依赖管理

Erlang Rebar 使用指南之四&#xff1a;依赖管理全文目录&#xff1a;本章链接&#xff1a;1 rebar依赖定义Rebar取得和构建符合OTP/Rebar规范的项目。如果项目包含子项目&#xff0c;Rebar会自动递归地构建它们。项目的依赖在project_dir/rebar.config中定义&#xff0c;形式如…

euclidea4攻略_Euclidea几何构建11.4通关攻略

Euclidea几何构建10.2通关攻略Euclidea游戏10.2怎么过&#xff1f;下面小编为大家带来Euclidea几何构建10.2通关攻略&#xff1a;更多攻略不断更新中——Euclidea游戏全关卡通关攻略大全分两次做图第一次&#xff0c;画圆就成了&#xff0c;具体看图应该能懂。第二次&#xff0…