一、服务端存在的意义
首先先假设一个场景吧:小明通过手机上的微信软件给联系人列表中的小花发送了一条消息,小花在微信软件上马上就收到了小明发过来的这条信息。
一个软件可以是单机版的,也可以是网络版的。类似与单机版游戏和网络版游戏。其实很多的软件都是可以不使用网络的,比如美颜修图、录音等。
需要网络的原因在于将数据进行更大范围的传播。比如将美颜好的图片传播给你的好朋友(也是使用这个美颜软件的人),比如将美颜好的图片传播到网络上进行备份保存。
注意刚刚的措辞“进行更大范围的传播”,其实不使用网络,也是可以进行传播的,只不过是小范围的,甚至是点对点的传播,很不方便。这种小范围的传播技术包括蓝牙传播、NFC传播等技术可以实现。
因此,现在的互联网产品,除了一些特殊的软件,客户端+服务器端,就是一个互联网产品的标准配置。产品经理一般在设计产品的时候设计的更多的是客户端产品,不会去设计服务器端的架构。因此就由服务器的开发人员通过分析两个客户端的信息交互和数据传输来确定服务器端需要处理的复杂业务逻辑,并将数据进行存储管理,然后用接口的方式保证客户端与服务器端的之间的交互。
另外需要提出的是,服务器起到了对所有的客户端进行协调处理的角色,并且要保证24小时不间断的响应。因此对服务器的真正考验是当产品的用户量大并且活跃度高的时候,服务器需要承受的巨大的访问压力。这就需要对服务器进行扩容和各种优化,以此来支撑这么庞大的用户量和访问量。
二、常用的服务端技术
和客户端技术一样,服务器技术也分为多种类型,例如常用的服务器开发语言有PHP和Java等。另外,常用到Java语言的开发平台Java EE(Java Enterprise Edition)。PHP是一种脚本语言,可以用作网页开发。PHP有很多现成的框架可以使用,通过框架可以非常简单的实现很多功能。Java EE顾名思义,使用的开发语言是Java,Java EE本身是一个开发框架平台,在这个框架上,可以实现企业级复杂系统的开发,也可以基于这个框架实现很多类型的服务端业务。另外,现在使用比较多的Node.js也是一种服务端开发技术,使用JavaScript语言进行开发,Node.js能实现从网页前端到后端服务的全流程覆盖,是一种灵活性和扩展性都比较好的服务端技术。
除了以上几种服务端技术外,还有以python语言为主的服务端技术和以C#语言为主的ASP.NET等多种服务端技术,不管使用哪种服务端技术,通过这些技术实现在服务端完成的产品业务逻辑,接受来自客户端的请求,根据请求类型进行对应的逻辑处理,处理完成后将处理结构返回给客户端。一个完整的客户端与服务端交互流程就是客户端发起请求、服务端处理请求、服务端将处理结果返回客户端。
在服务端处理请求的部分,可以通过不同的技术选型实现,针对不同的产品或系统类型,往往会选择对应各自特点的技术类型。例如,对平台安全性和支持性较强的产品或系统来说,Java EE企业级开发平台就是一种比较好的选择,一些银行或者政府系统是基于Java EE来开发的。选用Java EE的不足就是体积庞大,而且系统升级和维护成本高,每次系统升级都需要重新编译并打包,这个过程非常漫长,从而导致系统更新和安装成本很高。
如果是一些轻量级产品或者系统,要求快速迭代和快速发布,就可以选择例如PHP或者Node.js这样的服务器技术,这些技术选型的特点就是轻量化,不需要特别编译打包,由于是由脚本语言编写,可以直接运行发布,所以对于一些网站类产品或者做业务逻辑处理的产品服务器,选用这种技术类型是比较合适的。和客户端技术一样,服务端技术也在不断发展,相对来说,服务端技术的要求更高,而且难度要比客户端大,尤其对于一些大型系统,一套良好的服务端技术架构直接决定了后期 产品表现的关键因素。碰到“双十一”时,电商服务器所面临的挑战就是直接考验服务端整体技术实力。服务端的技术比较深,是一门可以深度挖掘的艺术。
三、服务端的基本架构
服务端通常被叫做云端,也就是我们所说的云服务器,云服务器是指物理机房是托管在第三方,而不用自建机房。在有云服务之前,所有的互联网服务都需要自己建立机房,服务器和所有的网络设备都放在机房里。每个机房都由应用服务器、数据库服务器、交换机、网络端口和外网光缆构成。根据不同的机房规模,不同的服务器机房配置和架构略有差异,但基本结构是类似的。
当然,实际生产中的架构会根据具体的业务形态和技术架构有不同的架构方式。首先是从互联网接入,互联网的另一头实际上就是客户端,客户端通过互联网请求访问服务器,请求进来后首先经过负载均衡服务器,负载均衡好比是一个交通指挥调度中心,在车流量比较大的时候,它负责指导和梳理交通,将车流量比较大的路口的车辆分流到相对较小的路口,实现流量的动态平衡。
负载均衡服务器是用来处理大规模请求的服务器,通常对于一些访问量比较高的系统来说,负载均衡就显得尤为重要,负载均衡服务器的作用就是将同时进来的大量访问请求根据应用服务器的忙碌程度进行动态调度,可以把负载均衡服务器理解成服务端的调度中心,它负责流量的动态分配,根据对应的应用服务器的负载情况,动态分配请求到不同的应用服务器。
一个客户端请求经过负载均衡服务器的动态调度后,会被分配到一台API服务器,通常也叫作应用服务器。API服务器主要根据不同的客户端请求进行相应的业务逻辑处理,并将处理完成的结果返回给客户端。同样的应用服务器通常会有多台同时运行,客户端访问量足够大时,一台服务器忙不过来,所以采用多台同时运行来分流处理客户端请求,而分流调度就是通过负载均衡完成的。
举个例子,当我们在“双十一”使用天猫或者淘宝购物时,每秒中产生的访问量都非常巨大,这时天猫和淘宝的服务器就会应对非常大的访问请求,通过负载均衡服务器对应用服务器的响应情况动态分配流量。当我们抢购商品时,会出现排队或者访问不进的情况,然后重新打开请求,有可能会被分配到另一台应用服务器上,若恰巧这台服务器比刚才那台负载量低,我们就有可能正常抢购到商品。
应用服务器下方对应的是数据库服务器,数据库服务器负责运行后端数据库,例如用户通过客户端访问某一个商品信息时,应用服务器会根据用户请求从数据库中查询商品信息并返回给客户端。数据库服务器负责运行系统数据库。一般情况下,会有多台数据库服务器同时运行,因为数据都是核心资产,为了保证系统数据的安全性,在多台数据库服务器上会存储同一份数据。当某台数据库服务器发生异常时,其他的还可以作为备用使用。
另外还有一个与服务器端相关的职业是运维工程师,运维是指对服务器的整体维护和优化,包括产品上线以及配置各种服务器,对数据的备份以及服务器的操作通常都是由运维工程师完成的,运维是一个非常重要的保障职能,产品能无间断地24小时运转,应对突发情况或者动态调整服务器的配置,都依赖于运维工程师对服务器的持续优化。
四、看懂接口和数据格式
数据接口是指客户端于服务端进行数据传输和交互的数据协议,数据接口是一种数据交换的标准。例如,用户通过客户端的登录功能向服务端发起登录请求时,客户端将用户名和密码通过数据接口经过网络传递给服务端,服务端判断处理完成后在将处理结果通过数据接口返回给客户端,客户端根据服务端返回的结果进行登录反馈处理。数据接口扮演的是信息传递者的角色,根据不同的产品功能,对应的数据接口也会有所不用。
数据接口的构成通常是“key-value”的形式,也就是键值对,键(key)代表某一个数据字段所表达的意思,值(value)是这个数据字段的内容,例如,我们可以定义一个最简单的数据接口结构"{username:ryan, password:123}"。在实际应用中有两种常用的数据接口的结构,分别是JSON和XML。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,也是一种用来表示数据接口结构的形式,JSON结构灵活性高,可以进行丰富的数据结构表达,JSON结构易于理解和阅读,也便于计算机进行解析和表达,并且体积小,很适合用作数据接口进行数据传输。根据产品功能的定义,在需要客户端于服务端交互的地方定义好数据接口,然后通过约定好的数据接口进行客户端与服务端的数据交换,就可以实现我们想要达到的产品功能了。
XML(Extensible Markup Language)的全称是可扩展标记语言,与JSON一样,XML也是一种数据交换格式,它也可以用来进行简单的结构化文本数据的存储。XML的结构可以进行自定义,XML的基本元素是由一个一个的标签构成,每一个标签都由标签头和标签尾构成,内容放置在标签头尾之间,例如"
在表达同样的信息量的前提下,XML的结构体积往往是比JSON要大,而且阅读结构不如JSON清晰。所以在大多数的生产开发中,使用JSON作为数据接口进行数据传输和交换的要多一些。但是XML的应用领域也是非常广泛的,例如,在安卓开发中,界面布局文件就是通过XML结构实现的,很多服务器配置文件也都是通过XML结构实现的,在有些系统实现中,也通过XML表示数据接口进行数据传输,但现在的主流是使用JSON结构。
五、服务端与客户端的交互过程
客户端与服务端交互的过程,数据和信息就是通过网络进行传递的,而传递的载体就是数据接口,数据接口的体现形式有JSON和XML。其实客户端不是直接与服务端进行交互的,中间还有一层网络。客户端为了能够顺利的进行网络请求,需要遵循网络协议。比如http、https、tfs等网络协议。客户端+网络+服务端三者构成的交互模型也就是请求响应模型,这是互联网技术产品实现信息交互的一种数据交换模型,通过这个模型主要完成信息的发送、处理和响应。
六、服务器的部署以及运维
当我们开发完一个产品后就需要将产品发布上线,上线后就可以提供给用户使用。这个“上线”究竟是上线到哪里呢?其实就是把我们开发完成的系统部署到公网服务器上,公网就是公开网络,我们平时能够使用到的产品服务都是部署在公网上的。部署过程就好比我们在生产线上生产好了产品,然后将成品上架到货架上进行销售。传统互联网时代,如果要自己开发一个产品,服务器的部署通常是需要自建机房,然后将服务器放在自己的机房里,机房的设置通常包括服务器、网络、交换机等,对于要求比较高的机房还需要配备备用电源和冷却系统,因为如果服务器压力过大会出现温度上升而导致服务器宕机或损坏。这种自建机房的方式往往成本较高,而且需要自行购买和配置机房硬件,后期的维护成本也比较大。不过现在已经有了新的选择,就是云服务。我们可以租用云服务提供商的机房,然后将我们的服务端部署到云端,这样我们只需要按使用情况支付给云服务商一定的费用就可以正常运行了。
这里还有很多的运维职责和理论的知识,在这里不展开细说。另外有一点需要注意的是,开发环境、测试环境、正式环境三者的关系和部署方案,是重点,后面我会出一篇文章尽力表述。
七、最近很火的各种云服务器
对于中小型的企业来说,租用云服务商提供的服务器机房是很划算的。因为自建机房的话,不仅要各种硬件设备的购买、备用电源、冷却系统、遇到紧急情况升级服务器硬件、24小时轮班执勤的运维人员、服务器的维护和升级(包括防病毒侵袭等),算下来这是一笔不小的开支,所以这些事交由云服务商去做吧,包括紧急情况想升级服务器,只需要在线购买就可以立即配置升级,方便快捷。更多的云服务信息,请自行百度阿里云、腾讯云、亚马逊云等等。商品种类多多,还经常做活动,相信总有一款适合你。
声明:上面的内容大多数摘抄于《产品经理必懂的技术那点事儿》书中的部分章节。好的知识,共享共用,希望自己的努力能为国家的富强作出一些贡献。