>백엔드 개발 >Golang >golang에서 gRPC 클라이언트의 http 호스트 헤더 재정의

golang에서 gRPC 클라이언트의 http 호스트 헤더 재정의

王林
王林앞으로
2024-02-09 08:18:181335검색

golang에서 gRPC 클라이언트의 http 호스트 헤더 재정의

golang에서 gRPC 클라이언트의 http 호스트 헤더를 재정의하는 것은 일반적인 요구 사항입니다. gRPC는 고성능, 언어 간 원격 프로시저 호출 프레임워크입니다. gRPC를 사용하여 통신할 때 http 요청의 호스트 헤더를 사용자 지정해야 하는 경우가 있습니다. PHP 편집자 Xigua는 비즈니스 요구 사항을 더 잘 충족하기 위해 golang에서 이 기능을 구현하는 방법을 소개합니다.

질문 내용

gRPC 클라이언트를 통해 연결을 통해 요청을 보냈습니다

으아악

서버 측에서는 http.request에 host是确切的hostname:port가 표시됩니다. 그러면 내 nginx 서버는 다음과 같이 설정됩니다

으아악

이것은 일반적인 웹 호스팅 기술입니다. grpc.Dial(xxx:port)에서 어떤 호스트 이름을 사용하든 상관없이 잘 작동합니다. 그런데

를 넣으면 으아악

grpc 컨텍스트에서(http2 요청의 헤더에 채워집니다). 이 요청은 nginx에 의해 차단되며 나는

을 받습니다. 으아악

호스트 이름을 수동으로 입력해야 하는 이유는 grpc.Dial中的主机名是固定的。而且我不能使用不同的位置来做反向代理,因为port다음에 Restful API의 라우팅 경로가 오기 때문입니다.

호스트네임도 고정되어 있고 경로도 고정되어 있다면 역프록시를 할 수 있는 다른 방법은 없나요?

(23/09) 업데이트: http2의 호스트 헤더가 :Authority 의사 헤더로 대체된 것으로 나타났습니다. :Authority伪头取代了。

解决方法

gRPC 使用 HTTP/2,不使用 :host 标头,而是使用 :authority해결 방법

gRPC는 HTTP/2를 사용하며 :host 헤더가 아닌 :authority 의사 헤더를 사용합니다. 이 헤더의 값은 여기에서 결정됩니다:

https://github .com/grpc/grpc-go/blob/aa6ce35c792863305e0f42acc27f2c7153275f89/clientconn.go#L1942

:authority 标头的值是用户拨号目标的端点部分,其格式为 url://authority/endpointTL;박사

기본적으로 authority。请参阅:https://pkg.go.dev/google.golang.org/ grpc#WithAuthority。但还要注意,此拨号选项会覆盖 TLS 握手期间使用的 ServerName에 사용됩니다.

gRPC-Go는 이 권한을 무시할 수 있는 전화 접속 옵션도 지원합니다. https://pkg.go.dev/google.golang.org/grpc#WithAuthority

를 참조하세요. 그러나 이 전화 걸기 옵션은 TLS 핸드셰이크 중에 사용되는 ServerName 값을 재정의합니다. 🎜 🎜더 많은 질문/우려 사항이 있는 경우 GitHub 저장소를 통해 언제든지 문의해 주세요. 귀하의 질문에 대한 응답 시간이 더 빨라질 것입니다. 🎜

위 내용은 golang에서 gRPC 클라이언트의 http 호스트 헤더 재정의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제