GRPC 개발 (9) - grpc 서비스 개발 - grpc - gateway 의 미들웨어

4535 단어 GRPC
사실 grpc 의 미들웨어 는 http 를 작성 하 는 미들웨어 와 같 습 니 다.
http 서비스
프로세서: Handler
정의.
type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}


http 서비스, 가장 중요 한 것 은 프로세서 입 니 다: Handler, 하나의 인터페이스 에서 우 리 는 프로 세 서 를 정의 해 야 합 니 다. ServeHTTP 를 실현 하 는 방법 은 HTTP 요청 에 응답 하 는 것 입 니 다. 다음은 프로세서: Handler 에 대한 소개 입 니 다.
ServeHTTP           ResponseWriter,    。
Returning signals      ,   ServeHTTP        ,     ResponseWriter ,      Request.Body    

  HTTP     、HTTP          Go          , ResponseWriter         Request.Body    。
             Request.Body,    。

    Body  ,              。

  ServeHTTP panics,   (ServeHTTP    )        active request  。
     ,               ,   HTTP           HTTP/2 RST_STREAM。
        ,            ,        ,    ErrAbortHandler  panic。

지정 한 url 에 미들웨어 추가
         :myHandler1,   ServeHTTP      Handler   
type myHandler1 struct{}

func (my *myHandler1) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello  myHandler1  ")
}

그리고 127.0.0.1: 8888 / h1 을 직접 방문 하면 Hello my Handler 1 로 돌아 갈 수 있 습 니 다. 이것 은 가장 간단 한 서비스 입 니 다.여기 서 저 희 는 이 서비스 가격 미들웨어 에 전체 로그 기록 이나 검증 을 하고 싶 습 니 다. my h 가 Handler 인 터 페 이 스 를 실현 하기 때문에 name 은 직접 전달 할 수 있 습 니 다.
func middleware1(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// http.Error(w, http.StatusText(403), 403)
		tStart := time.Now()
		next.ServeHTTP(w, r)
		tEnd := time.Since(tStart)
		fmt.Println("middleware1:", tEnd)
	})
}

mux.Handle("/h1", &myh)
  
mux.Handle("/h2", middleware1(&myh))

하나의 서 비 스 를 간단하게 실현 하 다.
package main

import (
        "fmt"
        "net/http"
        "time"
)
type myHandler1 struct{}

func (my *myHandler1) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello  myHandler1  ")
}

func middleware1(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// http.Error(w, http.StatusText(403), 403)
		tStart := time.Now()
		next.ServeHTTP(w, r)
		tEnd := time.Since(tStart)
		fmt.Println("middleware1:", tEnd)
	})
}

func main() {
        mux := http.NewServeMux()
        myh := &myHandler1{}
        mux.Handle("/h1", middleware1(myh))
        if err := http.ListenAndServe(":8888", mux); err != nil {
                panic(err)
        }
}


공유 기 에 미들웨어 추가
위 는 단일 url 에 대한 검증 입 니 다. mux 도 ServeHTTP 방법 을 실 현 했 기 때문에 middleware 1 은 mux 에 직접 사용 할 수 있 습 니 다.
func main() {
        mux := http.NewServeMux()
        myh := &myHandler1{}
        mux.Handle("/h1", myh)
        if err := http.ListenAndServe(":8888", middleware1(mux)); err != nil {
                panic(err)
        }
}

다시 말 하면 ServeHTTP 방법 을 실현 하면 이 대상 에 게 위의 중간 부품 을 사용 할 수 있다.
grpc - gateway
mux := runtime.NewServeMux()
  mux     ServeHTTP ,   Handler  ,              

Handler 어댑터: Handler Func
정의.
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

소개 하 다.
HandlerFunc        ,          HTTP    。  f          ,HandlerFunc(f)   f     。

어댑터 를 제공 합 니 다. 즉, (w http. ResponseWriter, r * http. Request) 형식 에 따라 함 수 를 구현 한 다음 HandlerFunc 형식 으로 변환 합 니 다. HandlerFunc 는 ServeHTTP 방법 을 실 현 했 고 방법 내부 에서 자신 을 호출 했 기 때문에 Handler 인 터 페 이 스 를 실현 하 는 절 차 를 면제 합 니 다.이렇게 하면 서 비 스 를 신속하게 실현 할 수 있다.이에 대해 서도 미들웨어 를 실현 하 는 방식 을 제공 하여 지정 url 에 미들웨어 를 추가 하 였 다.
package main

import (
        "fmt"
        "net/http"
        "time"
)

func hello1(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello  111 ")
}
func middleware2(h http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
                tStart := time.Now()
                h(w, r) //    
                tEnd := time.Since(tStart)
                fmt.Println("middleware1:", tEnd)
        }
}
func main() {
        mux := http.NewServeMux()
        mux.HandleFunc("/h2", middleware2( http.HandlerFunc(hello1)))
         if err := http.ListenAndServe(":8888", mux); err != nil {
                panic(err)
        }
}

좋은 웹페이지 즐겨찾기