本书据说是抛开所有的框架所写的一本书,似乎是用来开发框架所需的前置知识。
如果一个应用是可拓展的,那么他就是线性的,这意味着可以通过添加更多的硬件来获得更强的请求处理能力
有两种方式对性能扩展:
- 垂直扩展,提升单台CPU的数量或者性能
- 水平扩展,通过增加计算机的数量来增加性能
因此GO语言拥有非常优奕的并发支持,一个Go Web应用只需要使用一个操作系统线程,便可以通过调度来高效运行十万个goroutine.
尽管Go是一门静态类型语言,但是用户可以通过它的接口机制对行为进行描述,来实现动态类型批评。Go语言的函数可以接受接口作为参数,这意味着用户只要实现了接口所需的方法,就可以在继续使用现有代码的同时想系统引入新的代码。并且Go语言的所有类型都实现了空接口,所以只要用户创建出一个接受空接口作为参数的函数,就可以调用任何类型的值作为参数
Go语言也常常被用作微服务,在微服务框架中,大型应用通常由多个规模较小的独立服务组合而成,这些独立服务可以相互替换,这样会使web应用变得模块化
Web应用的工作原理
从纯粹而狭隘的角度来看,Web应用应该是这样的计算机程序:它对客户端发送的HTTP请求做出响应,并通过HTTP响应降将HTML回传至客户端,如果按照这种定义来看,Web服务器和Web应用没有区别
实际上这两者的区别在于web服务器如httpd和Apache会监视特定的目录并在收到请求时返回位于该目录的文件,但是web应用并不会简单的返回文件,它会对请求处理,病执行程序中预先设定好的程序,所以其实我们可以把web服务器当成是一种特殊的web应用
应用
应用是一个与用户进行互动并帮助用户执行指定活动的软件程序。比如记账系统、人力资源系统等。Web应用都是部署在Web之上,并通Web来使用的应用
满足Web应用的两个条件:
- 这个程序必须向发送命令的请求客户端返回HTML,客户端会展示渲染后的HTML
- 这个程序在向客户端传送数据时必须使用HTTP协议
请求方法(待补充)
- GET:命令服务器返回相对的资源
- HEAD:类似,但是常用于不获取报文主体的情况取得响应的首部
- POST:命令服务器将报文主体的数据传递给url指定的资源,实际效果取决于服务器
- PUT:命令服务器将报文的主体中的数据设置为URL指定的资源。如果URL指定的位置已经存在,那么用报文主体数据去代替已有数据,如果不存在就创建
- DELETE:命令服务器删除URL资源
- TRACE:命令服务器返回请求本身。通过这个方法,客户端可以知道介于它和服务器之间的其他服务怎么处理请求
- OPTIONS:返回支持的HTTP方法类别
- CONNECT:用于设置SSL隧道来开启https
- PATCH:命令服务器使用报文主体数据对URL指定资源修改
在这其中注意这三种方法POST DELETE PUT 都能对服务器的状态进行修改,所以不安全,其中POST不幂等,DELETE PUT 幂等,幂等的含义是第二次调用不对服务器状态产生任何改变
html现在不支持PUT和DELETE 但是可以通过XMLHttpRequest l来支持
web应用的各个组成部分
web应用就是执行以下任务的程序:
(1)通过HTTP协议,以HTTP请求报文的形式获取客户端输入
(2)对HTTP请求报文处理,并执行必要操作
(3)生成HTML,并以HTTP响应报文的形式将其返回给客户端
为了完成这些任务,web应用分为处理器和模板引擎
处理器
用MVC架构来说处理器就是 控制器和模型。在理想的MVC架构中,控制器应该苗条,它应该只包含路由代码以及HTTP报文的解包和打包逻辑,模型应该丰满,包含应用的逻辑以及数据,使用MVC框架进行Web应用开发的新手通常认为MVC模式是开发Web应用的唯一方式,但Web应用本质上只是一个通过Http协议与用户互动的程序,所以可以选择任何一种模式。
但是为了防止模型变得过于臃肿,且出于代码复用的需要,我们可以用服务对象或者函数对模型操作,尽管服务对象并不是MVC模式,但是把相同的逻辑放置到服务对象中,并将一个同一服务对象应用到不同的模型之上,可以有效避免在多个模型里面复制相同代码的窘境
所以我们也可以采用讲将控制器和模型合并, 然后由处理器直接执行所有操作并向客户端返回响应
模板(略)
Hello go
package main
import{
"fmt"
"net/http"
}
func handler(writer http.ResponseWriter,request *http.Request){
fmt.Fprintf(writer,"Hello World,%s",request.URL.Path[1:])
}
func main(){
http.HandleFunc("/",handler)
http.ListenAndServe(":8087",nil)
}
//就绪之后打开终端,执行一下命令
$ go install filename
//执行之后会创建一个filename的二进制执行文件
对其他语言来说,需要部署到应用服务器上,并由应用服务器为Web应用提供运行环境,对go来说,web的运行环境直接由net/http包提供,这个包和应用源代码会一起被编译成可快速部署的web应用