[Go Web开发 | 青训营笔记]

83 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 6 天。

今天,我主要学习了Go语言中关于Web开发的相关知识,包括标准网络库,ORM框架,RPC框架和HTTP框架。

一、标准网络库

在Go语言中,内置了一个 net/http 库,它包含了很多现代Web开发所需的功能。

  1. 客户端(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)
     }
    
  2. 服务端(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等众多选择。