GRPC 개발 (9) - grpc 서비스 개발 - grpc - gateway 의 미들웨어
4535 단어 GRPC
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)
}
}