Go 기반 서버 푸시

12764 단어 GoechoHTTP2tech

개시하다

  • Go를 사용하여 HTTP/2의 서버 압력을 실현하고 내용을 정리했다.
  • 서버 푸시

  • 기본적으로 HTTP를 바탕으로 하는 통신은 고객이 서버에 대한 요청을 수행하고 요청을 받은 서버가 이 요청에 대응하는 처리를 하고 응답을 되돌려주는 것이다. 일련의 처리는 반드시 클라이언트에서 시작해야 한다.이에 비해 서버 푸시는 클라이언트가 실행을 요청하기 전에 서버가 클라이언트에게 내용을 보내는 기능을 말한다.고객이 실제로 이 내용을 요청하기 전에는 서버에서 보낸 내용을 식별할 수 없지만 요청을 실행하면 일반적인 것보다 짧은 시간 안에 내용을 얻을 수 있다.다음은 서버 압력과 실현되지 않았을 때의 처리 절차를 설치한 개략도입니다.

  • 이루어지다

  • 설치 설명을 드리고 싶습니다.이번 언어는 Go이고 프레임은 echo입니다.이번 목록은 다음과 같이 구성되어 있다.
  • $ tree .
    .
    ├── ca.crt
    ├── go.mod
    ├── go.sum
    ├── main.go
    ├── static
    │   ├── index.html
    │   └── lena.png
    ├── server.crt
    └── server.key
    
  • HTTP/2는 TLS 통신을 해야 하기 때문에 TLS 통신에 필요한 자가 서명 인증서ca.crt, 서버 인증서server.crt, 서버 기밀 키server.key를 준비했다.사이트에서 사용하는 파일은 static의 아래에 설정되어 있다.lena.png에 관해서는 이미지 처리 분야에서 자주 사용하는 lena 이미지를 사용했다.
  • 다음은 Go의 설치 예입니다.설치에 관해서는 사이트 축소판 그림공개된 설치를 참고하겠습니다.
  • main.go
    package main
    
    import (
    	"flag"
    	"github.com/labstack/echo/v4"
    	"log"
    	"net/http"
    )
    
    const defaultEnableServerPush = true
    
    func main() {
    	var enableServerPush bool
    	flag.BoolVar(&enableServerPush, "enableServerPush", defaultEnableServerPush, "server push option")
    	flag.Parse()
    
    	log.Printf("enableServerPush: %t", enableServerPush)
    	e := NewServerPushServer(enableServerPush)
    	e.StartTLS(":18443", "server.crt", "server.key")
    }
    
    func NewServerPushServer(enableServerPush bool) *echo.Echo {
    	e := echo.New()
    	e.Static("/", "static")
    	if enableServerPush {
    		e.GET("/", serverPush)
    	}
    	return e
    }
    
    func serverPush(c echo.Context) error {
    	pusher, ok := c.Response().Writer.(http.Pusher)
    	if ok {
    		if err := pusher.Push("/lena.png", nil); err != nil {
    			return err
    		}
    	}
    	return c.File("static/index.html")
    }
    
  • 이번에 서버 푸시로 인한 응답 시간에 어떤 변화가 생겼는지 확인하기 위해 시작할 때 지정enableServerPush은 옵션을 통해 서버 푸시가 유효하거나 무효인지 설정할 수 있다.
  • index.html의 설치는 다음과 같습니다.
  • index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Server Push Test</title>
    </head>
    <body>
    <img class="top-image" src="/lena.png">
    </body>
    </html>
    

    확인

  • 서버 스핀다운을 사용 및 사용 안 함으로 설정할 때 응답 시간이 변경되었는지 확인합니다.구체적 실시main.go는 크롬 접근https://localhost:18443/ 시 개발 도구를 통해 통신 내용을 확인했다.서버 추진을 해제하고 서버를 시작하려면 다음 명령을 사용합니다.
  • $ go run main.go --enableServerPush=false
    

    잘못된 서버 푸시


  • 우선 서버가 무효로 추정되었을 때의 통신 내용입니다.개발자 도구Network 탭에 다음과 같은 내용을 표시합니다.전체적으로 168ms가 필요한지 확인할 수 있습니다.

  • lena.pngWaterfall 항목에 마우스를 놓으면 다음과 같은 내용이 표시됩니다.요청 이미지에서 다운로드 완료(Content Download)까지 약 40ms가 필요한지 확인할 수 있습니다.

  • 서버 푸시 유효 시


  • 다음은 서버가 시간을 끌 때 사용하는 통신 내용입니다.다음은 Network 탭의 내용입니다.전체적으로 77ms가 필요한지 확인할 수 있습니다.

  • lena.pngWaterfall 내용은 다음과 같다.그림은 줄을 서 있는 그림만 읽을 수 있기 때문에 약 9밀리초가 걸렸다.

  • 총결산

  • Go를 통해 서버의 압력을 실시하여 서버가 효과가 있을 때와 효과가 없을 때의 행위를 확인하고 서버가 효과가 있을 때의 장점을 실감한다.
  • 좋은 웹페이지 즐겨찾기