Go 웹 서버 의 구조

Go 는 완전한 웹 서버 표준 라 이브 러 리 를 제공 하여 go 구축 서버 가 매우 간단 합 니 다.서버 를 만 들 려 면 ListenAndServe 만 호출 하면 됩 니 다.해당 웹 함수 라 이브 러 리 는 net/http 패키지 에 있 습 니 다.본 고 는 의 내용 을 참고 하여 서버 의 구 조 를 소개 하고 관심 있 는 파트너 가 직접 이 책 을 읽 을 수 있 습 니 다.
우선 두 가지 가장 간단 한 서버 를 구축 합 니 다.
package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe("", nil)
}

http 패키지 의 ListenAndServe 함 수 를 사용 합 니 다.사용 자 는 서버 대상 을 사용자 정의 하여 서버 에 대해 더 많은 설정 을 할 수 있 습 니 다.예 를 들 어 시간 초과 설정,기록 로그 등 작업 을 할 수 있 습 니 다.
package main

import (
    "net/http"
)

func main() {
    server := http.Server{
        Addr:   "127.0.0.1",
        Handler: nil,
    }
    server.ListenAndServe()
}

http.server 구조의 공개 설정 은 다음 과 같 습 니 다.
type Server struct {
    Addr           string
    Handler        Handler
    ReadTimeOut    time.Duration
    WriteTimeOut   time.Duration
    MaxHeaderBytes int
    TLSConfig      *tls.Config
    ConnState      func(net.Conn,ConnState)
    ErrorLog       *log.Logger
}

HTTPS 서 비 스 를 제공 하려 면 감청 함 수 를 server.ListenAndServeTLS("cert.pem","key.pem")로 바 꾸 기만 하면 됩 니 다.
프로세서 와 처리 함수
위 에 생 성 된 서버 는 처리 프로그램 을 쓰 지 않 아 요청 을 처리 할 수 없습니다.프로세서 나 처리 함 수 를 추가 해 야 합 니 다.
예 를 들 어 프로세서 추가:
package main
import (
    "fmt"
    "net/http"
)

type MyHandler struct{}
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World")
}
func main() {
    handler := MyHandler{}
    server := http.Server{
        Addr: "127.0.0.1:8080",
        Handler: &handler,
    }
    server.ListenAndServe()
}

여러 개의 프로 세 서 를 사용 하여 다른 요청 을 처리 하려 면:
package main
import (
    "fmt"
    "net/http"
)

type HelloHandler struct{}
func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
}

type WorldHandler struct{}
func (h *WorldHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "World!")
}

func main() {
    hello := HelloHandler{}
    world := WorldHandler{}
    
    server := http.Server{
        Addr: "127.0.0.1:8080",
    }
    http.Handle("/hello", &hello)
    http.Handle("/world", &world)
    
    server.ListenAndServe()
}

http.server 에서 handler 를 가리 키 지 않 으 면 서버 는 기본 Default ServeMux 프로 세 서 를 사용 하고 http.Handle 함 수 를 사용 하여 프로 세 서 를 Default ServeMux 에 연결 합 니 다.Handle 은 http 패키지 의 방법 이지 만 Default ServeMux.Handle 방법 을 사용 합 니 다.
위의 정의 에서 프로세서 에는 모두 함수 ServeHTTP 가 있 습 니 다.go 언어 에서 하나의 프로 세 서 는 ServeHTTP 방법 을 가 진 인터페이스 입 니 다.Default ServeMux 다 중 복합 기 는 ServeMux 구조의 인 스 턴 스 이 고 후자 도 ServeHTTP 방법 을 가지 고 있 기 때문에 자신의 프로 세 서 를 정의 하려 면 ServeHTTP 만 실현 하면 됩 니 다.
이 방식 은 요청 을 추가 할 때마다 handler 를 만 드 는 것 이 번 거 로 울 수 있 습 니 다.프로세서 함 수 를 사용 할 수 있 습 니 다.처리 함수 만 정의 하고 handler 를 만 들 필요 가 없습니다.
package main
import (
    "fmt"
    "net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
}
func world(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "World!")
}
func main() {
    server := http.Server{
        Addr: "127.0.0.1:8080",
    }
    http.HandleFunc("/hello", hello)
    http.HandleFunc("/world", world)  
    server.ListenAndServe()
}

Go 는 handle Func 함 수 를 가지 고 있 습 니 다.(w http.ResponseWriter,r*http.Request)인자 가 있 는 함 수 를 handler 로 바 꿀 수 있 습 니 다.http.Handle 함수 와 마찬가지 로 Default ServeMux 를 호출 하 는 함수 입 니 다.
함수 프로 토 타 입:
func Handle(pattern string, handler Handler) { 
    DefaultServeMux.Handle(pattern, handler) 
}
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

좋은 웹페이지 즐겨찾기