这是我参与「第五届青训营」伴学笔记创作活动的第 6 天。
今天,我主要学习了Go语言中关于Web开发的相关知识,包括标准网络库,ORM框架,RPC框架和HTTP框架。
一、标准网络库
在Go语言中,内置了一个 net/http 库,它包含了很多现代Web开发所需的功能。
-
客户端(Client)
包内包含了一个 Client 类型,用来发出HTTP请求和响应,例如:
client := &http.Client{ Timeout: 30 * time.Second, }当我们需要构建一个请求的时候,我们需要先构建一个*http.Request实例,将上下文、方法和URL传给他。此外,如果我构建了一个PUT/POST之类的请求,还需要将请求的内容设置成io.Reader类型并作为最后一个参数传入。
req, err = http.NewRequestWithContext(context.Background(), http.MethodGet, "https://www.baidu.com/sth", nil) if err != nil { panic(err) }得到了实例后,我们给他设一个消息头,随后Do一下就可以了:
req.Header.Add("777", "Study") res, err := client.Do(req) if err != nil { panic(err) } -
服务端(Server)
相比于客户端,Go语言更适合进行服务器开发。HTTP服务端基于http.Server和http.Handler接口实现。
对于Handler,这个接口定义了一个方法:
type Handler interface { ServeHTTP(http.ResponseWriter, *http.Request) }request就是我们上面提到的请求,而前者则也是一个接口,定义了三个方法:
type ResponseWriter interface { Header() http.Header Write([]byte) (int, error) WriteHeader(statusCode int) }接下来,我们就会尝试构建一个简单的HTTP服务器:
type HelloHandler struct{} func (hh HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello!\n")) } // s := http.Server{ Addr: ":8080", ReadTimeout : 30 * time.Second, WriteTimeout : 90 * time.Second, Handler: HelloHandler{} } err := s.ListenAndServe() if (err != nil) { //TODO }
二、Web开发框架
一般来说,我们不会直接使用标准库自带的工具来直接进行开发(即使是Go这种已经很不错的库也是如此),而是会基于实际场景进行一定的封装等,衍生出各种各样的工具与框架。
2.1 ORM框架
ORM的全称是 Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。举例来说就是,我定义一个对象,那就对应着一张表,这个对象的实例,就对应着表中的一条记录。
在传统开发中,我们可能为了操纵数据库,需要花费各种心思尝试拼接出一个合格的SQL语句,随后查询得到结果。但是使用一个优秀的ORM框架的情况下,我们完全可以用”面向对象“的原则来对数据进行CRUD操作,后面的SQL生成和优化啥的就完全给框架处理。
目前,gorm是Go Web开发中较为常见的一个ORM框架。
2.2 RPC框架
RPC (Remote Procedure Call),即远程过程调用,是分布式系统常见的一种通信方法,它是一个完整的远程调用方案,它包括了:接口规范、序列化反序列化规范、通信协议等。
由于业务的扩展,我们往往将大业务拆分成若干个微服务,而这些微服务之间往往需要互相通信,这时候就需要RPC框架了。
2.3 HTTP框架
虽然net/http包很不错,但一切都是比较而言。在日常开发中,我们肯定希望使用一些更加高度封装的框架系统。在这一个领域,Go语言有着gin, beego等众多选择。