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.
J'ai envoyé la demande via la connexion via le client gRPC
conn, err := grpc.Dial("hostname:port",opts...)
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; # ... }
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"})
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"
La raison pour laquelle vous devez saisir le nom d'hôte manuellement est parce que grpc.Dial
中的主机名是固定的。而且我不能使用不同的位置来做反向代理,因为port
est 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
标头,而是使用 :authority
Solution de contournement
: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/endpoint
TL;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
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!