Un amont gRPC
GuideExploitationDepuis la version 1.1.0
Guide d'exploitation : configurer, déployer et observer la passerelle. Ce que fait la capacité côté produit : guide produit ; l'appeler : guide développeur.
Objectif : servir un service gRPC à des clients gRPC, à un navigateur (gRPC-Web) et en
REST/JSON, depuis son seul .proto.
Commande - l'équipe de l'amont annote son .proto : la correspondance REST standard
(google.api.http) et ce dont Flexway a besoin en plus (flexway.v1.operation, le pendant des
x-flexway-*). Puis elle construit le jeu de descripteurs :
syntax = "proto3";
package shop.v1; // le nom gRPC est shop.v1.Orders/GetOrder
import "flexway/v1/options.proto"; // à copier depuis le tag que vous exécutez : services/gateway/api/flexway/v1/options.proto
import "google/api/annotations.proto"; // depuis buf.build/googleapis/googleapis, ci-dessous
service Orders {
rpc GetOrder(GetOrderRequest) returns (Order) {
option (google.api.http) = { get: "/v1/shop/orders/{id}" };
option (flexway.v1.operation) = { upstream: "orders" security: [ { scopes: ["orders:read"] } ] };
}
}v=<version> # le Flexway que vous exécutez
mkdir -p flexway/v1 && curl -fsSLo flexway/v1/options.proto \
"https://raw.githubusercontent.com/flexwiz/flexway/v$v/services/gateway/api/flexway/v1/options.proto"
cat > buf.yaml <<'YAML'
version: v2
deps: [buf.build/googleapis/googleapis]
YAML
buf dep update
buf build -o orders.binpb # ou : protoc --include_imports --descriptor_set_out=orders.binpb ...contracts:
protobuf: [./orders.binpb]
upstreams:
orders: { url: http://orders.internal:9000, protocol: grpc } # h2c dans un maillageVérif :
grpcurl -plaintext -protoset orders.binpb -H "authorization: Bearer $TOKEN" \
-d '{"id":"42"}' localhost:8080 shop.v1.Orders/GetOrder # gRPC, sur le port de trafic
curl -H "authorization: Bearer $TOKEN" localhost:8080/v1/shop/orders/42 # la même opération en RESTLes deux appels sont une seule opération, shop.v1.Orders/GetOrder : même identité, même
débit, même quota, même ligne d'audit. Un refus arrive en google.rpc.Status au client gRPC (le
code du problème dans ErrorInfo.reason), en RFC 9457 au client REST. Une erreur de l'amont arrive
au client REST en problème upstream_status, son statut gRPC dans l'extension grpc. Un flux
serveur est un text/event-stream en REST.
Pour un navigateur (gRPC-Web), la politique
corsexposegrpc-status,grpc-messageetgrpc-status-details-bin(expose_headers) et acceptex-grpc-web,x-user-agentetgrpc-timeout(allow_headers) : sans eux, le navigateur ne lit pas un refus. Refusés au chargement à cette version : variable sur plusieurs segments ({name=shelves/*}), joker, verbe (:cancel),google.api.httpsur un flux client ou bidirectionnel - ceux-là restent servis en gRPC seulement.