Per creare un servizio gRPC, indipendentemente dal fatto che utilizzi o meno Cloud Endpoints, devi specificare la definizione dell'interfaccia in uno o più file proto, che sono file di testo con l'estensione .proto. In un file proto, definisci la superficie
della tua API, incluse le strutture dei dati, i metodi, i parametri dei metodi e i tipi
restituiti. Poi, compila il file proto utilizzando il compilatore del buffer del protocollo specifico per la lingua, protoc. Per saperne di più, consulta
Che cos'è gRPC?
e
Concetti di gRPC.
Per fare in modo che il tuo servizio gRPC sia gestito da Endpoints, oltre al file proto compilato, devi specificare una configurazione del servizio in uno o più file YAML. Una configurazione del servizio è una specifica che ti consente di definire il comportamento di un servizio gRPC, inclusi autenticazione, quote e altro ancora.
Panoramica della configurazione del servizio
Nella parte superiore del file YAML, specifica le informazioni di base sul servizio, come nome e titolo. Configura altri aspetti del servizio nelle sottosezioni del file YAML, ad esempio:
- Quali API vengono pubblicate.
- Come vengono autenticati i chiamanti.
- Come limitare o concedere l'accesso API con le chiavi API.
- Come si accede alle API utilizzando HTTP REST.
- Per le API che utilizzano il dominio
cloud.goog, la configurazione DNS.
Ad esempio:
type: google.api.Service
config_version: 3
name: calendar.googleapis.com
title: Google Calendar API
apis:
- name: google.calendar.v3.Calendar
authentication:
providers:
- id: google_calendar_auth
jwks_uri: https://www.googleapis.com/oauth2/v1/certs
issuer: https://securetoken.google.com
rules:
- selector: "*"
requirements:
provider_id: google_calendar_auth
backend:
rules:
- selector: "*"
address: grpcs://my-service-98sdf8sd0-uc.a.run.app
Ogni sottosezione in genere corrisponde a un
.proto messaggio
in cui configuri vari aspetti del servizio. Ad esempio:
authentication: specifica la modalità di autenticazione dei chiamanti.backend: controlla il routing del backend remoto.http: definisce le regole per mappare un metodo RPC a uno o più metodi API REST HTTP.usage: consente di attivare e disattivare selettivamente la convalida della chiave API.
Lo schema ufficiale per la configurazione del servizio è definito dal messaggio .proto
google.api.Service.
Configurazione di base
L'esempio di libreria, utilizzato nei tutorial gRPC, include un file di definizione dell'interfaccia di base e un file di configurazione del servizio.
The Bookstore interface definition,
bookstore.proto:
syntax = "proto3"; package endpoints.examples.bookstore; option java_multiple_files = true; option java_outer_classname = "BookstoreProto"; option java_package = "com.google.endpoints.examples.bookstore"; import "google/protobuf/empty.proto"; service Bookstore { rpc ListShelves(google.protobuf.Empty) returns (ListShelvesResponse) {} rpc CreateShelf(CreateShelfRequest) returns (Shelf) {} rpc GetShelf(GetShelfRequest) returns (Shelf) {} rpc DeleteShelf(DeleteShelfRequest) returns (google.protobuf.Empty) {} rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) {} rpc CreateBook(CreateBookRequest) returns (Book) {} rpc GetBook(GetBookRequest) returns (Book) {} rpc DeleteBook(DeleteBookRequest) returns (google.protobuf.Empty) {} } message Shelf { int64 id = 1; string theme = 2; } message Book { int64 id = 1; string author = 2; string title = 3; }
Configurazione del servizio Libreria,
api_config.yaml:
type: google.api.Service config_version: 3 name: bookstore.endpoints.MY_PROJECT_ID.cloud.goog title: Bookstore gRPC API apis: - name: endpoints.examples.bookstore.Bookstore
L'esempio di codice precedente è la configurazione del servizio più semplice perché:
- Definisce un servizio denominato
bookstore.endpoints.MY_PROJECT_ID.cloud.goog, doveMY_PROJECT_IDrappresenta l'ID progetto Google Cloud . - Specifica che il servizio espone l'API
endpoints.examples.bookstore.Bookstore, come definito nel filebookstore.proto. - Fornisce un titolo descrittivo che viene visualizzato nella pagina Endpoints > Servizi nella console Google Cloud dopo il deployment della configurazione. Per commenti più dettagliati, consulta le versioni complete di GitHub di ogni file.
Regole e selettori
In alcuni casi, potrebbe essere necessario associare la configurazione a singoli elementi di un servizio, ad esempio per applicare l'autenticazione a determinati metodi, ma non ad altri. Per configurare questa opzione nella configurazione del servizio,
alcune parti della configurazione del servizio, ad esempio
authentication
e
http,
consentono di specificare regole e selettori. Un selettore identifica
gli elementi del servizio, ad esempio un nome di metodo a cui si applica la configurazione
associata alla regola.
Un selettore è un elenco separato da virgole di nomi qualificati definiti in service:
method, message, field, enum o enum values. L'ultimo segmento del nome può essere
il carattere jolly *, che corrisponde a qualsiasi suffisso. I caratteri jolly sono consentiti solo alla fine di un nome e solo per un intero segmento del nome. Ad esempio, foo.* va bene, ma non foo.b* o foo.*.bar. Per configurare un valore predefinito per tutti gli elementi applicabili, specifica * da solo.
Esempio 1 (che interessa l'intero servizio):
usage:
rules:
# Allow unregistered calls for all methods.
- selector: "*"
allow_unregistered_calls: true
Esempio 2 (che interessa un singolo metodo):
usage:
rules: # IMPORTANT: ONLY LAST MATCHING RULE IS APPLIED
# Disable API key validation on just the ListShelves method
# while requiring an API key for the rest of the API.
- selector: "*"
allow_unregistered_calls: false
- selector: "endpoints.examples.bookstore.BookStore.ListShelves"
allow_unregistered_calls: true
L'esempio precedente mostra come richiedere la convalida della chiave API per tutti i metodi
tranne il metodo ListShelves.
Le regole vengono valutate in sequenza e viene applicata l'ultima corrispondente nell'ordine di dichiarazione.
Utilizzo di più file YAML
Potrebbe essere utile utilizzare più di un file YAML per configurare funzionalità diverse per lo stesso servizio. L'utilizzo di più file YAML semplifica
il riutilizzo dei file e la loro modifica per ambienti diversi. Ad esempio, nell'esempio
Bookstore, la configurazione di base è specificata nel
file api_config.yaml e le relative regole HTTP sono specificate nel
file api_config_http.yaml. In questo modo puoi eseguire il deployment delle regole HTTP solo se vuoi attivare la transcodifica da JSON/HTTP
a gRPC per Bookstore.
Se utilizzi più file YAML per la configurazione del servizio, quando la configurazione viene implementata, ogni file viene convertito in messaggi proto google.api.Service e poi tutti i messaggi vengono uniti utilizzando la semantica di unione proto.
ovvero tutti i campi scalari singoli nella seconda istanza sostituiscono quelli nella prima. Pertanto, se fornisci valori singolari diversi per la stessa regola in due
file, viene utilizzato il valore nel secondo file specificato durante il deployment della configurazione. I messaggi incorporati singoli vengono uniti e i campi ripetuti vengono concatenati.
Come le regole, l'unione è sensibile all'ordine. Se sono presenti due configurazioni del servizio, la seconda configurazione del servizio sostituisce la prima.
Annotazioni (solo regole HTTP)
In alternativa all'utilizzo di un file YAML per configurare le opzioni HTTP, puoi
configurarle direttamente nel file proto utilizzando il
meccanismo delle opzioni.
Le annotazioni API sono definite in
annotations.proto.
Utilizza le annotazioni se l'opzione di configurazione deve essere invariante in tutti gli utilizzi della definizione dell'interfaccia del buffer di protocollo. Ad esempio, se un'API ha
una sola implementazione o tutte le implementazioni devono avere la stessa
interfaccia HTTP, puoi annotare la configurazione HTTP nel file proto.
Se un'opzione di configurazione viene fornita sia nel file proto sia nel file YAML di configurazione del servizio, la configurazione del servizio sostituisce l'annotazione.
Esempio di annotazione in un file proto:
rpc ListShelves(google.protobuf.Empty) returns (ListShelvesResponse) {
option (google.api.http) = { get: "/v1/shelves" };
}
# The preceding annotation is equivalent to the following service configuration:
http:
rules:
- selector: endpoints.examples.bookstore.BookStore.ListShelves
get: '/v1/shelves'
Per saperne di più, consulta Transcodifica di HTTP/JSON in gRPC.
Convalida della configurazione
Esegui il deployment della configurazione del servizio e dei file proto compilati utilizzando
gcloud endpoints services deploy
per creare la configurazione di runtime del servizio. Il comando gcloud endpoints services
deploy convalida la configurazione del servizio e segnala eventuali errori e
avvisi.
Gli avvisi sono suddivisi in avvisi regolari e avvisi di controllo del codice. Gli avvisi di Linter
utilizzano un identificatore nel formato <group>-<rule>, dove <group>
indica il gruppo di configurazione e <rule> la regola
di Linter specifica. Ad esempio, sotto il gruppo è presente versioning e la regola è
http-version-prefix:
WARNING: bookstore.proto:51:3: (lint) versioning-http-version-prefix: method
'endpoints.examples.bookstore.BookStore.ListShelves' has a different version
prefix in HTTP path ('v2') than api version 'v1'.
Puoi eliminare gli avvisi del linter aggiungendo una direttiva alla documentazione di un elemento API. Puoi aggiungere la direttiva nel file proto o nel file YAML di configurazione del servizio. Ad esempio, il seguente codice sopprime l'avviso precedente:
service Bookstore {
// Returns an object.
// (== suppress_warning versioning-http-version-prefix ==)
rpc ListShelves(google.protobuf.Empty) returns (ListShelvesResponse) {
option (google.api.http) = { get: "/v1/shelves" };
}
}
Per eliminare gli avvisi per un intero gruppo, puoi utilizzare un carattere jolly (*) anziché i nomi delle regole. Ad esempio, versioning-* elimina tutti gli avvisi relativi al gruppo versioning.
Le direttive di eliminazione associate agli elementi principali vengono applicate anche a tutti
gli elementi secondari. Ad esempio, il seguente esempio elimina tutti gli avvisi del gruppo versioning
su tutti i metodi all'interno del servizio:
// (== suppress_warning versioning-* ==)
service Bookstore {
// Returns an object.
rpc ListShelves(google.protobuf.Empty) returns (ListShelvesResponse) {
option (google.api.http) = { get: "/v1/shelves" };
}
}
Per eliminare un avviso a livello globale, collegalo alla documentazione di panoramica della configurazione del servizio:
type: google.api.Service
name: your_api.endpoints.<producer-project-id>.cloud.goog
title: Bookstore gRPC API
apis:
- name: endpoints.examples.bookstore.BookStore
documentation:
overview: |
A simple Bookstore gRPC API.
(== suppress_warning documentation-presence ==)
Tieni presente che le direttive nella documentazione, ad esempio suppress_warning, devono
essere visualizzate su una riga separata, altrimenti non verranno
riconosciute. I marcatori letterali dei blocchi YAML, come >, rimuovono tutti
i caratteri di nuova riga, quindi se utilizzi overview: > nell'esempio precedente,
la soppressione non funziona. Per ulteriori informazioni sui valori letterali a blocchi in YAML,
consulta
Delimitazione con rientro.
Passaggi successivi
- Configurazione di Endpoints
- Esegui il deployment della configurazione di Endpoints
- Riferimento per la configurazione del servizio gRPC