C++语言程序设计之C++参与WEB应用开发(二)
小标 2018-07-10 来源 : 阅读 826 评论 0

摘要:本文主要向大家介绍了C++语言程序设计之C++参与WEB应用开发,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言程序设计之C++参与WEB应用开发,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

增值你的C++技能,C++参与WEB应用开发(二)。上篇我们讲了半天,关键结论只有三:

1) 想用C++参与Web后台开发,首先需要掌握好C++啊,这是废话,但借这个废话我安利了自己的书。

2)其实当前Web后端,基本不用考虑跨平台的事。这里补充一下:作为一个跨平台开发的推崇者,我在本文系列推荐的开源框架, 以及所写的每一行C++代码,都是可以跨平台的。只是在环境部署上,我只会讲一个平台。

3)后端向前端送的数据,既有业务数据,又有界面数据。我们将采用在前面组装数据的作法,因为这可以让C++写的后台,纯之又纯。在实际项目中,C++吐出来的数据,既是微信里的HTML5微店的后台,又是Android和iOS移动端APP的后台,后台为三者定制的开发工作量极低。我们把安卓和iOS的前端开发外包了。我的小伙伴在负责给外包的人接口说明,安卓APP已经在使用中,但我其实还没见过外包的人,所以我觉得这个架构在前后端的分工清晰和沟通效率看,暂时还是可行的。

一、说一下前后端分离

所谓前后端分离,重点不是哪里是前,哪里是后。有人说浏览器是前端,后台服务器是后端,但淘宝有人提到的前后端分享,其中的“前”的内容,有好大一部分部署在服务器上。

前后端分离,就是指 展现的逻辑,要和 业务的逻辑 分离。也别扯什么“逻辑”了,再大白话讲就是 “处理展现的代码(操作)”,和 “处理业务的代码(操作)” 要分开。而“处理业务的代码(操作)”它主要在干什么呢?主要就是处理业务数据,包括数据的读入生成、加工处理等。至于这些业务数据处理好之后,要如何显示给用户看,那有另一部分数据及代码在控制。如果是WEB编程,那么展现方法当然主要是通过 HTML、CSS、JS。如果是移动应用,那就是安卓或苹果的应用。举个看似很简单的例子:我们想向用户显示一行话:

“大家好!现在是 15点18分50秒。”

差劲的做法是直接将这整句话都当成业务数据。在代码直接敲入这段话,再从网络上发送给前端,让前端收到展示到屏幕上就好。这就叫“耦合”,把展现的方式和展现内容,绑死了。想一想有一天,想换一种更亲切的方式和用户打招呼,比如:

“亲,都15点18分50秒了,您不想来一杯午后咖啡吗?”

用户因为感动,一点“咖啡”就打开我们程知网开的程序员咖啡店。

那天15点18分50秒,你其实还趴在屏幕前睡着,作为一名后端程序员,你太累了,可是你的宿敌,前端工程师过来摇醒你,“死样,起来改程序啦!!!!”

这就是耦合的带来的问题,一个小改动,也要同时惊动前后端工程师。

如果当初后端,就只负责吐出 “15点18分50秒” 呢? 事情立即有了改观,管它什么“大家好”还是“亲”,管它什么“现在是”还是“都”,更不管它后面要卖的是咖啡还是避孕套,都是前端的事情,我后端就是输出一个当前的服务器时间,那些关我屁事?

有没有比比输出“15点18分50秒”还要合理的呢? 有人说前端也能取时间呀!干脆后端程序员都不干事了——哦!这样不行,事情推脱太干净了,我们会失业的。咱们假设这个需求,就是必须由后端给出服务器的时间。

更好的做法,其实是要输出一个UNIX的时间戳就好,就是一个整数,比如15324234(通常代表距离1970年某月某日到现在的秒数)。然后前端其实有的是方法将它转换成他们想要的格式,比如说,他们想显示给老外看,或者想在屏幕上显示一块指针形式的石英表,如果我们给的 “15点18分50秒”,就实在显得太不专业人士了。我说“点,分,秒”,这三个汉字,以及它们之间的次序不是业务数据而是展现数据,你能接受吗?

现在就很好理解什么叫 “业务逻辑”,它是后端要做的事:取当前服务器时间,然后吐给前端。什么叫“业务数据”,就是一个最本质,毫无格式的,完整并最简地表达时间的那个整数 15324234。什么叫“展现逻辑”,拿到一个15324234,然后将它转换你要的时间,再将它变成一个指针式的石英钟图形,或者再为它加上一串当前时间点适合推销的商品链接……这叫“展现逻辑”。那什么是“展现数据”呢? 石英钟底盘应该是一张图片吧? 它位于页面左上角还是右下角?链接的文字颜色是什么?字体是什么?这些都是“展现数据”。

等等。我们不是要做全栈工程吗? 。全栈就意味着前端后端都不是一个人做?这还有什么好区分展现数据业务数据的吗?不管怎样,午觉都是要被叫醒的啊!话都说到这里,我把我另一个狼子野心也说一下吧:很小的公司不得不全栈工程开发,因为没钱请人。很大公司可以有全栈开发,因为请得起一班什么都牛叉的牛人,并且允许他们慢工出细活地折腾……在数量上占绝大多数公司,还是要术业有专工的——但是!在精细分工同时,必须有那么一些人,他们懂开发的全过程中的很多细节。这些人叫全栈工程师。我的意思很直接:所谓全栈工程师,不一定要全栈开发。

想让一个学JS的突然搞C++或Java,很难。想让一个搞Java的突然学习C++,也有些难。整个公司里,你懂C++,会Java,还居然懂HTML+CSS+JS……同学,我看好你的专业和职场发展! ——这是我对大家的非份要求: 学任何技术,一是要有兴趣,二是如何有兴趣要知道自己为什么要有兴趣,三是如果没有兴趣要知道如何让自己有兴趣。 程知网 就是在用这种套路组织IT教程。

二、说一下架构

接着说一下比较高大上,其实WEB应用系统的常规结构,已经老套得不再能老套了,我下面写的很也老套。但是大家不要就此不往下看呀!什么理由留住各位呢? 容我啰嗦一阵。

读者在上网一搜索,能找出什么双11淘宝的后台如何扛住亿万访问,什么腾讯春节微信发红包,如何扛数十亿的访问,还有什么12306线上火车票订票系统如何应对抢票系统的(还记得那些雷人图片验证吗)?

那些都很牛,但其实对多数开发人员没什么用,除了娱乐以外。那就像新闻里天天有范冰冰、林志玲的事,可各位真能学到什么吗,就算看多悟出什么你可这个环境,有这个团队,有这个实际需求来实践一把?看黄教主和Baby大婚,看了也就看了,对单身汪们有什么帮助吗?大多数时候,我们写的WEB应用,有百万级用户就不错了。1秒内并发有十万,你那些天天钻研微信淘宝架构的同事写的系统可能挂掉了,因为他们天天钻研志玲嘉玲美玲贾玲,但一生都没得实践;但你写的WEB应用可能坚挺,因为,俺写的东西,它真的可以实践。

再说了,不经历10万、100万的经验和教训,就直接叫嚣着要搞个1000万甚至上亿访问量系统的程序员,都和义和团差不多。

假设我们花了点小钱,从阿里去或腾讯那租了几台虚拟服务器,然后把我们的系统部署上去,部署结构大概是这样:

 

黄色小圈标注1到5,是五类服务器。其中第2类将来最有可能平行扩展部署,即图中的2-2,2-3 “克隆”机。克隆是想代表,它们基本就是从2-1号机的复制品,不需要额外的程序开发。

就算2号机不做克隆,那也要向阿里一下子买5台服务器?别着急,实际我一开始开发也只买一台机器。意思是我把所有系统全部署安装在1号机了(得严肃说一下,实际项目中,买几台服务器由我们提建议,然而客户出钱。我这里是按大家站在学习角度来考虑买服务器)。

咦?图中还有个跑着浏览器0号机?这个0号机比较有趣。它可能是0台(你的系统没人愿意用),也可以是1台(你自己在测试?)实际运行时则有可能是1千台,1万台,10万台,30万台……并且这个0号机可能是台式机、笔记本电脑 、平板或手机。说这么多众所周知的话,只是想提醒大家:别不把访问你的WEB系统的终端不当机器。不管台式机还是手机它们也都有强大的计算能力、存储能力。我们部署的系统会有一大块和展示相关的处理工作,要交由这些机器上的各种浏览器,让它们去计算去渲染……别忘了我们上一篇和本篇一开始就说的,要把界面数据和业务数据组装的工作,彻底交给前端实现,而前端就是这些千台万台的终端(人民群众的力量无穷无劲……)

那晚夜深人静,当我做下这个决定后,我听到后台那五台,啊不,由于穷其实只有一台的服务器,轻松地吐了一口气。

(一)1号机:Web服务

作为一名C/C++程序员,我们要在这台服务器上部署世界顶级质量的C代码,我估计有十几万行,都不是我们写的,是战斗的民族的某个程序员写的。关于Nginx,居然还有不熟悉的人吗?那就上网搜索一下吧。它已经是全球WEB服务器的大赢家了。是被我归为“神器”级别的软件之一。

不能因为这样牛叉软件是用C写的,我们作为一个C++程序员就觉得沾光的。 nginx 是一个Web服务而已,而不是应用容器,因此它后面可以支撑PHP或JAVA或其它语言写的网站。作C/C++程序员,唯一可以吹牛的是:咦,如果有一天祖国,啊不,是项目需要我,那我可以直接为nginx写扩展……当然,如果你的C/C++技能还很菜,你还是别吹了。不管怎样,这是我们作为C++程序员的一个增值方向嘛!再说一遍:现在不用nginx的网站真的好少好少,所以这个方向的市场可以的哦。

在我们的架构里,Web 服务(nginx)会放一堆网页文件,比如 .html文件, .css文件,.js文件。当然还有一堆的 图片文件,png或jpeg,还有视频,音频等等。我们会向阿里或腾讯申请一个互联网IP及相关域名,通常也指向这台机器。也就是说,当用户打开浏览器,输入我们Web系统的网址,首先访问到就这台机器,然后这台机就会“吐”出所有上面的.html等文件数据给浏览器。接前面例子来说,我们示例某个html文件要显示时间的内容,示意是:

您好!现在是。

这可能不是很正确的HTML的语法。关于HTML、CSS什么的,不是本系列的重点,讲不完的,还不懂的请自学,w3school. 是个非常好不错的学习网站。

注意看上面示意的内容,里面是看不到 “15点18分50秒”的,因为业务数据完全被剥离了,nginx只负责“吐”出 展现数据。展现数据完全就是一个html文件,觉得展现得不爽,随时可以打开修改一下,和C++程序没有关系。

动态数据怎么拿呢?通过某些配置,我们可以让nginx向流水线的下一道工序发起请求:哎,现在几点了? 他的下一道工序就是2号机,业务服务器。

取一个时间实在不是个事儿,但终有一天,2号机要做的事情会越来越多,越来繁杂,此时就可以请实施工程师,将2号机里的程序,一模一样部署在多台服务器上,并在nginx中配置,以实现nginx以某种负载均衡的策略,访问后面那一堆2号机。

当然,我们现在是全栈工程师,所以我们必须懂nginx有关负载均衡等配置。

(二)2号机:业务服务

“业务”是中文叫法,英文就是 “business”。依我们现在的例子要干的一票生意,就只是取一个系统时间,很熟悉的C++代码:

return std::time(null_ptr);

不过,这样返回的一个std::time_t类型的整数,怎么最终交到浏览器那里呢? 显然得先吐给 nginx。这就需要解决nginx和我们的C++程序之间的通信对话问题,包括开什么“车”(网络协议标准),“货”用什么包装(报文格式标准)等。为了解决这样的问题,我们当然可以脱下裤子跳进泥潭里自己定个规范,自己码代码实现。但这不是我们的风格。本系列里,我推荐我在私活里用的CPPCMS开源项目实现。那本是一个WEB应用容器,但我们只需用它对JSON-RPC的实现。 JSON-RPC名字透露:它和nginx之间将采用 JSON格式的报文对话。RPC有不懂的,上网查。


(三)3\4\5号机: 数据服务

就为吐回一个时间,好像不需要数据库,缓存什么的。不过,如果2号机有多台,那么各自吐回去的时间岂不有可能不一致?如果是写一个网店,像用户,商品,订单等,需要存储在数据库中。

应对数十万或百来万用户的小型的业务系统,单一数据库加单一缓存基本可以应付得来。

缓存数据相比数据库(可称为持久数据),特别是访问更快(因为它基本都在内存里),但就是不持久(重启机器后,会丢)。虽然redis也支持持久,但我们还果适度坚持这个原则:要放在缓存中的数据,就是要允许它丢。

什么样的数据允许丢呢? 无非两种情况:

一是丢了以后反正可以重新得到的数据。比如商城中,每个用户进入后,假设要让他看到今天的热推荐的十几款商品。这个列表其实来自商城的后台管理系统 (另一个故事了)。每日推荐的商品,自然就应当是每过一天才更新一次。所以可以设置缓存的时效是第二天就好了。

二是真的丢了不也会造成老板开除你,或者客户到你公司门口冰天雪地跪求你还给他的数据,比如购物车数据。

我们设置这个单一缓存,还有一个重要用户。因为是Web应用,前端浏览器基本不为我们保留什么状态,比如最简单的:这个用户登录成功了没有? 这就有个经典的设计,需要用户的当前状态保存起来,称为“会话数据”。这也可以使用缓存。反正“会话数据”丢失,大不了就是让用户重新登录。

架构里还有个5号机,这可真是“经验之谈”呀。它负责“后期数据”处理。我其实更想叫它 “排队事务”服务。想想我们的商城在搞抽奖,有100个名额的机会,可以注册本网站就免费送一个杜蕾丝!没有什么吸引力?免费送一个女朋友!(保证1:1真人倒模)。一下子有十几万个程序员过来注册。我们不会傻到让程序一边处理这十几万注册请求,一边就开始抽看谁中奖。正确做法是让写入缓存,然后依靠“排队事务”服务慢慢抽奖去。可能这个例子让你觉得太浮夸,另i举一例,如果开微店,那是需要不时地和腾讯的微信服务器交道的,这个打交道的过程,微信服务接口的说明也写得很清楚:

每个应用只能一个后台来,不要并发地来搞我。(我记得的大意就是这样的,可能人家腾讯会写得委婉一点。)

简单地说,时效要求不高,并且往往不能并行处理的逻辑,但往往都是很关键的操作,都交给这台排队事务服务处理了。

 本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程