xml地图|网站地图|网站标签 [设为首页] [加入收藏]

皇家赌场手机版:golang中使用echo框架中的HTTP

来源:http://www.ccidsi.com 作者:集成介绍 人气:102 发布时间:2019-05-02
摘要:HTTP2 Server Push的研究 2017/01/05 · 基础才具 ·HTTP/2 原稿出处:AlloyTeam    本文头阵地址为-iOS HTTP/2 Server Push 研究 |李剑飞的博客 生命不止,继续 go go go !!! 一,HTTP2的新特色。 有关HTTP2的

HTTP2 Server Push的研究

2017/01/05 · 基础才具 · HTTP/2

原稿出处: AlloyTeam   

本文头阵地址为-iOS HTTP/2 Server Push 研究 | 李剑飞的博客

生命不止,继续 go go go !!!

一,HTTP2的新特色。

有关HTTP2的新特性,读着能够参考小编前边的稿子,这里就不在多说了,本篇小说主要讲一下server push那天性格。

HTTP,HTTP贰.0,SPDY,HTTPS你应当精晓的部分事

 


三番四遍echo web框架,明天搞一下http2。

2,Server Push是什么。

简短来讲正是当用户的浏览器和服务器在创立链接后,服务器主动将有个别财富推送给浏览器并缓存起来,那样当浏览器接下去请求那几个能源时就直接从缓存中读取,不会在从服务器上拉了,提高了速率。举一个例子正是:

借使多少个页面有一个能源文件index.html,index.css,index.js,当浏览器请求index.html的时候,服务器不仅重回index.html的内容,同时将index.css和index.js的剧情push给浏览器,当浏览器下次呼吁那2几个公文时就能够平昔从缓存中读取了。

皇家赌场手机版 1

HTTP2

What is HTTP/2?
HTTP/2 is a replacement for how HTTP is expressed “on the wire.” It is not a ground-up rewrite of the protocol; HTTP methods, status codes and semantics are the same, and it should be possible to use the same APIs as HTTP/1.x (possibly with some small additions) to represent the protocol.

The focus of the protocol is on performance; specifically, end-user perceived latency, network and server resource usage. One major goal is to allow the use of a single connection from browsers to a Web site.

新的二进制格式(Binary Format)
HTTP1.x的剖析是依靠文本。基于文本协议的格式解析存在先性格缺陷,文本的表现格局有各种性,要完毕健壮性思念的情景必然繁多,二进制则分裂,只认0和一的咬合。基于那种设想HTTP贰.0的合计分析决定运用2进制格式,实现方便且健壮。

多路复用(MultiPlexing)
即连续共享,即每3个request都以是当做连接共享机制的。八个request对应贰个id,那样四个连接上得以有多个request,每种连接的request能够无限制的交集在协同,接收方能够依附request的 id将request再归属到个别不一致的服务端请求里面。多路复用原理图:

header压缩
HTTP二.0行使encoder来压缩供给传输的header大小,通信双方分别cache一份header 田野同志s表,既幸免了双重header的传输,又减小了特殊必要传输的大大小小。

服务端推送(server push)
同SPDY一样,HTTP2.0也具有server push功能。

三,Server Push原理是何许。

要想驾驭server push原理,首先要通晓一些概念。大家领会HTTP贰传输的格式并不像HTTP一使用文本来传输,而是启用了二进制帧(Frames)格式来传输,和server push相关的帧首要分为那三种类型:

  1. HEADE翼虎S frame(请求再次来到头帧):那种帧首要引导的http请求头音讯,和HTTP一的header类似。
  2. DATA frames(数据帧) :那种帧存放真正的多寡content,用来传输。
  3. PUSH_PROMISE frame(推送帧):那种帧是由server端发送给client的帧,用来表示server push的帧,那种帧是促成server push的基本点帧类型。
  4. RST_STREAM(撤消推送帧):这种帧表示请求关闭帧,轻松讲正是当client不想接受一些能源还是接受timeout时会向发送方发送此帧,和PUSH_PROMISE frame一齐使用时表示拒绝恐怕关闭server push。

Note:HTTP二.0相关的帧其实包罗10种帧,正是因为后面部分数据格式的改动,才为HTTP二.0拉动众多的表征,帧的引进不仅有益于减弱数量,也有益数据的安全性和保证传输性。

摸底了有关的帧类型,上面便是现实server push的贯彻进程了:

  1. 由多路复用大家能够通晓HTTP第22中学对于同3个域名的乞请会利用一条tcp链接而用差别的stream ID来不同各自的乞求。
  2. 当client使用stream 一请求index.html时,server不奇怪管理index.html的乞求,并得以摸清index.html页面还就要会呈请index.css和index.js。
  3. server使用stream 1发送PUSH_PROMISE frame给client告诉client笔者那边能够行使stream 二来推送index.js和stream 三来推送index.css财富。
  4. server使用stream 一寻常的发送HEADE大切诺基S frame和DATA frames将index.html的内容重返给client。
  5. client接收到PUSH_PROMISE frame得知stream 二和stream 三来接受推送财富。
  6. server获得index.css和index.js便会发送HEADE汉兰达S frame和DATA frames将财富发送给client。
  7. client获得push的能源后会缓存起来当呼吁那个财富时会从平昔从从缓存中读取。

下图表示了整个工艺流程:

皇家赌场手机版 2

HTTP/2

变化证书

go run C:gosrccryptotlsgenerate_cert.go --host localhost
2017/11/22 10:06:58 written cert.pem
2017/11/22 10 :06:58 written key.pem

4,Server Push怎么用。

既然server push这么神奇,那么大家什么样行使啊?怎么设置服务器push哪些文件呢?

首先并不是怀有的服务器都援助server push,nginx近年来还不协理那性格子,能够在nginx的官方博客上获得验证,可是Apache和nodejs都早已匡助了server push那1个特色,要求表达某个的是server push那些特点是依赖浏览器和服务器的,所以浏览器并从未提供对应的js api来让用户一贯操作和决定push的内容,所以只能是透过header新闻和server的布局来落到实处具体的push内容,本文首要以nodejs来声明实际哪些使用server push那1特色。

企图专门的学业:下载nodejs http2援助,本地运行nodejs服务。

一. 率先大家选用nodejs搭建基本的server:

JavaScript

var http二 = require('http二');   var url=require('url'); var fs=require('fs'); var mine=require('./mine').types; var path=require('path');   var server = http2.createServer({   key: fs.readFileSync('./zs/localhost.key'),   cert: fs.readFileSync('./zs/localhost.crt') }, function(request, response) {     var pathname = url.parse(request.url).pathname;     var realPath = path.join("my", pathname);    //这里安装自身的文件名称;       var pushArray = [];     var ext = path.extname(realPath);     ext = ext ? ext.slice(1) : 'unknown';     var contentType = mine[ext] || "text/plain";       if (fs.existsSync(realPath)) {           response.writeHead(200, {             'Content-Type': contentType         });           response.write(fs.readFileSync(realPath,'binary'));       } else {       response.writeHead(404, {           'Content-Type': 'text/plain'       });         response.write("This request URL " pathname " was not found on this server.");       response.end();     }   });   server.listen(443, function() {   console.log('listen on 443'); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var http2 = require('http2');
 
var url=require('url');
var fs=require('fs');
var mine=require('./mine').types;
var path=require('path');
 
var server = http2.createServer({
  key: fs.readFileSync('./zs/localhost.key'),
  cert: fs.readFileSync('./zs/localhost.crt')
}, function(request, response) {
    var pathname = url.parse(request.url).pathname;
    var realPath = path.join("my", pathname);    //这里设置自己的文件名称;
 
    var pushArray = [];
    var ext = path.extname(realPath);
    ext = ext ? ext.slice(1) : 'unknown';
    var contentType = mine[ext] || "text/plain";
 
    if (fs.existsSync(realPath)) {
 
        response.writeHead(200, {
            'Content-Type': contentType
        });
 
        response.write(fs.readFileSync(realPath,'binary'));
 
    } else {
      response.writeHead(404, {
          'Content-Type': 'text/plain'
      });
 
      response.write("This request URL " pathname " was not found on this server.");
      response.end();
    }
 
});
 
server.listen(443, function() {
  console.log('listen on 443');
});

这几行代码正是轻巧搭建3个nodejs http二服务,展开chrome,我们得以看来有着请求都走了http2,同时也能够印证多路复用的表征。

皇家赌场手机版 3

此处要求专注几点:

  1. 创制http二的nodejs服务必须时依据https的,因为昨日主流的浏览器都要帮忙SSL/TLS的http2,证书和私钥能够协和通过OPENSSL生成。
  2. node http贰的连带api和常规的node httpserver同样,能够直接使用。

  3. 安装大家的server push:

JavaScript

var pushItem = response.push('/css/bootstrap.min.css', {        request: {             accept: '*/*'        },       response: {             'content-type': 'text/css'      } }); pushItem.end(fs.readFileSync('/css/bootstrap.min.css','binary'));

1
2
3
4
5
6
7
8
9
var pushItem = response.push('/css/bootstrap.min.css', {
       request: {
            accept: '*/*'
       },
      response: {
            'content-type': 'text/css'
     }
});
pushItem.end(fs.readFileSync('/css/bootstrap.min.css','binary'));

大家设置了bootstrap.min.css来因而server push到大家的浏览器,大家得以在浏览器中查阅:

皇家赌场手机版 4

能够看来,运维server push的财富timelime相当慢,大大加快了css的收获时间。

此地须求留意上面几点:

  1. 咱俩调用response.push(),就是一定于server发起了PUSH_PROMISE frame来告诉浏览器bootstrap.min.css将会由server push来得到。
  2. response.push()重临的目的时一个好端端的ServerResponse,end(),writeHeader()等措施都足以符合规律调用。
  3. 这里壹旦针对有个别能源调用response.push()即发起PUSH_PROMISE frame后,要办好容错机制,因为浏览器在下次恳请那么些能源时会且只会等待那个server push回来的能源,这里要搞好超时和容错即上边包车型大巴代码:
  4. JavaScript

    try {     pushItem.end(fs.readFileSync('my/css/bootstrap.min.css','binary'));     } catch(e) {        response.writeHead(404, {            'Content-Type': 'text/plain'        });        response.end('request error'); }   pushItem.stream.on('error', function(err){     response.end(err.message); });   pushItem.stream.on('finish', function(err){    console.log('finish'); });

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    try {
        pushItem.end(fs.readFileSync('my/css/bootstrap.min.css','binary'));
        } catch(e) {
           response.writeHead(404, {
               'Content-Type': 'text/plain'
           });
           response.end('request error');
    }
     
    pushItem.stream.on('error', function(err){
        response.end(err.message);
    });
     
    pushItem.stream.on('finish', function(err){
       console.log('finish');
    });

    地点的代码你恐怕会意识大多和常规nodejs的httpserver不均等的东西,那就是stream,其实整个http二都以以stream为单位,这里的stream其实能够知道成一个伸手,越来越多的api能够参见:node-http2。

  5. 末段给大家推荐三个鬼子写的越发服务http贰的node server有兴趣的能够尝尝一下。

HTTP/2 Server Push 是什么

当用户的浏览器和服务器在创立链接后,服务器主动将部分资源推送给浏览器并缓存起来,那样当浏览器接下去请求那一个财富时就直接从缓存中读取,不会在从服务器上拉了,升高了速率。举二个例证正是:

要是1个页面有二个财富文件index.html,index.css,index.js,当浏览器请求index.html的时候,服务器不仅重返index.html的内容,同时将index.css和index.js的剧情push给浏览器,当浏览器下次恳请那2多少个公文时就足以一向从缓存中读取了。

正如图所示:

皇家赌场手机版 5

Apple-http2ServerPush

echo中的HTTP/2

代码main.go:

package main

import (
    "fmt"
    "net/http"

    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/request", func(c echo.Context) error {
        req := c.Request()
        format := `
            <code>
                Protocol: %s<br>
                Host: %s<br>
                Remote Address: %s<br>
                Method: %s<br>
                Path: %s<br>
            </code>
        `
        return c.HTML(http.StatusOK, fmt.Sprintf(format, req.Proto, req.Host, req.RemoteAddr, req.Method, req.URL.Path))
    })
    e.Logger.Fatal(e.StartTLS(":1323", "cert.pem", "key.pem"))
}

浏览器输入:

结果:

Protocol: HTTP/2.0
Host: localhost:1323
Remote Address: [::1]:1905
Method: GET
Path: /request

就算出现错误:
http: TLS handshake error from [::1]:1735: tls: first record does not look like a TLS handshake.

请检查是或不是输入的是https

本文由68399皇家赌场发布于集成介绍,转载请注明出处:皇家赌场手机版:golang中使用echo框架中的HTTP

关键词: 68399皇家赌场 基础技术 移动前沿 Blog echo

上一篇:头部压缩技术介绍

下一篇:没有了

最火资讯