Es ist eine häufige Anforderung, den http-Host-Header des gRPC-Clients in Golang zu überschreiben. gRPC ist ein leistungsstarkes, sprachübergreifendes Remote-Prozeduraufruf-Framework. Bei der Verwendung von gRPC für die Kommunikation ist es manchmal erforderlich, den Host-Header der http-Anfrage anzupassen. Der PHP-Editor Xigua stellt Ihnen vor, wie Sie diese Funktion in Golang implementieren, um Ihre Geschäftsanforderungen besser zu erfüllen.
Ich habe die Anfrage über die Verbindung per gRPC-Client gesendet
conn, err := grpc.Dial("hostname:port",opts...)
Von der Serverseite sehe ich host
是确切的hostname:port
in http.request. Dann ist mein Nginx-Server wie folgt eingerichtet
server { listen port http2; server_name hostname; # ... } server { listen port http2; server_name another_hostname; # ... }
Dies ist eine gängige Webhosting-Technologie.
Egal welchen Hostnamen ich verwende grpc.Dial(xxx:port)
es funktioniert einwandfrei. Wenn ich jedoch
md := metadata.New(map[string]string{"host":"another_hostname:port"})
Im grpc-Kontext (wird im Header der http2-Anfrage ausgefüllt). Diese Anfrage wird von Nginx blockiert und ich erhalte
rpc error: code = Internal desc = unexpected HTTP status code received from server: 400 (Bad Request); transport: received unexpected content-type "text/html"
Der Grund, warum Sie den Hostnamen manuell eingeben müssen, liegt darin, dass auf grpc.Dial
中的主机名是固定的。而且我不能使用不同的位置来做反向代理,因为port
der Routingpfad der Restful API folgt.
Wenn der Hostname festgelegt ist und die Route ebenfalls festgelegt ist, gibt es dann eine andere Möglichkeit, den Proxy umzukehren?
(23.09.) Update: Es stellt sich heraus, dass der Host-Header in http2 durch den Pseudo-Header :Authority
ersetzt wurde. :Authority
伪头取代了。
gRPC 使用 HTTP/2,不使用 :host
标头,而是使用 :authority
Workaround
:host
, sondern den Pseudoheader :authority
. Der Wert dieses Headers wird hier ermittelt: https://github.com/grpc/grpc-go/blob/aa6ce35c792863305e0f42acc27f2c7153275f89/clientconn.go#L1942
:authority
标头的值是用户拨号目标的端点部分,其格式为 url://authority/endpoint
TL;PhD
Standardmäßig verwendet für authority
。请参阅:https://pkg.go.dev/google.golang.org/ grpc#WithAuthority。但还要注意,此拨号选项会覆盖 TLS 握手期间使用的 ServerName
.
gRPC-Go unterstützt auch Einwahloptionen, um diese Autorität
zu überschreiben. Siehe: https://pkg.go.dev/google.golang.org/ grpc#WithAuthority
ServerName
-Wert überschreibt. 🎜
🎜Wenn Sie weitere Fragen/Bedenken haben, können Sie uns gerne über unser GitHub-Repository kontaktieren. Ihre Anfragen werden dort schneller beantwortet. 🎜Das obige ist der detaillierte Inhalt vonÜberschreiben des HTTP-Host-Headers des gRPC-Clients in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!