后台开发:核心技术与应用实践导读

后台开发:核心技术与应用实践

徐晓鑫 著

图书在版编目(CIP)数据

后台开发:核心技术与应用实践 / 徐晓鑫著. —北京:机械工业出版社,2016.8

ISBN 978-7-111-54339-8

I. 后… II. 徐… III. 网络-开发 IV. TP393.092

中国版本图书馆CIP数据核字(2016)第167884号

后台开发:核心技术与应用实践

出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037)

责任编辑:李 艺 责任校对:董纪丽

印  刷: 版  次:2016年8月第1版第1次印刷

开  本:186mm×240mm 1/16 印  张:26.5

书  号:ISBN 978-7-111-54339-8 定  价:79.00元

凡购本书,如有缺页、倒页、脱页,由本社发行部调换

客服热线:(010)88379426 88361066 投稿热线:(010)88379604

购书热线:(010)68326294 88379649 68995259 读者信箱:hzit@hzbook.com

版权所有 ? 侵权必究

封底无防伪标均为盗版

本书法律顾问:北京大成律师事务所 韩光/邹晓东

Preface?序

C++可能是计算机历史上最早被发明的高级程序语言,同时也是当今最活跃的程序设计语言之一。C++很强大,强大到你可以使用它做任何层面的开发;C++也很脆弱,脆弱到需要程序员自己去控制内存回收,一个不小心就会使整个程序Core Dump。C++语言的创始人Bjarne Stroustrup曾私下承认,为了提高C++程序员的薪水和地位,在设计C++编译器版本过程中有意地增加了C++语言的难度,使C++更偏向于资深程序员的使用习惯,提高学习门槛,从而增加C++程序员的身价。学习曲线的增加并不是没有任何回报的,在服务端后台开发、处理多并发的海量网络请求方面,C++语言有天然的优势。因此,当应用的用户量、并发量迅速增长,达到一定量级之后,后端服务的技术架构都会转变为Linux C++。

要做一名优秀的使用C++进行后台开发的程序员,只掌握C++语言是远远不够的,还需要掌握如何进行编译、链接、调试,如何使用网络协议、IO模型和一些常用的类库,等等。我曾经面试过不少后台开发程序员,他们往往很重视语言本身,但是对一些语言之外的东西理解不够透彻,影响了他们的技术发展。我也读过不少相关方面的技术书籍,往往都过多地停留在语言层面,忽略了实际开发工作中需要用到的知识。

晓鑫在腾讯从事开发工作多年,有丰富的后台开发经验,她从实际的后台开发经验出发,讲解了后台开发中需要用到的方方面面的知识。从C++语言出发,又不止于C++语言,本书可以说是一本Linux C++后台开发的实战典范。当知道晓鑫在写这么一本书的时候,我真心为国内的众多开发者感到高兴。如果读者有意愿成为一名从事Linux后台开发的程序员,本书无疑是一本最佳的参考书籍。

研发是一项讲究实战的工作,一切不从实际工作出发的技术书籍都是纸上谈兵,没有实际意义。一本优秀的技术书籍应该是这样的:当读者按照书中的内容进行实操的时候,读者写的每一行代码都是有价值的,能够在实际工作中派上用场。本书恰好做到了这一点。这是一位技术书籍作者对读者的起码诚意。

软件工程师是一种需要坚定、踏实、精益求精的“工匠精神”的职业,心浮气躁、得过且过的态度不可能把代码写好。老一辈的人说“字如其人”,在软件领域,我们同样可以说“代码如其人”,一个人的行事风格和为人态度都会体现到他所写的代码上面。按照晓鑫的书去学习,读者可以潜移默化地学习到她多年后台开发所炼就的“工匠精神”。我想,相对于所学习到的知识,这于一个工程师来说更为重要。

黄世飞

腾讯云平台技术总监

Introduction?绪  论

0.1 什么是后台开发

听到“后台开发”这个词,估计读者心中都或多或少会有一些自己的感性认识,这种认识可能有一些差别,但估计大部分人都有这么一种看法:“后台开发”是编写一些用户看不见的程序,也就是非界面的程序,既不是网页,也不是App,更不是桌面程序,因为这些都是用户看得见的(被称为“前台开发”)。这种感性认识在一定程度上是正确的,但是它不够具体,也不够全面。

我们这里所说的“后台开发”的确是用户“看不见”的部分,但是还有很多界面性的程序是给企业内部人员使用的,这些虽然是界面程序,但是对于最终用户来说也是“看不见”的。举个例子,开发一个电子商务网站,提供给客户进行商品购买的网页是用户看得见的,不属于“后台”,但是电商网站内部员工使用的“用户管理系统”,“订单管理系统”等,也是用户看不见的,但它们不属于本书中所指的“后台”。在某些场合,或者某些人的习惯中,这些内部使用的系统也叫“后台”,这几种说法都没有错,希望读者在听到的时候,知道说话人具体指的是什么。

本书介绍的“后台开发”指的是“服务端的网络程序开发”,从功能上可以具体描述为:服务器收到客户端发来的请求数据,解析请求数据后处理,最后返回结果,如图0-1所示。

图0-1 后台开发的步骤

这里的SERVER就是本书所指的“后台程序”,或者“服务器”。SERVER接收请求的方式既可以是通过TCP请求包,也可以是HTTP请求包(其实也是TCP连接)。如果是TCP请求,二进制的格式会常见一些;如果是HTTP方式的请求,请求包的格式一般是JSON或者XML,或者自定义的ASCII文本。解析请求包的方式自然是与请求包的格式相对应的,接收到的是什么格式的包,就用对应的格式解析(如果是自定义的格式,就按照自定义的方式去解析)。“处理请求”这一步是后台程序的具体业务逻辑的体现。很多封装好的后台框架会把其他三步都做好,但是这一步还是需要开发者自己去实现,因为只有开发者自己清楚,程序是要去做“登录”还是去做“注册”的事情。“输出回复包”和“接收请求包”是对应的,一般来说,收到的是JSON,那么回复的也是JSON,收到的是XML,那么发送的也是XML,其他格式也是一样的。这四个步骤是所有后台程序都会有的,无论使用什么语言去实现,都可以看到这四个步骤的影子。

CLIENT指的是向SERVER发起请求,并接收SERVER回复的一方,通常称为“客户端”。既然后台程序是通过TCP或者HTTP接收和回复消息的,那么只要是能够发起TCP或者HTTP连接的都可以作为客户端,可以是浏览器、PC端的程序、安卓应用、IOS应用,等等。

0.2 时间就是金钱,效率就是生命

上世纪80年代,在改革开放初期的深圳蛇口,为了加快蛇口港的建设,一块“时间就是金钱,效率就是生命”的巨幅标语矗立在蛇口工业区的马路边(如图0-2所示),拉开了特区建设的序幕。

图0-2 1981年矗立在深圳蛇口工业区的巨幅标语

其实这个口号后面还有两句:“安全就是法律,顾客就是皇帝”,这四句加一起,简直就是当今互联网时代科技公司安身立命的根本。互联网最讲究效率并且一切都从用户体验出发。在腾讯、百度和阿里这样的互联网公司里,每一次的版本发布都是和时间在赛跑。各种以效率为核心的开发团队合作模式被创造:敏捷开发、极限编程、SCRUM、结对编程,双周迭代,等等。

写下这些文字的时候是我在腾讯工作的第五个年头,这五年让我对效率有了更深刻的认识。还是一个学生的时候,和大家一样,我也曾一字不落地读过《UNIX环境高级编程》,《UNIX环境网络编程》一二三卷,《TCP/IP详解》一二三卷,《C++ Primer》等书籍,这些都是非常经典的开发书籍。它们的共同特点是大而全,不漏掉任何一个知识点,并且每个知识点都讲得非常详细。但在实际的开发工作中,可能用到的知识点只有20%,其他的80%则很少用到。这也是我写这本书的初衷:用最短的篇幅,讲解实际后台开发中用到的核心知识点,让读者可以快速进入到实际的开发工作中。

也许有读者会觉得这很急功近利,不利于组建完整的知识体系。其实,软件开发是一门讲究实操的技术,知道多少并不重要,重要的是能够用好多少。如果把一本经典书籍读3遍,但是没有写过一行代码,那可以认为是没有读。边写代码边读书才是最好的学习方式,在读一本技术书籍的时候,最好让自己快速进入写代码的状态,一边写代码,一边通读书籍,在具体需要用到书上某个技术点的时候,再回头仔细阅读相关的章节。在这个循环往复的过程中,才能把书上的知识点转化为自己的知识点。完成多个这样的循环后,再回过头来审视自己已经掌握的知识点,把一些没有掌握的知识点搞清楚。这样的学习过程实际上更有利于完善自己的知识体系。

0.3 后台开发的知识体系

接下来简单介绍一下后台开发的知识体系,也就是说,要完整掌握后台开发,需要掌握哪些知识点,这些知识点也是本书会讲解到的知识点。图0-3展示了对后台开发知识体系一个比较全面的梳理。

以上这六部分知识点会是本书将会覆盖的内容。与专门介绍某一类知识的书籍不同,比如《C++ Primer》介绍C++的方方面面,《UNIX环境编程》介绍UNIX环境编程的方方面面,本书从“实战”的角度出发,介绍“后台开发”需要用到的知识和工具。读完本书,读者可能不会对C++精通,不会对Linux精通,也不会对TCP/IP精通,但是却可以学会如何进行“后台开发”,这些“精通”可以一个个慢慢补全。

图0-3 后台开发工程师技术能力体系图

细心的读者可能会发现,编程语言和编辑器只是其中的一小部分,要把后台开发做好,需要掌握的东西比想象中的要多。同时,这些知识点既有一些纯理解性的内容,也有一些工具性的东西。这也是程序开发的最大特点,既要掌握理论的东西,也要掌握相应的工具,这样才能把理论的知识用起来。在实际开发中,这些工具性的知识可能更重要,因为理论是脑子里想的,但工具产生的东西才是真正的产出,才是开发者最终需要的。

0.4 如何阅读本书

本书以C++为编程语言,讲述后台开发的核心技术与应用实践。全书共13章,在逻辑上分为以下六部分:

第一部分为第1~3章,主要是编程语言方面的知识,包括函数、函数重载、函数模板、数组、指针、引用、结构体和预处理的使用;面向对象的介绍,包括类的使用、继承与派生和类的多态;常用STL的介绍,包括string、vector、map和set的使用方法与原理。如果读者已经对C++非常了解,可以跳过这部分,也可以配合《C++ Primer》一起阅读。

第二部分为第4~5章,主要是编译原理和调试方法相关的知识。编译原理相关知识包含编译与链接的具体过程,makefile的编写、目标文件的内容与处理目标文件相关工具的使用;调试方法相关内容主要介绍了用strace分析系统调用、用gdb调试进程与分析coredump文件、用top命令分析系统负载情况、用ps命令查看系统进程和用valgrind工具分析进程的内存使用情况等。

第三部分为第6~8章,主要是网络相关的知识,包括TCP协议的关键知识点和TCP server的实现,网络IO模型和select、poll与epoll三个重要函数的使用,还有ping、tcpdump、netstat和lsof这四个网络分析工具的使用。掌握这部分知识,读者可以自己独立实现能处理海量请求的TCP server。

第四部分为第9~11章,主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,父子进程、僵尸进程、守护进程和进程间通信的方式。读者可以配合《UNIX环境高级编程》一起阅读。

第五部分是第12章,主要是HTTP协议的介绍与使用、CGI的设计原理与实现和FASTCGI的简单介绍。掌握这部分知识,读者可以轻松实现Web应用的后台交互部分。

第六部分是第13章,通过常用类库JsonCPP和Protobuf的使用,演示如何使用第三方库。

如果读者是后台开发的新手,建议从第1章开始阅读,如果读者已经有后台开发的经验,可以直接选择感兴趣的章节阅读。

0.5 勘误和资源

由于水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为了更好地与读者交流,我专门创建了一个微信公众号,读者可以通过以下二维码关注,与我进行交流。

 

书中的全部源代码可以从华章网站(www.hzbook.com)下载。

0.6 致谢

首先要感谢腾讯公司,让我可以在后台开发的领域里驰骋。

其次要感谢机械工业出版社华章公司的杨福川、高婧雅和李艺,感谢你们在我写作过程中提供的支持,因为有了你们的鼓励和帮助,我才能顺利完成全部书稿。

谨以此书献给我亲爱的家人,以及热爱软件开发的朋友们!

Contents?目  录

绪论

第1章 C++编程常用技术  

后台开发:核心技术与应用实践1.1 第一个C++程序  

1.2 函数  

1.3 数组  

1.4 指针  

1.5 引用  

1.6 结构体、公用体、枚举  

1.6.1 结构体、共用体、枚举的概念  

1.6.2 结构体、共用体在内存单元占用字节数的计算  

1.7 预处理  

1.8 本章小结  

第2章 面向对象的C++  

2.1 类与对象  

2.2 继承与派生  

2.3 类的多态  

2.4 本章小结  

后台开发:核心技术与应用实践第3章 常用STL的使用  

3.1 STL是什么  

3.2 string  

3.3 vector  

3.3.1 vector是什么  

3.3.2 vector的查增删  

3.3.3 vector的内存管理与效率  

3.3.4 Vector类的简单实现  

3.4 map  

3.4.1 map是什么  

3.4.2 map的查增删  

3.4.3 map的原理  

3.5 set  

3.5.1 set是什么  

3.5.2 set的查增删  

3.6 本章小结  

第4章 编译  

4.1 编译与链接  

4.2 makefile的撰写  

4.3 目标文件  

4.3.1 ELF的文件类型  

4.3.2 链接视图下的ELF内容  

4.3.3 执行视图下的ELF内容  

4.3.4 阅读ELF文件的工具——readelf  

4.3.5 获得二进制文件里符号的工具——nm  

4.3.6 减少目标文件大小的工具——strip  

4.4 本章小结  

第5章 调试 

5.1 strace 

5.2 gdb  

5.3 top

5.4 ps  

5.5 Valgrind  

5.5.1 Valgrind概述  

5.5.2 Linux程序内存空间布局  

5.5.3 内存检查原理  

5.5.4 Valgrind安装  

5.5.5 Valgrind使用  

5.6 本章小结  

第6章 TCP协议  

6.1 TCP协议  

6.1.1 网络模型  

6.1.2 TCP头部  

6.1.3 TCP状态流转  

6.1.4 TCP超时重传  

6.1.5 TCP滑动窗口  

6.1.6 TCP拥塞控制 

6.2 TCP网络编程API 

6.3 实现一个TCP server  

6.4 TCP协议选项  

6.5 网络字节序与主机序  

6.6 封包和解包  

6.7 本章小结  

第7章 网络IO模型  

7.1 4种网络IO模型  

7.2 select  

7.3 poll  

7.4 epoll  

7.5 本章小结  

第8章 网络分析工具  

8.1 ping  

8.2 tcpdump  

8.3 netstat 

8.4 lsof  

8.5 本章小结  

第9章 多线程  

9.1 多线程是什么  

9.2 多线程的创建与结束  

9.3 线程的属性  

9.4 多线程同步  

9.5 多线程重入  

9.6 本章小结  

第10章 进程  

10.1 程序与进程  

10.2 进程的创建与结束  

10.3 僵尸进程  

10.4 守护进程  

10.5 本章小结  

第11章 进程间通信  

11.1 管道  

11.2 消息队列  

11.3 共享内存  

11.4 信号量  

11.5 ipcs命令  

11.6 本章小结  

第12章 HTTP协议  

12.1 HTTP协议工作流程  

12.2 HTTP协议结构  

12.3 HTTPS 

12.4 CGI  

12.5 FastCGI  

12.6 本章小结  

第13章 常用类库  

13.1 JSON  

13.2 Protobuf  

13.3 本章小结  

时间: 2024-09-30 19:34:07

后台开发:核心技术与应用实践导读的相关文章

后台开发:核心技术与应用实践

后台开发:核心技术与应用实践 徐晓鑫 著 图书在版编目(CIP)数据 后台开发:核心技术与应用实践 / 徐晓鑫著. -北京:机械工业出版社,2016.8 ISBN 978-7-111-54339-8 I. 后- II. 徐- III. 网络-开发 IV. TP393.092 中国版本图书馆CIP数据核字(2016)第167884号 后台开发:核心技术与应用实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:李 艺 责任校对:董纪丽 印 刷: 版 次:

Android开发:优化ListView实践解析

 在看了一些vogella的文章之后,发现关于android listview性能优化这一段很有意思,于是实践了一下,经过优化,性能确实提升不少! 先看看优化前和优化后的比较: 优化前的log截图: 开发:优化ListView实践解析-"> 优化后的log截图: 并且,在不停滚动ListView的过程中,优化之前会出现ANR现象,在AVD上特别容易复现: 然后,优化后显得很流畅,附上对于的log截图: 下面附上相关代码分析: ListView中的每一个Item由一个ImageView 和一

android-Android后台开发相关书籍资料

问题描述 Android后台开发相关书籍资料 Android APP后台搭建过程,如何使用开发语言实现,请推荐相关书籍,谢谢. 解决方案 <第一行代码> <疯狂Android讲义> <Android群英传> <Android开发艺术探究> 解决方案二: 后台开发相关书籍Android各层开发推荐书籍及资料(转)Android相关开发资料汇总 解决方案三: http://www.jikexueyuan.com/course/2208.html 解决方案四: 深

mysql-app后台开发,如何做好安全性?

问题描述 app后台开发,如何做好安全性? app后台开发一枚,现在要对整个项目做一些安全性,比如拦截非法请求,sql注入什么的 后台开发技术:spring + mybatis + mysql 求一些思路.麻烦了. 解决方案 比如检查密码的sql语句一定要处理特殊字符? = ' 等等,最后还是要写file.将你所设想到的情况全写下来.后期安全还有问题再添加. 解决方案二: 最好安卓请求时要带上自己的用户信息 解决方案三: 接口的话,多加一些加密处理了,然后在登录的时候带token,再就是服务器的

linux 后台开发-后台开发需要些什么东西

问题描述 后台开发需要些什么东西 我是一名大三的学生,想做后台开发,但是又不知道该从哪方面做起.目前Linux c/c++都学的不错,数据结构也学过,SQL.socket网络通信也学过,TCP/IP协议也有一定了解,然后,下一步不知道该干嘛了,我觉得自己学的这些东西比较基础,都不知道怎么怎么能把它们应用实际.望各位大牛能指点迷津 解决方案 这看你想做哪方面的了.linux服务器开发维护,数据库开发维护,网站后台web开发(javawebphp.net等) 解决方案二: 你所学的仅仅是基础,多看看

Linux 后台开发工作中常用的开源库

后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 下载地址: https://www.openssl.org/source/ 2.TinyXML tinyxml 简单,高效,灵活的一套操作 XML 文件的开源库. 下载地址: http://www.grinninglizar

javascript-App后台开发用哪种语言

问题描述 App后台开发用哪种语言 我想问开发一个APP的后台,想实现的功能有实时聊天,图片,视频的上传和下载等, 用java写好,还是其他的好 解决方案 java.php.python.c++.....很多,建议使用java,轮子多,效率高,也可以用python,简单,效率也不低 解决方案二: 后台有很多选择,如果你熟悉android,那么当然选java,那是你熟悉的语言,如果你熟悉js,可以用node.js,其它的语言还有C# VB PHP Ruby Python Go ... 解决方案三:

ios-iOS APP后台开发技术问题请教

问题描述 iOS APP后台开发技术问题请教 如果要搭建一个IOS应用(假设用户量为几十万)的后台服务器,现在比较靠谱的后台架构是怎样的? (先说说我现在的理解,之前做过一些Android开发的事情,当时后台是写了一个简单的Http服务器(利用Netty实现),然后前端和后台的数据交换采用json实现,至于服务器硬件的配置等等没有过考虑.所以我现在可以认识到的后台,就是HTTP请求+Json返回数据.) 想请教一下各位:从服务器硬件到操作系统再到后台技术框架,有没有一个比较系统.成熟.可靠的模式

Java后台开发精选知识图谱

引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习方向,这样才能事半功倍. 我们经常会遇到这样的情况: 一开始学习一门新技术的时候,面对着很多很多陌生的名词,无从下手,一度想要放弃. 本文首先会给出关于java后台开发和前端适配的一些建议学习路线,接着简单解释一些应用到的高频技术,帮助大家理解和学习,算是一个入门篇. Java后台开发知识一览 1.后端