Maison > développement back-end > Golang > le corps du texte

Remplacement de l'en-tête de l'hôte http du client gRPC dans Golang

王林
Libérer: 2024-02-09 08:18:18
avant
1294 Les gens l'ont consulté

Remplacement de len-tête de lhôte http du client gRPC dans Golang

Il est courant de remplacer l'en-tête de l'hôte http du client gRPC dans Golang. gRPC est un framework d'appel de procédure à distance multilingue hautes performances Lorsque vous utilisez gRPC pour communiquer, il est parfois nécessaire de personnaliser l'en-tête hôte de la requête http. L'éditeur PHP Xigua vous présentera comment implémenter cette fonction dans Golang pour mieux répondre aux besoins de votre entreprise.

Contenu de la question

J'ai envoyé la demande via la connexion via le client gRPC

conn, err := grpc.Dial("hostname:port",opts...)
Copier après la connexion

Du côté du serveur, je vois host是确切的hostname:port dans http.request. Ensuite, mon serveur nginx est configuré comme suit

server {
    listen port http2;
    server_name hostname;
    # ...
}
server {
    listen port http2;
    server_name another_hostname;
    # ...
}
Copier après la connexion

Il s'agit d'une technologie d'hébergement Web courante. Quel que soit le nom d'hôte que j'utilise grpc.Dial(xxx:port), cela fonctionne bien. Cependant, quand je mets

md := metadata.New(map[string]string{"host":"another_hostname:port"})
Copier après la connexion

Dans le contexte grpc (sera renseigné dans l'en-tête de la requête http2). Cette demande sera bloquée par nginx et j'obtiens

rpc error: code = Internal desc = unexpected HTTP status code received from server: 400 (Bad Request); transport: received unexpected content-type "text/html"
Copier après la connexion

La raison pour laquelle vous devez saisir le nom d'hôte manuellement est parce que grpc.Dial中的主机名是固定的。而且我不能使用不同的位置来做反向代理,因为portest suivi par le chemin de routage de l'API restful.

Si le nom d'hôte est fixe et que la route est également fixe, existe-t-il un autre moyen de faire du proxy inverse ?

(23/09) Mise à jour : Il s'avère que l'en-tête host dans http2 a été remplacé par le pseudo-en-tête :Authority. :Authority伪头取代了。

解决方法

gRPC 使用 HTTP/2,不使用 :host 标头,而是使用 :authoritySolution de contournement

gRPC utilise HTTP/2 et n'utilise pas l'en-tête :host, mais le pseudo-en-tête :authority. La valeur de cet en-tête est déterminée ici :

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

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

Par défaut, utilisé pour authority。请参阅:https://pkg.go.dev/google.golang.org/ grpc#WithAuthority。但还要注意,此拨号选项会覆盖 TLS 握手期间使用的 ServerName.

gRPC-Go prend également en charge les options de connexion pour remplacer cette autorité. Voir : https://pkg.go.dev/google.golang.org/ grpc#WithAuthority

. Mais notez également que cette option de numérotation remplace la valeur ServerName utilisée lors de la négociation TLS. 🎜 🎜Si vous avez d'autres questions/préoccupations, n'hésitez pas à nous contacter via notre référentiel GitHub. Vos requêtes y obtiendront un meilleur temps de réponse. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal