精华内容
下载资源
问答
  • 精讲!!! Web服务器基础http协议

    千次阅读 2020-08-30 17:17:12
    web服务器基础http协议web基础版本Web 1.0Web 2.0域名概述域名注册网页的概念HTTP协议HTTP协议概述HTTP方法GET方法POST方法HTTP状态码生产环境常见的HTTP状态码 web基础 版本 Web 1.0 以编辑为特征,网站提供给...

    web基础

    版本

    Web 1.0

    • 以编辑为特征,网站提供给用户的内容是编辑处理后的,然后用户阅读网站提供的内容
    • 这个过程是网站到用户的单向行为

    Web 2.0

    • 更注重与呵护的交互作用,用户既是网站内容的消费者(浏览者),也是网站内容的创造者
    • 加强了网站与用户之间的互动,网站内容基于用户提供,网站的诸多功能也由用户参与建设,实现了网站与用户双向的交流与参与
    • Web2.0特征
      • 用户分享,以兴趣为聚合点的社群,开放的平台,活跃的用户

    域名概述

    • 域名的概念
      • IP地址不易记忆
    • 早期使用Hosts文件解析域名
      • 主机名称重复
      • 主机维护困难

    在这里插入图片描述

    • DNS(Domain Name System 域名系统)
      • 分布式1
      • 层次性
      • DNS很重要。一但DNS被劫持,数据就很危险了
    • 域名空间结构
      • 根域
      • 顶级域
        + 组织域
        + 国家/地区域名
      • 二级域名
      • FQDN=主机名.DNS后缀

    在这里插入图片描述

    域名注册

    • 域名注册式Internet中用于解决地址对应问题的一种方法
    • 遵循先申请先注册原则
    • 域名注册步骤1
      在这里插入图片描述

    网页的概念

    • 网页
      • 纯文本格式文件
      • 编写语言为HTML
      • 在用户的浏览器中被“翻译”成网页形式显示出来
    • 网站
      • 由一个一个页面构成的,式多个网页的结合体
    • 主页
      • 打开网址后出现的第一个网页称为网站1主页(或首页)
    • 域名
      • 浏览网页时输入的网站
    • HTTP
      • 用来传输网页时通信协议
    • URL
      • 是一种万维网寻址系统
    • HTML
      • 用来编写网页的超文本标记语言
    • 超链接
      • 超链接是将网站中不同网页链接起来的功能
    • 发布
      • 将制作好的网页上传到服务器供用户访问的过程

    HTTP协议

    HTTP协议概述

    • HTTP协议是互联网上应用最为广泛的一种网络协议,设计这个协议的目的是为了发布和接收Web服务器上的HTML页面
    • HTTP协议的版本
      • HTTP 0.9
      • HTTP 1.0
      • HTTP 1.1
      • HTTP 2.0

    在这里插入图片描述

    HTTP方法

    • HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)
    • 每条HTTP请求报文都包含一个方法,告诉服务器要执行什么动作
      • 获取一个Web页面
      • 运行一个网关程序
      • 删除一个文件等
    • HTTP协议有多种获得Web资源的方法
    • 常用的方法:GET和POST
    HTTP方法描述
    GET请求获取Request-URI所标识的资源
    PUT请求服务器存储一个资源,并用Request-URI作为其标识
    DELETE请求服务器删除Request-URI所1标识的资源
    POST在Request-URI所标识的资源后附加新的数据
    HEAD请求获取由Request-URI所标识的资源的响应消息报头

    GET方法

    • GET方法:从指定的服务器上获得数据
      • GET请求能被缓存
      • GET请求会保存在浏览器的浏览记录里
      • GET请求有长度的限制
      • 主要用于获取数据
      • 查询的字符串会显示在URL中,不安全

    POST方法

    • POST方法:提交数据给指定服务器处理
      • POST请求不能被缓存
      • POST请求不会保存在浏览器的浏览记录里
      • POST请求没有长度限制
      • 查询的字符串不会显示在URL中,比较安全

    HTTP状态码

    • 当使用浏览器访问某一个URL,会根据处理情况返回相应的处理状态
    • 通常正常的状态码为2xx,3xx(如200)
    • 如果出现异常会返回4xx,5xx(如404)
    状态码首位已定义范围分类
    1xx100-101信息提示
    2xx200-206成功
    3xx300-305重定向
    4xx400-415客户端错误
    5xx500-505服务器错误

    生产环境常见的HTTP状态码

    消息描述
    200 OK请求成功
    301 Moved Permantly请求的永久页面跳转
    403 Forbidden禁止访问该页面
    404 Not Found服务器无法找到被请求的页面
    500 Internal Server Error内部服务器错误
    502 Bad Gateway无效网关
    503 Service Unavailable当前服务器不可用
    504 Gateway Timeout网关请求超时

    在这里插入图片描述

    展开全文
  • HTTP 协议 golang web 应用服务

    千次阅读 2017-10-31 16:25:25
    本文仅是介绍 golang web 应用与服务的 hello world 的工作原理,开发工具等。

    HTTP 协议 与 golang web 应用服务

    本文仅是介绍 golang web 应用与服务的 hello world 的工作原理,开发工具等。

    本文要点:
    1. 分布式计算 “C/S架构”知识
    2. HTTP 协议基础知识;协议分析工具 curl
    3. Golang web 应用搭建、工作原理、源代码阅读、程序设计技巧
    4. Web 应用框架,压力测试工具 ab

    前提条件:
    1. OO 思想在 Golang 应用
    2. OS 并发基础知识
    3. 了解 socket 通讯与 stream
    4. 了解 python tornado 框架、Java web 应用服务器框架最好

    本文档代码位置:https://github.com/pmlpml/golang-learning/tree/master/web

    1、C/S 架构

    在分布式计算中,计算机之间协作最基础、最简单的结构就是 C/S 架构 。一个 进程 扮演 Server 提供服务,一个或多个 进程 扮演 Client 发起服务请求。C/S架构( Client–Server model )应用及其广泛,从关系数据库服务、到web应用、电子邮局、FTP服务、以及我们现在见到的大多数 云服务 都是C/S架构应用。

    C/S架构通讯模型如图所示:

    +----------+           Request ->             +----------+
    |          |--------------------------------->|          |
    |  Client  |                                  |  Server  |
    |          |<---------------------------------|          |
    +----------+           <- Response            +----------+

    这里,我们看出C/S架构通讯非常简单。如同 client 问“你吃过了吗?”,server 回答“吃了红烧肉”,但是,server 不能主动反问“你吃了吗?”。 问题是为什么要做这样的限制……
    当然,在许多应用中也需要突破这样的限制,于是就有了一些辅助技术手段… 例如 websocket

    C/S架构编程手段很多,用socket直接编程不是很方便吗?如果仅编写一个没有任何工业用途的 “toy” 程序,可以这样做。 但是,一个好的服务程序,必须满足 高可靠高可用(7*24)高性能可伸缩高开发效率安全可扩展 等特性。例如,做一个服务全球的订票服务系统开发,就必须支持这些特性。 基于 HTTP 协议的 web service,不仅开发简单,而且能满足产业界的要求,随着“云服务”技术的发展,近几年大规模普及。

    2、HTTP 协议基础

    The Hypertext Transfer Protocol ( HTTP ) is an application protocol for distributed, collaborative, hypermedia information systems.

    HTTP 协议是一个复杂的协议, 支持虚拟主机、消息路由(负载均衡)、分段下载、缓存服务、安全认证等等。 HTTP 也是非常简单文本协议。 客户端与服务器建立 TCP 连接后,客户端发出 Request 文本, 服务器端返回 Response 文本。

    HTTP 是应用层协议,传输建立在传输层 TCP 协议基础之上。 例如:用户在浏览器中输入 http://www.sysu.edu.cn/ 浏览器与服务器之间发生了什么呢?

    1. 浏览器:请求 DNS 解析 www.sysu.edu.cn 得到 121.46.26.52
    2. 浏览器:用 socket 与 服务器 121.46.26.52:80 发起 TCP 连接请求
    3. 服务器:Accept 客户端请求,建立该连接
    4. 浏览器:向服务器写信息(字符流),Request
    5. 服务器:按浏览器的请求,返回客户端信息(字符流)Response
    6. 浏览器:断开连接,让双方释放资源

    其中: Request 与 Response 的约定,就是 HTTP 协议。 HTTP/1.1 标准就是 RFC 2616

    2.1 HTTP 协议基本格式

    Request 文本格式

    它是三段式的文本(命令行、header、body)

    GET / HTTP/1.1              #第一行:第一个单词 - 方法;第二个单词 - uri; 协议与版本     
    Host: www.example.com       #第2-n行,都是  key:value 格式,称为 headers
    ...
    CRLF                        #header 结束标识
    message-body                #按heahder指令处理

    Request methods

    Request第一行第一个单词( 大写 ), 例如 GET、HEAD、POST、PUT、DELETE等。

    • GET 读取 uri 指向的信息
    • HEAD 查询 uri 指向的信息
    • PUT 写入 uri 指向的信息
    • DELETE 写入 uri 指向的信息
    • POST 提交表单

    URI & URL

    统一资源标识(URI),即要访问对象(文件)的路径和参数

    统一资源定位符(URL)。例如:

    https://www.baidu.com/s?ie=utf-8&wd=toy
    
    协议://主机/文件路径#标签?查询字符串

    Header

    那就不是几句话能搞定的问题,HTTP的服务功能约定几乎全部由头的语义定义。例如:

    Host: www.example.com

    表示这台服务器上,叫 www.example.com 域名的 web 服务提供服务,这样实现了一台服务器,一个 IP 地址支持多个域名的 web 应用。当 Apache, Nginx 等服务器收到这个指令,应用把请求交给指定域的服务。

    更多Head的信息参考:List of HTTP header fields

    又例如,服务器怎么知道的用的手机的型号、操作系统、浏览器类型?

    User-Agent: ...

    然后,你又问,如何多线程下载呢? 那需要知道 Resopnse 的 headers

    Response 文本格式

    也是同样的三段式(状态行、headers、body),例如:

    HTTP/1.1 200 OK
    Date: Mon, 23 May 2005 22:38:34 GMT
    Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
    Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    ETag: "3f80f-1b6-3e1cb03b"
    Content-Type: text/html; charset=UTF-8
    Content-Length: 138
    Accept-Ranges: bytes
    Connection: close
    
    <html>
    <head>
      <title>An Example Page</title>
    </head>
    <body>
      Hello World, this is a very simple HTML document.
    </body>
    </html>

    返回状态

    第一行:协议,状态编码,状态名称。

    • 1xx Informational responses
    • 2xx Success
      • 200 OK
      • 204 No Content
    • 3xx Redirection
      • 301 Moved Permanently
    • 4xx Client errors
      • 403 Forbidden
      • 404 Not Found
    • 5xx Server errors
      • 500 Internal Server Error
      • 501 Not Implemented

    更多参见:List of HTTP status codes

    Header

    更多Head的信息参考:List of HTTP header fields

    Query String

    URL的查询字符串是“?”后面以“&”分割的若干 K = V 对。或者 POST 请求正文部分内容。

    https://www.baidu.com/s?ie=utf-8&wd=toy
    
    协议://主机/文件路径#标签?查询字符串

    2.2 HTTP 协议工具

    浏览器

    几乎所有现代浏览器都自带开发者工具,Network 标签就是!

    实验: 访问 http://www.sysu.edu.cn/ , 请问:

    • 这个网页总共发出多少次请求?
    • 访问 /2012/cn/index.htm 的 Request 和 response 的 Headers 是?
    • User-Agent 的内容是?

    curl

    curl 才是 web 开发者最常用的利器。它是一个控制台程序,可以精确控制 HTTP 请求的每一个细节。实战中,配合 shell 程序,我们可以简单,重复给服务器发送不同的请求序列,调试程序或分析输出。curl 是 linux 系统自带的命令行工具。

    实验: 用 curl 访问 http://www.sysu.edu.cn/

    $curl -v http://www.sysu.edu.cn/
    * About to connect() to www.sysu.edu.cn port 80 (#0)
    *   Trying 121.46.26.52...
    * Connected to www.sysu.edu.cn (121.46.26.52) port 80 (#0)
    > GET / HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: www.sysu.edu.cn
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Vary: Accept-Encoding
    < Content-Type: text/html
    < Accept-Ranges: bytes
    < ETag: "974272193"
    < Last-Modified: Thu, 11 Apr 2013 06:43:52 GMT
    < Content-Length: 357
    < Date: Sun, 29 Oct 2017 13:53:00 GMT
    < Server: lighttpd/1.4.35
    <
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="refresh" content="0;url=/2012">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>中山大学 SUN YAT-SEN UNIVERSITY</title>
    
    
    </html>
    * Connection #0 to host www.sysu.edu.cn left intact

    curl 才是你未来的工具,浏览器工具是给前端大神玩的,系统工程师表示不屑任何复杂的玩意。这多简单:

    第一个符号

    • * 表示 curl 任务;
    • > 发送的信息;
    • < 返回的信息

    请问:

    • 中大 web 服务器是什么软件
    • 这是中大的首页吗?

    3、编写简单的 web 应用

    本部分任务是通过 golang 的 http 包编写简单程序,了解 web 服务器处理 http 协议的过程。

    3.1 搭建简单 web 服务器

    package main
    
    import (
        "fmt"
        "net/http"
        "strings"
        "log"
    )
    
    func sayhelloName(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()  //解析参数,默认是不会解析的
        fmt.Println(r.Form)  //这些信息是输出到服务器端的打印信息
        fmt.Println("path", r.URL.Path)
        fmt.Println("scheme", r.URL.Scheme)
        fmt.Println(r.Form["url_long"])
        for k, v := range r.Form {
            fmt.Println("key:", k)
            fmt.Println("val:", strings.Join(v, ""))
        }
        fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
    }
    
    func main() {
        http.HandleFunc("/", sayhelloName)       //设置访问的路由
        err := http.ListenAndServe(":9090", nil) //设置监听的端口
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }

    go run 运行它! 这个时候其实已经在9090端口监听http链接请求了。

    打开另一个控制台,用 curl -v http://localhost/ 看结果。

    $ curl -v http://localhost:9090/
    * About to connect() to localhost port 9090 (#0)
    *   Trying ::1...
    * Connected to localhost (::1) port 9090 (#0)
    > GET / HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: localhost:9090
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Date: Sun, 29 Oct 2017 23:39:11 GMT
    < Content-Length: 14
    < Content-Type: text/plain; charset=utf-8
    <
    * Connection #0 to host localhost left intact

    可以换一个地址试试:http://localhost:9090/?url_long=111&url_long=222

    上面的代码,要编写一个Web服务器很简单,只要调用http包的两个函数就可以了。

    如果你以前是PHP程序员,那你也许就会问,我们的nginx、apache服务器不需要吗?Go就是不需要这些,因为他直接就监听tcp端口了,做了nginx做的事情,然后sayhelloName这个其实就是我们写的逻辑函数了,跟php里面的控制层(controller)函数类似。
    如果你以前是Python程序员,那么你一定听说过tornado,这个代码和他是不是很像,对,没错,Go就是拥有类似Python这样动态语言的特性,写Web应用很方便。
    如果你以前是Ruby程序员,会发现和ROR的/script/server启动有点类似。

    我们看到Go通过简单的几行代码就已经运行起来一个Web服务了,而且这个Web服务内部有支持高并发的特性。

    难道有了 go, Nginx、Apache,Lighttpd 就和我们 bye-bye 了?
    – “Too Young, too naive”

    3.2 HTTP 服务器运行机制

    Web服务的工作模式的流程 图:

    Web服务

    1. 创建一个 ServerSocket,绑定 地址和端口,侦听。等待客户端连接;
    2. 客户端创建 Socket, 连接
    3. 服务端 Accept,生成对应的 Socket
      • 如果你网络课编写过 Socket 通讯,认为简单那就错了!
      • 服务器要服务 100K+ 的连接,可以吗? 需要知道 epoll 或 iocp ,即 non-block 通讯!
      • 当然,你现在可以忽视它们,因为几乎所有 web 服务器都使用了它们。
    4. 与客户端通讯的 FD 有了,建立端对端通讯的方案有(以下名词可能让你迷惑):
      • 进程服务客户(典型 FastCGI)
      • 线程(典型 Java web 服务,如 Tomcat)
      • 协程 + 异步回调(典型 nodejs)
      • 或单进程阻塞应用(python tornado) + WSGI
    5. 端对端处理一个 Request 与 Response

    web工作方式的几个概念

    你暂时可以不用了解分布式技术的细节,以下是服务器端的几个重要概念:

    • Request:用户请求的信息,用来解析用户的请求信息,包括post、get、cookie、url等信息
    • Response:服务器需要反馈给客户端的信息
    • Conn:用户的每次请求链接
    • Handler:处理请求和生成返回信息的处理逻辑

    3.3 golang 处理 HTTP 请求的过程

    本部分是学习 http 包的一些代码,同时学习面向对象的一些技巧。在应用中学习…

    接口回调技术

    ctrl 键点函数名ListenAndServe

    这个函数和 Cobra 的 Execcute 类似,创建默认的 Server 数据,调用它的同名方法。
    其中,Handler 是一个接口

    // A Handler responds to an HTTP request.
    //
    // ServeHTTP should write reply headers and data to the ResponseWriter
    // ...
    type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
    }

    为了解耦(分离) 调用者 Caller 和 执行者 Callee 之间的逻辑,最常用的手段就是面向接口的编程(OO 思想的核心之一)。
    这样,用户可以自定义处理逻辑,而服务者只需要知道接口抽象的接口。

    // ListenAndServe always returns a non-nil error.
    func ListenAndServe(addr string, handler Handler) error {
        server := &Server{Addr: addr, Handler: handler}
        return server.ListenAndServe()
    }

    逻辑分离原理图:

    +----------+      use interface      +-----------+
    |  Caller  |------------------------>| Interface |
    +----------+                         +-----------+
                                              ^
                                              |
                                     +------------------+                                          
                                     |  unknown Callee  |
                                     +------------------+                                   

    这里,由于 handler = nil 则会调用默认的处理逻辑 DefaultServeMux 的实现。

    // serverHandler delegates to either the server's Handler or
    // DefaultServeMux and also handles "OPTIONS *" requests.
    type serverHandler struct {
        srv *Server
    }
    
    func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
        handler := sh.srv.Handler
        if handler == nil {
            handler = DefaultServeMux
        }
        if req.RequestURI == "*" && req.Method == "OPTIONS" {
            handler = globalOptionsHandler{}
        }
        handler.ServeHTTP(rw, req)
    }

    代码第一句, http.HandleFunc 函数则会构造一个 muxEntry 把对应 URL 处理程序注入 DefaultServeMux

    思考: 函数回调 与 接口回调 有什么区别? 使用场景?

    golang 的 web 服务流程

    ListenAndServe(addr string, handler Handler)
      + server.ListenAndServe()
        | net.Listen("tcp", addr)
        + srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
          | srv.setupHTTP2_Serve()
          | baseCtx := context.Background()
          + for {}
            | l.Accept()
            |  + select ... //为什么
            | c := srv.newConn(rw)
            | c.setState(c.rwc, StateNew) // before Serve can return
            + go c.serve(ctx) // 新的链接 goroutine
              | ...  // 构建 w , r
              | serverHandler{c.server}.ServeHTTP(w, w.req)
              | ...  // after Serve

    详细文字描述见:Go的http包详解

    serverHandler{c.server}.ServeHTTP(w, w.req) 实现每个 conn 对应一个 serverHandler 的处理函数。(见前面)

    拦截 DefaultServeMux

    每个人都有一颗做框架的心,当然你可以重写库,这里研究如何拦截 DefaultServeMux 做一些身份认证工作。

    package main
    
    import (
        "fmt"
        "log"
        "net/http"
        "strings"
    )
    
    type MyMux struct {
        defaultMux *http.ServeMux
    }
    
    func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        fmt.Println("do some extension here!")
        if p.defaultMux == nil {
            p.defaultMux = http.DefaultServeMux
        }
        p.defaultMux.ServeHTTP(w, r)
        return
    }
    
    func sayhelloName(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()       //解析参数,默认是不会解析的
        fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
        fmt.Println("path", r.URL.Path)
        fmt.Println("scheme", r.URL.Scheme)
        fmt.Println(r.Form["url_long"])
        for k, v := range r.Form {
            fmt.Println("key:", k)
            fmt.Println("val:", strings.Join(v, ""))
        }
        fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
    }
    
    func main() {
        http.HandleFunc("/", sayhelloName)            //设置访问的路由
        err := http.ListenAndServe(":9090", &MyMux{}) //设置监听的端口
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }

    运行结果是什么?

    为什么要拦截,给一些理由 … …

    1. DefaultServeMux 功能太有限 (why? 提示参见代码:func pathMatch 实现)

    4、 golang web 开发框架

    由于 DefaultServeMux 仅是一个 demo ,当你需要使用正则表达式、或提取 path 中参数(如: /user/your-name)时,就搞不定了。 Go语言选择了让程序员自由发挥!
    (go 库设计原则 - 简单,简单,简单,可扩展!)

    4.1 web 框架与选择综合症

    经过程序员多年自由发挥,你现在不得不面临海量的选择,有轻量级(做小部件,模仿 tonardo)、中重量(模仿 python Flask, 只提供 MVC 基础服务)、重量级(Java MVC,ORM 等等)。以下仅是建议:

    如果你考虑高性能,请自己测试不同的框架。如何测试?

    4.2 开发产品级 cloudgo 应用

    程序非常简单,它发布了一个 hello user 的 web 服务。请自己阅读代码,它用了哪些库:

    main.go

    package main
    
    import (
        "os"
    
        "github.com/pmlpml/golang-learning/web/cloudgo/service"
        flag "github.com/spf13/pflag"
    )
    
    const (
        PORT string = "8080"
    )
    
    func main() {
        port := os.Getenv("PORT")
        if len(port) == 0 {
            port = PORT
        }
    
        pPort := flag.StringP("port", "p", PORT, "PORT for httpd listening")
        flag.Parse()
        if len(*pPort) != 0 {
            port = *pPort
        }
    
        server := service.NewServer()
        server.Run(":" + port)
    }

    service/server.go

    package service
    
    import (
        "net/http"
    
        "github.com/codegangsta/negroni"
        "github.com/gorilla/mux"
        "github.com/unrolled/render"
    )
    
    // NewServer configures and returns a Server.
    func NewServer() *negroni.Negroni {
    
        formatter := render.New(render.Options{
            IndentJSON: true,
        })
    
        n := negroni.Classic()
        mx := mux.NewRouter()
    
        initRoutes(mx, formatter)
    
        n.UseHandler(mx)
        return n
    }
    
    func initRoutes(mx *mux.Router, formatter *render.Render) {
        mx.HandleFunc("/hello/{id}", testHandler(formatter)).Methods("GET")
    }
    
    func testHandler(formatter *render.Render) http.HandlerFunc {
    
        return func(w http.ResponseWriter, req *http.Request) {
            vars := mux.Vars(req)
            id := vars["id"]
            formatter.JSON(w, http.StatusOK, struct{ Test string }{"Hello " + id})
        }
    }

    运行程序:

    $ go run ./web/cloudgo/main.go -p9090
    [negroni] listening on :9090
    [negroni] 2017-10-31T14:37:42+08:00 | 200 |      277.524µs | localhost:9090 | GET /hello/testuser

    测试用命令:

    $ curl -v http://localhost:9090/hello/testuser
    * About to connect() to localhost port 9090 (#0)
    *   Trying ::1...
    * Connected to localhost (::1) port 9090 (#0)
    > GET /hello/testuser HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: localhost:9090
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Content-Type: application/json; charset=UTF-8
    < Date: Tue, 31 Oct 2017 06:37:42 GMT
    < Content-Length: 31
    <
    {
      "Test": "Hello testuser"
    }
    * Connection #0 to host localhost left intact

    很酷的程序,程序扩展自然,几乎没有任何累赘。用户程序可读性也好,下一步就是处理输入、输出。

    压力测试

    安装 Apache web 压力测试程序(以 centos 为例):

    yum -y install httpd-tools

    执行压力测试:

    $ ab -n 1000 -c 100 http://localhost:9090/hello/your
    This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
    ...
    Server Software:        
    Server Hostname:        localhost
    Server Port:            9090
    
    Document Path:          /hello/your
    Document Length:        27 bytes
    
    Concurrency Level:      100
    Time taken for tests:   0.200 seconds
    Complete requests:      1000
    Failed requests:        0
    Write errors:           0
    Total transferred:      150000 bytes
    HTML transferred:       27000 bytes
    Requests per second:    4996.33 [#/sec] (mean)
    Time per request:       20.015 [ms] (mean)
    Time per request:       0.200 [ms] (mean, across all concurrent requests)
    Transfer rate:          731.88 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    4   3.0      3      12
    Processing:     1   15   6.7     14      53
    Waiting:        1   12   6.5     11      51
    Total:          2   19   7.1     18      55
    
    Percentage of the requests served within a certain time (ms)
      50%     18
      66%     21
      75%     22
      80%     24
      90%     28
      95%     32
      98%     39
      99%     40
     100%     55 (longest request)
    

    具体安装、命令参数与结果解释参考:CentOS服务器Http压力测试之ab

    3、小结

    通过对 net/http 包解析,你应该对 http 协议的工作原理和实现技术有初步了解,了解一些常用的 web 开发组件。也许你对 golang 的“简单、简单、简单”理念有了更好的理解!简单、高效是有代价的,需要你具备高超的程序设计技能,学习这些技能最好的老师就是 golang 的源代码与优秀框架的设计。

    展开全文
  • 什么是HTTP协议? 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守

    JavaWeb服务器的配置使用

     WEB开发的前景

    软件开发的两种架构:B/S 和 C/S

     随着网络带宽的不断提升,云计算概念的提出,浏览器只要足够强大,c/s架构立马就会被淘汰,不仅c/s架构会被淘汰,软件最终都会消失、操作系统都可以没有,最终将会是b/s架构的天下,也就是浏览器+搜索引擎的天下。所有现在桌面软件提供的功能,最后都由网站提供,也就是说,将来打开电脑就是一个浏览器,想要什么服务,通过搜索引擎一找,就可以在网上找到相应的服务,用就是了。所以web开发人员是现在最流行的岗位。


    WEB 开发的相关知识

    WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。
    Internet上供外界访问的web资源分为:
    • 静态web资源(如HTML页面):指web页面中供人们浏览的数据始终是不变的。
    • 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。
    静态web资源开发技术: HTML
    常用的动态web资源开发技术:
    • JSP/Servlet、ASP、PHP、Python等
    • 在JAVA中,动态的web资源开发技术统称为Javaweb。
    WEB系统是怎样通信的?

    WEB开发中的服务器:

    服务器原理:网络编程
    服务器的概念:
    • 硬件:就是一台电脑
    • 软件:需要在这台电脑上安装服务器的软件
    • 如果一台电脑上安装了服务器的软件的话,那么这台电脑就可以成为WEB服务器。
    访问:
    • IP+端口号
    • 如果是域名—>解析成IP地址—>www.baidu.com
    • 如果默认端口是80 的可以不写
    常见的WEB服务器:
    WebLogic是BEA公司的产品,是目前应用最广泛的WEB服务器,支持JavaEES规范,而且不断地完善适应新的开发求,启动界面如下图:


    另一个常用的WEB服务器是IBM公司的WebSphere,支持J2EE规范,启动界面如下:


    在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的WEB服务器:Tomcat,该服务器支持全部的JSP以及Servlet规范,启动界面如下:


    Tomcat服务器

    Tomcat官方站点:http://jakarta.apache.org
    获取Tomcat安装程序包
    tar.gz(zip)文件是Linux操作系统下的安装版本
    exe文件是Windows系统下的安装版本
    zip文件是Windows系统下的压缩版本 
    安装Tomcat --- 配置JAVA_HOME

    注意事项:
    Tomcat的服务器不能安装或解压放到含有中文和空格的路径的文件夹内。
    如果想要启动服务器,必须安装java和配置JAVA_HOME。
    可以在startup.bat的文件中最后一行加入暂停字符:pause

    双击 bin 目录下的 startup.bat 文件
    输入 http://localhost:8080/,显示如下界面代表安装成功


    Tomcat常见的启动问题:

     (1)JAVA_HOME 环境变量
    • 在Windows中设置JAVA_HOME环境变量
    • JAVA_HOME路径必须是JDK不可以是JRE
    (2)端口占用问题
    • WindowsXP使用Fport工具
    • win7使用DOS命令netstat  -ano  
    • win7自带World wide web publish IIS 服务默认占用端口80
    (3)CATALINA_HOME环境变量的设置问题(主要用于在DOS命令中启动Tomcat)

    Tomcat的端口占用问题:

     同时启动了多个Tomcat(MyEclipse)
    (1)将占用了的8080端口的程序结束掉。
    • 如果是XP系统,可以使用工具Fport.exe来找到占用8080端口的应用程序,在任务管理器中结束该程序。
    • 通用版:在cmd命令窗口输入netstat -ano,找到占用8080端口的程序。因为没有程序的名称,通过PID结束程序。
    (2)修改Tomcat自己的端口号。
    • 修改Tomcat目录下的server.xml文件中的端口配置,找到port项,修改端口,完成后重启Tomcat服务器。
    • 有系统自带的IIS服务,占用80端口。停止该服务。
    • win7 自带 World wide web publish IIS服务 默认占用端口80 可以通过输入services.msc找到该服务,停止即可。极个别的系统会有系统内核占用80端口的,通过资料中提供的文件解决该问题
    Tomcat服务器与Servlet版本关系:

    Tomcat的目录结构:


    WEB应用程序

    (1)WEB应用程序指供浏览器访问的程序,通常也称为WEB应用。
    (2)一个web应用由多个静态web资源和动态web资源组成,如:
    • html、css、js文件 --- 静态web资源
    • Jsp文件、java程序、支持jar包、 ---- 动态web资源
    • 配置文件等等…..
    • 组成web应用的这些文件通常我们会使用一个目录组织,这个目录称之为web应用所在目录(网站的根目录)
     (3)WEB应用开发好后,若想供外界访问,需要把web应用所在的目录交给web服务器管理,这个过程称之为虚拟目录的映射。
    (4)开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器报错。web应用(网站目录)的组成结构如下:

     使用MyEclipse配置Tomcat

    • 在window下找到servers中的tomcat( window -- 选项 -- MyEclipse -- servers -- 选择tomcat -- 选择Enable -- 选择tomcat根目录)
    • 选择相应的版本后,配置本地的tomcat
    • 再配置本地的JDK(可选)
    • 配置成功后启动服务器
    • 在myeclipse中创建web项目,部署到tomcat中,启动服务器。
    • WebRoot目录变成了虚拟路径即访问路径了(虚拟路径默认和项目名称是相同的,不用去修改)
    • 如果直接复制项目,需要修改虚拟路径(项目上右键--选择属性 -- MyEclipse -- web 修改虚拟路径)
    • 扩展  window -- show view -- servers

    Tomcat管理员的配置

    在Tomcat中配置管理员主要是给用户使用的。
    可以在tomcat/conf/tomcat-user.xml中加入如下配置信息。
    <role rolename="manager">
    <user username="admin" password="admin" roles="manager">

    虚拟目录的映射方式(如何部署WEB程序)

    虚拟目录的映射有三种方式:
    (1)将项目复制到webapps目录下。即让Tomcat自动映射,Tomcat服务器会自动管理webapps目录下的所有的web应用,并把它映射成虚拟目录。换句话说,Tomcat服务器webapps目录下的web应用,外界可以直接访问。
    (2)(通过配置虚拟路径的方式)直接修改配置文件,写到tomcat/conf/server.xml中
         * 找到<Host>标签,配置到Host标签的中间。
         * 目的:通过配置,配置访问路径,准确找到c:\bb的文件
               *<Context docBase="文件夹的真实目录" path="虚拟路径(访问路径)"></Context>
               *<Context docBase="C:\bb" path="/itcast"></Context>
               *访问:http://localhost:80/itcast
     (3)自己编写一个配置文件(推荐使用)
        *自定义xxx.xml结尾文件,在$CATALINA_HOME/conf/[enginename]/[hostname] directory目录下
        *把xxx当成虚拟(访问)路径
        * 在XML的文件中编写。
              *xml文件在哪个目录下?
                        *$CATALINA_HOME/conf/[enginename]/[hostname] directory
                        * 如果找引擎的名称和主机的名称,在server.xml中找到分别是<engine name="引擎名称">...</engine>和                      <Host name="主机名称"></Host> 的节点即可
                        *tomcat/conf/Catalina/localhost/ccc.xml
               *ccc.xml的文件编写内容如下:
                        *<Context docBase="C:\cc"></Context>
                        *访问:http://localhost:80/ccc

    Web系统通信详解:


    配置虚拟主机:
    (1)  在一个tomcat服务器中可以放置多个网站<Host>,所谓配置虚拟主机,就是在tomcat服务器中配置一个网站。
    (2)如需要在WEB服务器中配置一个网站,需要使用Host元素进行配置,例如:<Host name="site1" appBase="c:\app"></Host>
    (3)配置的主机(网站)要想被外部访问,必须在DNS服务器或windows系统中注册
           C:\WINDOWS\system32drivers\etc\hosts
    (4)缺省虚拟主机DefaultHost
    访问网站全过程分析
    1、在浏览器输入url地址
    2、访问本机域名解析文件 hosts ======= c:\windows\system32\drivers\etc\ 
    3、如果本机没有查找到域名,查找网络上DNS服务器 
    4、域名解析后,获得域名对应ip地址。根据ip和port访问网络上指定主机和服务


    真实开发网站过程
    1、开发网站
    2、将网站发布web服务器上 (公网ip)
    3、在DNS域名解析服务器上注册域名,和服务器ip绑定

    实验:在本机上搭建百度虚拟主机 =========== 注意:默认端口必须设置80 
    1、抓取baidu主页 
    2、在c盘 新建虚拟主机目录 c:\baidu 
    3、在c:\baidu下新建 百度网站目录 website (复制网站页面到 website目录)
    4、在conf/server.xml 配置虚拟主机
    <Host name="www.baidu.com"  appBase="C:\baidu"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
    </Host>
    5、在本机 hosts文件添加 
    192.168.1.250 www.baidu.com 
    *** 测试 cmd中 ping www.baidu.com 测试hosts是否配置成功
    6、将website配置 缺省网站  在<Host> 元素内部添加<Context> 元素
    <Context path="" docBase="website" />
    7、将baidu.htm 配置默认欢迎页面 conf/web.xml 
    <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>baidu.htm</welcome-file>
    </welcome-file-list>

    使用MyEclipse开发动态web程序

    什么是HTTP协议?

    •  客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,http协议用于定义客户端与web服务器通讯的格式。
    •  基于TCP连接的传输协议
    • 默认端口是80
    • 基于请求-相应模式的协议
    • 通过Telnet命令 快速了解HTTP协议
    • 安装IE浏览器插件HttpWatch,查看IE浏览器通过HTTP协议获取某个页面  

    使用telnet命令演示HTTP协议

    • 启动服务器
    • cmd> telnet  localhost 80回车
    • telnet有一个乱码问题 解决乱码
    • 解决 Ctrl+] 回车
    • 注意:命令行中输入的内容不能写错,一旦写错了 不支持删除
    • GET /aa/1.html HTTP/1.1  
    • host:localhost
    • 输入两次回车

     HTTP协议简介

    • HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
    • HTTP协议是学习JAVAWEB的基石,必须深入了解HTTP协议 才能管理和维护一些复杂的WEB站点。
    • HTTP协议的版本:HTTP/1.0 、HTTP/1.1

    HTTP1.0和HTTP1.1的区别

    • HTTP/1.0是链接之后,马上断开
    • HTTP/1.1是链接之后,不会马上断开,还可以继续操作,一段时间不操作后,会自动断开。
    • 通过telnet命令可以很好的演示效果

    HTTP请求

     客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括以下内容:
      一个请求行、若干请求头、以及实体内容,如下所示:

    Web服务器通过客户端发送过来的这些请求信息,就可以确定向请求者回送什么资源,以及根据客户端的环境信息采用什么方式进行回送等。

    HTTP请求的细节——请求行

    请求行中的GET称之为请求方式,请求方式有:
    • POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT、CONNECT
    • 常用的有: GET、 POST
    • 用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
    不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
    • 如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:
    • GET /mail/1.html?name=abc&password=xyz HTTP/1.1
    • GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
    • 如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。
    1、请求行
    GET /day4/img.html HTTP/1.1 分为三个部分:请求方式、资源路径、协议版本
    HTTP请求方式定义8种,常用GET和POST两种

    GET和POST区别?
    1) 区分哪些是GET请求? 哪些POST请求?
    GET:在浏览器直接输入URL、<a href=""> 、<form method="get" >
    POST: <form method="post" >
    2) GET请求数据位于请求行中 ,POST请求数据位于请求体中
    GET /day4/form.html?username=zhangsan HTTP/1.1
    POST /day4/form.html HTTP/1.1
    ...
    username=lisi
    3) GET请求数据在URL上显示,所有有长度限制,通常是1kb 

    HTTP请求的细节——消息头


    Accept: text/html,image/*   客户端识别文件类型  
    Accept-Charset: ISO-8859-1  客户端字符集
    Accept-Encoding: gzip   客户端支持编码类型 gzip 压缩格式 
    Accept-Language:zh-cn  客户端语言
    Host: www.itcast.com:80  访问服务器地址 
    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT (重要) 和Last-Modified 一起使用 控制缓存
    Referer: http://www.itcast.com/index.jsp (重要)代表当前网页的来源  防止盗链 
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 浏览器类型(文件下载时,不同浏览器进行不同处理)
    Connection: close/Keep-Alive   请求后连接是关闭还是保持
    Date: Tue, 11 Jul 2000 18:23:51 GMT 请求时间 

    重点:If-Modified-Since、referer、User-Agent

    盗链:A网站直接通过链接,访问B网站资源
    防盗链原理,判断请求中referer信息 
    ****** 使用URL 和 URLConnection 伪造客户端 
    //防盗链
    String referer = request.getHeader("referer");
    if(referer!=null && referer.equals("http://localhost:8080/day03/index.html")){
    // 有效
    response.setContentType("text/html;charset=gbk");
    response.getWriter().println("笔记本1000元");
    }else{
    // 无效
    response.setContentType("text/html;charset=gbk");
    response.getWriter().println("盗链真无耻!");
    }

    //URL伪造
    URL url = new URL("http://localhost:8080/day03/referer");
    URLConnection conn =url.openConnection();
    conn.setRequestProperty("referer", "http://localhost/day03/index.html");

    byte[] buf = new byte[1024];
    InputStream is = conn.getInputStream();
    int len = is.read(buf);
    System.out.println(new String(buf,0,len));

    3、请求体
    多个数据之间用&分隔
    name=value&name=value&name=value...

    HTTP响应

    一个HTTP响应代表服务器向客户端回送的数据,它包括:
      一个状态行、若干消息头、以及实体内容。

      在一个HTTP响应中,WEB服务器通过响应向WEB客户端描述客户端的请求成功与否,以及它所发送的数据类型等一些信息,客户端通过这些信息,进而可以知道如何对数据进行处理。

    HTTP响应的细节——状态行

    状态行
    格式:HTTP版本号  状态码  原因叙述<CRLF>
    举例:HTTP/1.1 200 OK
    状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数,响应状态码分为5类,如下所示:
    状态码含义
    100~199表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
    200~299表示成功接收请求并已完成整个处理过程,常用200
    300~399为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302、307和304
    400~499客户端的请求有错误,常用404
    500~599服务器端出现错误,常用500

    HTTP/1.1 200 OK 协议版本、状态码、描述信息
    Informational 1xx  信息不足, 请求无法处理
    Successful  2xx 请求成功处理
    Redirection  3xx 请求已经处理,还需要客户端有进一步操作
    Client Error 4xx 客户端错误
    Server Error 5xx 服务器端错误

    200:请求成功处理,一切OK
    302:请求重定向(A找B借钱,B通知A找C借钱,A找C借钱)A: 客户端  B、C:服务器
    304:服务器端资源没有改动,通知客户端查找本地缓存
    404:客户端访问资源不存在
    500:服务器内部出错

    HTTP响应细节——常用响应头


    3) gzip压缩 
    工具-- internet选项 --- 设置 --查看文件 
    + 0.000 ! 0.097 394 7553 GET 200 html http://localhost/


    配置tomcat/conf/server.xml 在 Connector中配置 压缩 


    <Connector port="80" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443“ compressableMimeType="text/html,text/xml,text/plain" compression="on"/>


    + 0.000 0.093 394 2715 GET 200 html http://localhost/


    4) Tomcat默认缓存策略 If-Modified-Since Last-Modified 结合304 实现 
    5) 禁用缓存
    Expires: -1  
    Cache-Control: no-cache  
    Pragma: no-cache 
    防止浏览器不兼容,如果网页禁用缓存后,不会在 工具-- internet选项 --- 设置 --查看文件 产生缓存文件 


    展开全文
  • 这一篇跟大家分享 Web 客户端/网页 Web 服务器的通信过程,并详细讲述通信协议:HTTP 协议和 TCP 协议。 无论你是前端开发者还是后端开发者,以及测试工程师,这篇文章的知识都是你需要弄懂的。 读完这一篇文章,...

    这一篇跟大家分享 Web 客户端/网页与 Web 服务器的通信过程,并详细讲述通信协议:HTTP 协议和 TCP 协议。

    无论你是前端开发者还是后端开发者,以及测试工程师,这篇文章的知识都是你需要弄懂的。

    读完这一篇文章,将全面弄懂 HTTP 协议、TCP 协议,面试官再也难不倒你相关知识。

    下面为文章目录:

    • Web 客户端和服务端通信过程;
      • 会讲解 TCP/IP 协议族、数据处理流程、 URL 到服务器访问步骤、七层网络模型;
    • HTTP 协议;
      • 将详细 HTTP 介绍、特点、工作流程和原理、长连接、短连接;
      • 详细介绍请求报文、响应报文、HTTP 状态码、首部(通用首部、请求首部、响应首部、实体首部);
      • 讲解 GET 和 POST 的区别;
      • 讲解 HTTP2 新特性: 单一长连接、多路复用、二进制分帧、服务器推送;
    • TCP 协议;
      • 介绍 UDP、TCP 协议;
      • 讲解 TCP 相关机制: 三次握手、四次挥手、超时重发、应答机制、窗口控制。

    阅读全文: http://gitbook.cn/gitchat/activity/5ca1ee4e99783b2694026d8f

    您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

    FtooAtPSkEJwnW-9xkCLqSTRpBKX

    展开全文
  • Web服务协议以及使用方式

    千次阅读 2009-11-04 08:16:00
    Web服务是一种面向服务的架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络...
  • web服务器工作原理及http协议通信

    千次阅读 2011-10-10 10:18:45
    一个 Web 服务器也被称为 HTTP 服务器,它通过 HTTP 协议与客户端通信。这个客户端通常指的是 Web 浏览器。  Web服务器的工作原理简单的可以归纳为:客户机连接服务器,客户端向服务器发送请求,服务器向...
  • Web服务器的工作原理及其相关协议

    千次阅读 2016-04-21 16:52:30
    WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 通俗的说,Web服务器是可以向发出请求的浏览器提供文档的程序。 1、服务器是一种被动程序:只有当Internet上运行在其他计算机中的...
  • 基于HTTP协议Web服务器

    千次阅读 2016-03-22 17:05:55
    这篇博文只给出运行截图,没有附上源代码。 ...**下面简单讲述一下HTTP协议和项目描述:* HTTP协议是一个属于应用层的协议,主要特点可概括... 2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法
  • 基于HTTP协议实现的小型web服务器

    万次阅读 多人点赞 2017-04-28 07:37:28
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面...
  • web服务器与web客户端通讯过程

    千次阅读 2017-10-25 11:18:18
    我们使用web应用,在浏览器窗口的地址栏输入一个url,就可以浏览并定位一个web站点。 在这个过程的背后真正...WEB利用这个协议来描述请求和响应。经过描述的请求消息被成 为http请求,他有一个非常特别的格式,包含

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 619,110
精华内容 247,644
关键字:

web服务与什么协议