什么叫云原生应用?| 技术头条

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!


作者:吕建伟

转自:阿朱说


(1)从Function到Service


一、从函数说起


我是1993年学习电脑的。学习的开发语言有三种:汇编、C、DbaseIII。


所以在我学习的时候,我并不了解面向对象的代码架构设计和代码编程实现。所以要从字面上来区分函数和函数之间的关系,主要就靠函数命名、放在同一个代码文件里、放在同一个代码目录文件夹里来区分他们之间的关联性。


在当时函数时代,也没啥异常保护、异常处理、异常日志的函数编写基本原则,所以我们除了命名以外,主要注重的就是函数的输入数据参数以及格式、输出数据的参数以及格式。


二、面向对象


我的面向对象是用Object Pascal开始的,但真正大量写面向对象代码的时候是使用Delphi,那已经是1996年的事情了。


因为有了类这个东西,所以函数就可以物以类聚了。有的函数属于私有函数只能这个类里面才能调用,有的函数属于公有函数可以供外部调用。


但是我那时候使用类还很初级,往往是一个源代码文件中就定义一个类。而且类也没有使用继承,也就是说我所有的类都是平行的,类和类之间通过Public型的公开函数调用才产生了关系。


三、面向接口


Delphi这个开发语言是优美的,它的定义申明和它的详细实现是分离的。


业务功能进一步复杂起来了,过去没什么太多关系的业务现在关系越来越紧密了,有些类和类之间的调用就太多了。我就想着重写这块代码,把这两个类进行合并了。但一重写吧,需要动的东西太多了。


用继承、用多重继承的方法来做吧,太麻烦,总要在实现里写一个空函数(就是没有代码但只有函数架子的,以备编译器能语法通过)。后来认识了接口,就用接口定义了,就不使用空函数了,就定义,不实现,编译器照样能通过。


四、面向组件


我是完整经历过面向组件时期的,并且用面向组件技术编写过一整代完整的ERP引用套件。从CORBA技术到COM/DCOM/COM+技术都娴熟学习并使用过。我也是完整经历单机版本到C/S客户端服务器端局域网版本到C/S/S三层架构的。


一开始我用DBaseIII写应用,UI开发、业务逻辑开发、数据库开发都是一个开发语言搞定。


后来用Delphi写C/S应用,就用了SQLServer大型关系数据库,在数据库层就写了不少存储过程和定时JOB任务。但当时业务逻辑代码和UI代码都是运行在客户端,所以这两层之间的分离也并不清晰。


然后写C/S/S三层架构,业务逻辑层独立出来,而且是物理独立部署,这样客户端代码和业务逻辑层代码就必须要彻底分开,不能不清不楚地混杂在一起了。在那个时候,我才开始大量使用精心的接口设计、对象设计。


因为有了独立的业务逻辑层,那么这些代码(接口/类)何时创建对象实例,何时释放,这些对象实例要运行在哪个进程容器中,就有了要求了。因而就产生了组件容器和组件。组件容器来管理组件的全生命周期(安全、创建、并发访问控制、休眠、激活唤醒、计数、摧毁释放内存),组件管理器就来管理组件的注册、发现等。


所以《COM本质论》的作者Don Box说.NET就是更好的COM,我一下子明白了:对啊,微软的意思是,以后所有的应用都应该运行在组件容器中,不管是单机应用,还是C/S应用,还是C/S/S应用,每个应用都要运行在组件容器中,由组件容器来屏蔽和管理内存的创建与回收,不要把内存的创建与释放直接袒露给开发者,否则开发者技术能力水平不一,有的烂的程序员管理不好内存,很容易就会使应用占满内存并导致操作系统崩溃。


五、面向WebService


哈哈哈,大家好像都没听说过面向WebService,大家好像就听过面向服务。


Web互联网兴盛起来,HTML(UI元素定义)+CSS(UI元素风格定义)+JavaScript(UI元素操作)构成了前端技术。人们又从前端里分离出来XML,成为数据容器。可以用HTTP+80端口进行传输纯文本的XML数据,也可以用UDP、TCP/IP等各种传输协议进行传输。当然,XML还可以被压缩以便更小尺寸在互联网上传输(尤其过去互联网速度很慢),还可以被加密不让人中间截获看到。这些就构成了WebService的一个技术族。


我们现在要把局域网版本的C/SS/三层技术架构,升级到Web/S/S三层技术架构,那怎么办呢?


所以我们需要在我们的组件基础上再包装一层WebService,客户端的AJAX技术就好调用了。所以当时.NET组件技术、EJB技术、.NET组件容器、EJB组件容器中间件,都纷纷原生内嵌支持WebService技术族,让从开发到运行到调用,直接就是WebService技术。这就是SOA:面向服务架构。


(2)微服务


一、物极必反


当时是多么理想啊:一整套J2EE体系,WebService + EJB完美组件模型  +WebLogic SOA组件容器/ESB组件管理器中间件,包括技术架构师。当年是多么多么大的市场啊。


但程序员是实用主义者,怎么简单怎么来。随着第二波互联网创业热崛起(2004年),大干快上才是王道,没钱用开源开干才是王道。


于是,WebService换成了REST、XML换成了JSON、EJB换成了普通的JAVA Class、WebLogic换成了开源的Spring。尤其在2004-2006年,SSH这三驾马车(Structs前端、Spring中间层、Hibernate数据层)真是横行世界。


尤其2004-2006,Google崛起如日中天,Google统一开放了自己的Open API,轻的很。这已经是微服务流行的启动了。但这时候还不能称作微服务,可以称作简化服务(WebSerivce)。


二、亚马逊的天条


贝索斯从2002年就亲自制定了亚马逊分布式系统架构六条原则:


1、所有团队的程序模块都要通过WebService接口将其数据与功能开放出来


2、团队间程序模块的信息通信,只能通过这些接口进行。其他形式一概不允许:不能用动态链接库、不能读取其他团队数据库、不能试用共享内存、不能试用别人模块的后门,唯一允许的通信方式只有调用WebService。


3、所有的Web Service,毫无例外,都必须从骨子里到表面上都设计成能对外界开放的。也就是说,团队必须做好规划与设计,以便未来把接口开放给全世界的程序员,没有任何例外


4、不这样做的人会被炒鱿鱼


5、一个服务由一个小团队(两张披萨喂饱)负责,从前端到数据,从需求分销到上线运维,全权负责


6、逆向工作法:先定义未来,然后发布新闻稿进行客户探索与交互,再进行实现执行


我看到这六条原则,我也就明白了为啥亚马逊能做成公有云计算领头羊了,我也就明白了在现在Cloud大行其道的时候,亚马逊还一直坚持使用AWS这个品牌(Amazon Web Service)。


我个人认为,从亚马逊全职能小团队、内外一体化原则开放WebSevice开始,服务才真正变小,成为微服务。如果你是个100人的团队,你是一个按专业职能划分的团队,你是一个一年就发布2次的团队,你是一个区分内部调用和外部调用的团队,我相信,你是成不了真正的微服务的。你充其量来说,只能说,你是一个用了微服务技术却没有实现微服务的团队。


这很好理解。很多程序员用了一辈子面向对象的开发语言,但从未自己定义过真正的类。这就是中国。


(3)云时代


一、移动时代来了


90年代我们用C/S,用C/S/S Corba、DCOM/COM+,2000年以后我们用.NET、EJB/WebLogic,后来我们又用REST、JSON、Spring。这都是业务逻辑层技术的演进变化历史。


在客户端,倒是互联网访问速度越来越快费用越来越低、屏幕越来越大、性能越来越高、内存越来越大,给客户呈现出来的功能越来越多、UI界面越来越复杂。你这个时候想做微服务,其实蛮难的,你受不了诱惑,总想给它添加更多的功能,反正客户端性能高、屏幕大,能承载,没坏处。


但是移动时代从2011年在中国开始了。手机网速慢资费高、性能慢、内存小、屏幕小、没有键盘和鼠标只能手指头划屏幕,所以微信从语音消息而非文字消息崛起了(打字输入实在不好打啊)。


小屏幕,无键盘无鼠标,不好输入也不好输出,那么功能就必须简化再简化。这就倒逼业务逻辑层也不能做的太复杂。因此即使没有亚马逊开除人的六大天条轰顶,微服务在移动时代也算真正被大规模流行起来。现在小程序技术依托微信平台(统一客户、IM、支付),让开发、部署、发布更加简化。


因为人人都有了随时随地可访问的智能设备,所以企业比以往任何一个时代都能更容易连接、触达、交互到最终消费者。所以企业应用开始从企业内部管控建设重心转移到连接消费者、与消费者交互、消费者直接下单交易的业务重心。一个软件的应用的使用主体从可以管控炒鱿鱼的员工,转移到了给企业进行买单交易的衣食父母。


衣食父母不能得罪啊,这是要影响销售业绩的啊,所以需要抓住黏住、快速改进。所以为了快,而不要跨专业职能部门协作,所以各个研发团队也都自行改组,从专业职能部门组织形式改造成为亚马逊式的全职能小团队,这更加助推了微服务的实质化落地。


所以,移动化限制倒逼、衣食父母倒逼,这是移动时代才让大规模万金油程序员学会落地微团队、微项目、微功能、微服务。


二、云时代来了


因为企业应用重心已经从可数的企业员工用户转移到了大规模外界的消费者用户,所以高性能并发、海量数据的技术要求立马上来了。但企业应用开发者一直面对企业内部用户规模,不是互联网企业啊,怎么应对啊,没经验啊。


正好,云时代来了。


提供了分布式对象系统、分布式数据库、分布式大数据技术平台、分布式消息队列中间件。当然,Spring升级成了Spring Cloud,成了分布式微服务中间件。噢耶,终于跨过这个技术门槛了。


别高兴太早了。因为是分布式的,因为是面对海量最终消费者的,所以部署工作成了复杂的了。不像过去做企业内部管理应用,最多也就十来台服务器,人手工都能升级得过来,而且企业员工一下班就能开干。现在都是消费者应用了,消费者都是行为习惯各异需要24x7运行,而且这还是交易型应用,你还不敢断掉,你还不敢一下子全升级了你怕出个交易闪失赔不起钱,所以你还需要灰度发布。


这就需要工具了。


所以DevOps在互联网时代、云计算时代才真正流行开。就是因为:海量用户、在线24x7实时运行、交易型、大规模服务器、快速迭代开发发布上线,不得不开发运维一体化。过去运维人员的技术要求性不高,现在运维人员也得有开发技术能力了。


为了更快捷地打包、分发、部署、升级、维护,人们发明了Docker和K8S。Docker可以打包为一个镜像文件、Docker让微服务的版本环境隔离、Docker让微服务在开发期和运行期一致,这让分发、安装部署、升级、运维变更极为简化。


(4)云原生应用


一、微服务不微是因为什么


微服务不微,是很多人的困惑。


虽然有了全职能微团队(2张披萨饼)、微UI(移动APP和小程序技术)、微项目(每两周迭代发布一次),但微服务仍然不微。


虽然有了满足海量用户高并发的Spring Cloud分布式微服务中间件、有了满足分布式部署和运维的DevOps(Jakins/Docker/k8s),但微服务仍然不微。


问题到底出哪里了?


咱们从开发流程再捋一捋。


软件公司嘛,软件代码是我们的核心资产。所以我们肯定有我们私有的Git源代码库,部署在我们公司的IDC机房里面,而且做层层的安全防护以及代码备份机制。


我们要开发的时候,需要在我们本地安装部署需要的各种框架,才能做本地开发、本地调试。但是现在为了应对高并发分布式中间件、海量大数据存储与计算、人工智能训练、物联网接入,我们需要安装的依赖的技术框架高达40多种以上。光部署调正常这堆框架已经把我们累的精疲力尽,而且这些框架之间随便出点参数变更或版本不兼容问题就搞死人。


好,总算调正常这一堆框架,我们开发完具体业务应用,我们就开始应用DevOps工具和Docker,进行打包、分发、部署。这么多依赖性的框架,你的微服务能微的了吗?


二、云原生应用


正确的打开方式是什么呢?让我们描绘一下。


第一步:你的代码放在云代码平台而非你公司内部私有部署的Git平台上。这就是微软要花大价钱并购Git的原因。这是第一步。为什么要这样做,你接下来就明白了。反正你现在基于云计算、大数据、人工智能、IOT开发具体业务应用的时候,你大量依赖的都是开源平台,就你那点具体业务应用能有多高技术门槛。而且微软接手后的git,对于企业代码的安全保护、备份,比你自己的管理员和运维技术高多了。


第二步:使用云开发平台。这个开发平台可以基于Web浏览器,也可以基于本地VS Code IDE,但云开发平台的核心本质是:你根本不需要在本地安装那么多依赖框架,你在IDE里面写应用,你打开云上Git平台上面的某个源代码文件,import进一个包,然后在IDE里直接调用API,这个云开发平台会自动补全API,你可以保存代码、你可以编译代码、你可以调试代码、你可以运行代码,和你本地一样,但其实是应用运行在云端,应用也是在云端进行打包、安装部署的。


这才是真正的云开发平台,比如AWS的Cloud9。现在有很多李鬼,把20多年前雅奇MIS的那套玩法又拿了出来,快速可视化设计输入表单,图形化进行审批工作流设置,快速可视化设计报表图表,这个东西在全世界也没有独立市场存在过,而且也不是今天我们谈到的云原生应用开发路径上的东西,或者换句话说,那根本不是给开发人员用的。


第三步:使用云服务OpenAPI。云计算厂商把所有的云服务都开放出来Open API(你想想Amazon的六个天条),你可以在这个云开发平台上直接调用这个云计算厂商的所有Open API开放平台里面的API。这些云服务会自己负责自己的安装部署升级、监控、备份、迁移等等。


三、终极:Serverless


最终极的方式是:Serverless。那个时代的IaaS、技术PaaS、应用PaaS、具体业务应用SaaS很丰富,大家都开放Open api,也有Slack、企业微信、钉钉这样的统一门户平台,也有小程序UI前端技术,你打开Web IDE,New一个函数,里面直接调用Open API,你的应用功能就串联起来了。


你也不用在意什么打包、安装部署等细节。当你要运行时,在云端后台,会自动启用一整套DevOps/Docker工具集给你打包,会根据自己的云计算资源给你具体进行安装与部署,你根本不用管是部署到哪个服务器上了。随着你的应用性能,他会去给你自动迁移扩展到更高性能的计算环境中。这一切对于你来说都无感。你每月只需要缴纳一笔总费用即可。


不这样推,开发人员的效率提不上去;不这样推,软件公司只使用云厂商的云硬件资源,其他软件中间件都自行开源部署而不使用云中间件,那样云计算厂商也不容易挣大钱啊,毕竟硬件都是刚性成本,只有软件才是高利润的,尤其是云上部署的分布式中间件服务,更是大规模高利润的。


640?wx_fmt=png


640?wx_fmt=jpeg


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 开了个会:破局企业云通信,华为加速 Buff 开发者!

  • 没有一家公司可以逃避边缘计算 | 技术头条

  • 她高中发明著名算法,保送清华姚班,斯坦福 AI 实验室负责人高徒 | 人物志

  • GitHub 日收 12,000 星,微软新命令行工具引爆程序员圈!

  • 华为员工年薪 200 万!真相让人心酸!

  • 天才程序员:25 岁进贝尔实验室,32 岁创建信息论  琥珀  极客宝宝  5天前

  • 安全顾问反水成黑客, 靠瞎猜盗得5000万美元的以太币, 一个区块链大盗的另类传奇

  • 人造器官新突破!美国科学家3D打印出会“呼吸”的肺 | Science


640?wx_fmt=png真香,朕在看了!

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

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

相关文章

qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式

引言 创建的窗口中含有滚动区域,滚动区域创建了很多按钮,点击按钮后弹出一个弹框,当设置了滚动区域的中心窗口的背景样式后,之前设置好的点击后按钮弹出框的背景样式也跟随着变化了。 方法 究其原因是因为滚动区域的窗口与点击…

MyBatis-Plus_删除操作

删除专栏 文章目录Component public class UserMapperDelTest extends MybatisPlusSamplesChapter1ApplicationTests {Resourceprivate UserMapper userMapper;/*** 根据 ID 删除*/Testpublic void delById() {int rows userMapper.deleteById(1094592041087729666L);System.o…

拙见之drawPath()与fillPath

阐述 此文仅记录标题中说的函数drawPath与fillPath的一点区别。 编写项目的过程中发现drawPath可以根据对画笔和画刷的设置,所绘制的图形含有边框和内部填充颜色,而fillPath即使设置了画笔和画刷的颜色,只会在绘制的图形中填充颜色&#xff…

MyBatis-Plus_AR 模式

查询专栏&#xff1a;MP默认查询原则 查询的是数据库列名非实体类属性 文章目录AR 模式1. 实体类对象继承Model2. 接口服务类继承baseMapper接口3. 测试ARAR 模式 1. 实体类对象继承Model EqualsAndHashCode(callSuper false) Data public class User extends Model<User…

500位开发者要在杭州搞事情!CTA峰会嘉宾全阵容揭秘

戳蓝字“CSDN云计算”关注我们哦&#xff01;扫描二维码&#xff0c;立享折扣。5 月 26 日- 5 月 27 日&#xff0c;由中国 IT 社区 CSDN 与数字经济人才发展中心联合主办的第一届 CTA 核心技术及应用峰会将在杭州国际博览中心召开。首届 CTA 核心技术及应用峰会将围绕人工智能…

记录一种多个按钮中每次只能选中一个的实现方式

阐述 本文旨在说明实现的思路。 当窗口创建很多QPushButton或者QPushButton的子类的时候&#xff0c;若要实现在众多的按钮中&#xff0c;每次被点击的按钮被选中&#xff0c;下一次点击另一个按钮的时候&#xff0c;上一个被选中的按钮恢复被选中之前的颜色&#xff0c;可以使…

MyBatis-Plus_通用service

通用service 文章目录1. 接口类继承 IService2. 接口实现类中继承ServiceImpl1. 接口类继承 IService<T> public interface UserService extends IService<User> { }2. 接口实现类中继承ServiceImpl<M,T> Service public class UserServiceImpl extends Se…

Storm精华问答 | Spark与Storm的区别有哪些?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Storm是Twitter开源的分布式实时大数据处理框架&#xff0c;被业界称为实时版Hadoop。随着越来越多的场景对Hadoop的MapReduce高延迟无法容忍&#xff0c;比如网站统计、推荐系统、预警系统、金融系统等&#xff0c; 大数据实时处理…

Qt中颜色选择框输出所选中的颜色值

引言 颜色选择框可以选择自己喜欢的颜色&#xff0c;然后点击确定按钮&#xff0c;对应的在相应的代码中可以获取所选择的颜色&#xff0c;将选中的颜色以能够看懂的方式输出&#xff0c;这里就可以用所选颜色的r,g,b值&#xff0c;即输出对应的红&#xff0c;绿&#xff0c;蓝…

Git回滚代码到某个commit

回退命令&#xff1a; $ git reset --hard HEAD^ 回退到上个版本 $ git reset --hard HEAD~3 回退到前3次提交之前&#xff0c;以此类推&#xff0c;回退到n次提交之前 $ git reset --hard commit_id 退到/进到 指定commit的sha码

中国 CDN 编年史

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;CDN的全称是&#xff08;Content Delivery Network&#xff09;&#xff0c;即内容分发…

qt中实现绘制图形与截图

引言 实现可以选择线型&#xff0c;线宽&#xff0c;颜色&#xff0c;是否填充图形来绘制各种常见的图形&#xff0c;同时可以选择矩形区域来实现截图。 效果 绘图的效果如上&#xff0c;截图的效果&#xff1a; 实现 项目使用的qt5.13.2,编译器为MSVC2017_64bit&#xff…

Spring基础环境搭建

创建一个父工程springdubbo&#xff0c;3个子工程分别为服务端provider&#xff0c;客户端consumer &#xff0c;接口api 选择都选择maven quickstart即可 在main目录下面创建resources文件夹&#xff0c;并且让idea识别&#xff0c;选择中右击&#xff1a; 给父工程添加依赖…

VMware vSphere 6.0 虚拟机运维常见问题排除

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;当您将VMware vSphere 6.0虚拟化平台架构中的vCenter、ESXi主机、Data Center、群集完…

C++试题

引言 今天看题的时候&#xff0c;发现一道题看着挺简单&#xff0c;写了一下&#xff0c;输出正确。感觉解的挺好的&#xff0c;下面记录一下。 题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#…

Windows下Zookeeper启动zkServer.cmd闪退问题的解决方案

本人今天在使用RPC的过程中使用Zookeeper作为中间节点服务器。在windows中启动Zookeeper 在windows启动Zookeeper双击zkServer.cmd&#xff08;但是需要保证安装了java环境&#xff09; 但是我单击启动的时候闪退&#xff1a;原因可以找到&#xff0c;编辑工具打开zkServer.c…

c++中快速排序

引言 快速排序一直是排序算法中使用比较高频的一种算法。下面简述一下快排&#xff0c;予以记录。 实现思想 在一组无序的数组中&#xff0c;定义一个标志flag&#xff0c;这里以数组中左起第一个元素作为标志&#xff0c;定义一个i值和j值&#xff0c;分别表示从左边开始与…

2019 年 Q1 全球云基础设施市场份额揭晓,AWS继续领跑市场;Mesos官方回应Twitter“抛弃”Mesos……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;重磅先知 2019 年 Q1 全球云基础设施市场份额揭晓Mesos官方回应Twitter“抛弃”Mesos国内唯一&#xff0c;阿里云论文连续两年入选国际数据库顶级会议SIGMOD甲骨文中国研发中心大裁员&#xff1a;离职赔偿N6重磅快报2019 年 Q1 全球…

springboot启动报错LoggerFactory is not a Logback LoggerContext but Logback...

由于springboot默认日志组件为logback&#xff0c;当时项目使用的为log4j&#xff0c;在打war包到tomcat启动时报如上错误。 原因&#xff1a;log4j日志组件和自带logback日志组件冲突。 解决方法: 将默认日志组件排除。 <dependency><groupId>org.springframew…

postman使用过程中body中的form-data,x-www-form-urlencoded,raw,binary的简单记录

引言 初次使用postman不是很清楚怎么使用&#xff0c;就直接上手&#xff0c;不想看postman的使用文档&#xff0c;故而采用直接上手实验的方式&#xff0c;下面记录一下&#xff0c;body在使用的时候的四种类型。 类型说明 form-data&#xff1a;既可以上传键值对&#xff…