客户端与服务端的职责
应用的客户端跟服务端是两个独立的应用,客户端主要负责给用户提供一套操作界面,也就是用户可以通过客户端使用我们开发的应用提供的功能,比如发布内容、浏览内容、销售产品等等。应用的服务端一般会放在服务器上运行,主要负责给客户端提供各种服务,比如存储客户端发过来的数据,提供客户端需要的数据,处理各种后台任务等等。
服务端技术选择
有很多技术都可以开发服务端应用,比如 PHP、Python、Go、Java、Node 等等,任何一种技术你都能找到价值几十亿的成功的案例。所以对于初学者来说,在没有明确的需求跟目标情况下,选择学习哪一种服务端技术都是可以的,不需要花太多时间做选择,看谁顺眼就先从谁那里开始。抛开技术本身,其实很多应用开发的概念,还有解决问题的思路都是相通的,所以我们只需要先掌握其中任何一种服务端应用开发技术就行了,以后如果有特定的需求或者目标,我们可以随时再切换到其它的服务端技术。
服务端应用可以连接数据服务,负责处理应用里的数据,数据服务是数据仓库管理系统提供的。在一台服务器上安装了数据库管理系统,运行之后它就会提供一个数据服务,服务端应用可以连接使用这个数据服务。如果应用需要存储数据,可以让服务端通过数据服务把这些数据放到数据仓库里,需要的时候可以再让服务端通过数据服务把需要的数据从数据仓库里提取出来。
数据仓库服务
数据库管理系统有很多种不同的类型,有些比较通用,有些比较擅长做某一类的事情。每一种类型的数据库管理系统又有各自的一些不同的品牌,比如 MySQL、PostgreSQL 属于关系型数据库系统(relational database),MongoDB 是文档型的数据库(document-oriented database),Neo4j 是 Graph 类型的数据仓库。关系型的数据库比较通用,所以在没有特定需求的情况下可以优先选择这种类型的数据库。如果需要处理非常复杂的内容关系,可以考虑选择一种 Graph 类型的数据库。
应用接口(API)
服务端应用提供的服务或者叫功能,可以通过接口的方式对外公开,这里说的接口指的是 API(application programming interface),客户端可以通过服务端提供的接口使用接口对应的功能。在服务端实现一个功能可能要去做很多事情,但对于客户端来说,并不需要操心这些事情,客户端只需要按服务端设计好的那样使用它提供的对应的接口就行了。
我们可以用一个现实的例子理解一下接口这个概念,如果把车比作应用的话,那它的启动按钮、方向盘、档杆、油门,这些都可以看成是车子提供的接口。点按启动按钮以后车子就会启动,我们并不需要操心按了这个启动按钮以后这台车具体都做了些什么,只需要知道按了它以后得到的结果就是这台车会启动。
服务端应用对外提供的接口一般就是一个地址,或者叫网址,客户端可以通过网络,请求使用这个接口地址完成它要做的事情。比如客户端要验证用户的身份完成用户登录,获取需要展示的内容数据等等,要完成这些事情,客户端就可以去请求对应的服务端接口。
服务端提供的应用接口可以支持一些参数,客户端请求使用带参数的接口地址的时候,可以设置地址参数的值,服务端可以根据参数值去做一些动态处理。比如应用需要一个接口来提供用户相关的数据,我们并不需要给每一个用户单独设计一个接口,只需要定义一个带参数的接口,这个参数一般就是用户的 ID,这样接口可以根据请求里的这个参数值,在数据仓库里动态获取到指定的用户数据,再把数据交给客户端使用。
接口设计风格(REST 与 GraphQL)
应用接口的设计有一些风格可以选择,比如 REST 与 GraphQL 是现在比较流行的接口设计风格。我们也可以把它们想成是接口的设计规范。通常我们需要先学习设计 REST 这种风格的接口,因为它仍然是目前最广泛应用的一种风格,相比 GraphQL ,这种风格的接口做起来也更简单一些。后期我们可以再了解一下 GraphQL 这种风格的接口设计。
应用架构(单体与微服务)
服务端应用的架构现在主要有两种,单体应用与微服务。如果我们把应用需要的所有服务全部都放在一个服务端应用里面,这种架构的服务端应用叫单体应用(monolithic application)。如果把应用的服务分割成不同的部分,每个部分都是一个单独的应用可以单独运行在不同的地方,这种架构的服务端应用就是微服务(microservices)。
比如我们的服务端需要验证用户的身份、管理用户、发送邮件、管理订阅、处理订单等等,如果使用单体架构来设计应用,所有这些功能、服务都会放在同一个服务端应用里。如果我们选择的是微服务架构,那这些不同的功能都可以定义成一个独立的应用,比如验证用户身份可以是一个应用,发送邮件也可以是一个单独的应用,应用运行起来以后一般都会提供一个对应的服务,比如发送邮件这个应用运行以后可以提供发送邮件的服务,这些不同的服务之间可以用某种方式相互沟通交流。