Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Questa pagina mostra i dettagli specifici di Knative Serving per gli sviluppatori che
vogliono utilizzare gRPC per connettere un
servizio Knative Serving con altri servizi, ad esempio per fornire
una comunicazione semplice e ad alte prestazioni tra microservizi
interni. Knative serving supporta le chiamate gRPC
unitarie
e
di streaming.
gRPC unitario
In una chiamata RPC unaria, il client invia una singola richiesta al server e riceve una
singola risposta, in modo simile a una normale chiamata di funzione:
Con gRPC sono disponibili le seguenti opzioni di streaming.
RPC di streaming del server in cui il client invia una richiesta al server e riceve uno stream da leggere contenente una sequenza di messaggi. Il client legge lo stream restituito
finché non ci sono più messaggi.
RPC di streaming client in cui il client scrive una sequenza di messaggi e li invia
al server in un flusso. Dopo aver terminato di scrivere i messaggi, il client
attende che il server restituisca la risposta.
Carichi elevati di dati (gRPC utilizza i buffer di protocollo,
che sono fino a sette volte più veloci delle chiamate REST).
È necessaria solo una semplice definizione del servizio, non vuoi scrivere una libreria client completa.
Per integrare il tuo servizio con gRPC:
Definisci i messaggi di richiesta e le risposte in un file proto e compilali.
Crea un server gRPC per gestire le richieste e restituire le risposte: deve ascoltare
la variabile di ambiente PORT.
Crea un client che invia richieste e gestisce le risposte del server gRPC.
Se vuoi, aggiungi l'autenticazione.
Crea ed esegui il deployment del tuo servizio.
Definire e compilare i messaggi in un file proto
Non ci sono elementi aggiuntivi o specifici di Knative serving da aggiungere alle definizioni
proto. Come per qualsiasi altro utilizzo di gRPC, utilizzi
i buffer di protocollo gRPC
per le definizioni dei servizi e la serializzazione dei dati.
Creazione di un client gRPC
Non ci sono elementi aggiuntivi o specifici di Knative Serving da aggiungere a un client
che utilizza gRPC: segui la documentazione di gRPC sull'utilizzo delle definizioni di servizio nel
codice client e i
client di esempio forniti nelle
esercitazioni su gRPC specifiche per la lingua.
Ascolto delle richieste gRPC in un servizio Knative
L'unico requisito speciale per un server gRPC in esecuzione in
Knative serving è l'ascolto sulla porta specificata dalla variabile di ambiente PORT
come mostrato nel codice:
Vai
funcmain(){log.Printf("grpc-ping: starting server...")port:=os.Getenv("PORT")ifport==""{port="8080"log.Printf("Defaulting to port %s",port)}listener,err:=net.Listen("tcp",":"+port)iferr!=nil{log.Fatalf("net.Listen: %v",err)}grpcServer:=grpc.NewServer()pb.RegisterPingServiceServer(grpcServer,&pingService{})iferr=grpcServer.Serve(listener);err!=nil{log.Fatal(err)}}
Apertura di una connessione gRPC a un servizio
Per aprire una connessione gRPC a un servizio in modo da poter inviare messaggi gRPC, devi specificare il dominio host, ovvero l'URL del servizio Knative o il dominio personalizzato mappato a quel servizio, insieme alla porta 443, che è la porta che gRPC prevede di utilizzare.
Vai
import("crypto/tls""crypto/x509""google.golang.org/grpc""google.golang.org/grpc/credentials")// NewConn creates a new gRPC connection.// host should be of the form domain:port, e.g., example.com:443funcNewConn(hoststring,insecurebool)(*grpc.ClientConn,error){varopts[]grpc.DialOptionifhost!=""{opts=append(opts,grpc.WithAuthority(host))}ifinsecure{opts=append(opts,grpc.WithInsecure())}else{// Note: On the Windows platform, use of x509.SystemCertPool() requires// Go version 1.18 or higher.systemRoots,err:=x509.SystemCertPool()iferr!=nil{returnnil,err}cred:=credentials.NewTLS(&tls.Config{RootCAs:systemRoots,})opts=append(opts,grpc.WithTransportCredentials(cred))}returngrpc.Dial(host,opts...)}
Invio di richieste gRPC senza autenticazione
Il seguente esempio mostra come inviare una richiesta senza autenticazione, utilizzando una connessione gRPC configurata come indicato in precedenza.
Vai
import("context""time"pb"github.com/GoogleCloudPlatform/golang-samples/run/grpc-ping/pkg/api/v1""google.golang.org/grpc")// pingRequest sends a new gRPC ping request to the server configured in the connection.funcpingRequest(conn*grpc.ClientConn,p*pb.Request)(*pb.Response,error){ctx,cancel:=context.WithTimeout(context.Background(),30*time.Second)defercancel()client:=pb.NewPingServiceClient(conn)returnclient.Send(ctx,p)}
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Difficile da capire","hardToUnderstand","thumb-down"],["Informazioni o codice di esempio errati","incorrectInformationOrSampleCode","thumb-down"],["Mancano le informazioni o gli esempi di cui ho bisogno","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-09-04 UTC."],[],[],null,["# Invoking with gRPC\n\nThis page shows Knative serving-specific details for developers who\nwant to use [gRPC](https://grpc.io/) to connect a\nKnative serving service with other services, for example, to provide\nsimple, high performance communication between internal\nmicroservices. Knative serving supports both\n[unary](#before-you-begin)\nand\n[streaming](#before-you-begin)\ngRPC calls. \n\n### gRPC Unary\n\nIn a unary RPC call, the client sends a single request to the server and gets a single response back, similar to a normal function call: \n\n```\nrpc SayHello(HelloRequest) returns (HelloResponse);\n``` \nOK \n\n### gRPC Streaming\n\n\u003cbr /\u003e\n\nThe following streaming options are available with gRPC.\nServer streaming RPCs where the client sends a request to the server and gets a\nstream to read containing a sequence of messages. The client reads the returned\nstream until there are no more messages. \n\n```\nrpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);\n```\n\n\u003cbr /\u003e\n\nClient streaming RPCs where the client writes a sequence of messages and sends\nthem to the server in a stream. After the client finishes writing messages, it\nwaits for the server to return its response. \n\n```\nrpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);\n```\n\n\u003cbr /\u003e\n\nBidirectional streaming RPCs where client and server send messages in two\nread-write streams that operate independently. \n\n```\nrpc BidiHello(stream HelloRequest) returns (stream HelloResponse);\n``` \nOK\n\nPossible use cases include:\n\n- Communication between internal microservices.\n- High loads of data (gRPC uses [protocol buffers](https://developers.google.com/protocol-buffers), which are up to seven times faster than REST calls).\n- Only a simple service definition is needed, you don't want to write a full client library.\n\nTo integrate your service with gRPC,\n\n- Define the request messages and responses in a proto file and compile them.\n- Create a gRPC server to handle requests and return responses: it should listen to the `PORT` environment variable.\n- Create a client that sends requests and handles responses from the gRPC server.\n- Optionally, add authentication.\n- Build and deploy your service.\n\nDefining and compiling messages in a proto file\n-----------------------------------------------\n\nThere are no extra or Knative serving specific things to add to your proto\ndefinitions. Just as with any other use of gRPC, you use\n[gRPC protocol buffers](https://grpc.io/docs/guides/#working-with-protocol-buffers)\nfor service definitions and data serialization.\n\nCreating a gRPC client\n----------------------\n\nThere are no extra or Knative serving specific things to add to a client\nthat uses gRPC: follow the gRPC docs on using service definitions in\n[client code](https://grpc.io/docs/guides/concepts/#using-the-api), and the\nsample clients provided in the language-specific\n[gRPC tutorials](https://grpc.io/docs/languages).\n\nListening for gRPC requests in a Knative serving service\n--------------------------------------------------------\n\nThe only special requirement for a gRPC server running in\nKnative serving is to listen at the port specified by the `PORT`\nenvironment variable as shown in the code:\n\n\n### Go\n\n func main() {\n \tlog.Printf(\"grpc-ping: starting server...\")\n\n \tport := os.Getenv(\"PORT\")\n \tif port == \"\" {\n \t\tport = \"8080\"\n \t\tlog.Printf(\"Defaulting to port %s\", port)\n \t}\n\n \tlistener, err := net.Listen(\"tcp\", \":\"+port)\n \tif err != nil {\n \t\tlog.Fatalf(\"net.Listen: %v\", err)\n \t}\n\n \tgrpcServer := grpc.NewServer()\n \tpb.RegisterPingServiceServer(grpcServer, &pingService{})\n \tif err = grpcServer.Serve(listener); err != nil {\n \t\tlog.Fatal(err)\n \t}\n }\n\n\u003cbr /\u003e\n\nOpening a gRPC connection to a service\n--------------------------------------\n\nTo open a gRPC connection to a service so you can send gRPC messages, you need\nto specify the host domain, which is the URL of the Knative serving service\nor the custom domain [mapped](/kubernetes-engine/enterprise/knative-serving/docs/mapping-custom-domains) to that service,\nalong with the port 443, which is the port expected to be used by gRPC.\n\n\n### Go\n\n\n import (\n \t\"crypto/tls\"\n \t\"crypto/x509\"\n\n \t\"google.golang.org/grpc\"\n \t\"google.golang.org/grpc/credentials\"\n )\n\n // NewConn creates a new gRPC connection.\n // host should be of the form domain:port, e.g., example.com:443\n func NewConn(host string, insecure bool) (*grpc.ClientConn, error) {\n \tvar opts []grpc.DialOption\n \tif host != \"\" {\n \t\topts = append(opts, grpc.WithAuthority(host))\n \t}\n\n \tif insecure {\n \t\topts = append(opts, grpc.WithInsecure())\n \t} else {\n \t\t// Note: On the Windows platform, use of x509.SystemCertPool() requires\n \t\t// Go version 1.18 or higher.\n \t\tsystemRoots, err := x509.SystemCertPool()\n \t\tif err != nil {\n \t\t\treturn nil, err\n \t\t}\n \t\tcred := credentials.NewTLS(&tls.Config{\n \t\t\tRootCAs: systemRoots,\n \t\t})\n \t\topts = append(opts, grpc.WithTransportCredentials(cred))\n \t}\n\n \treturn grpc.Dial(host, opts...)\n }\n\n\u003cbr /\u003e\n\nSending gRPC requests without authentication\n--------------------------------------------\n\nThe following sample shows how to send a request without authentication, using\na [gRPC connection](#connect) configured as mentioned previously.\n\n\n### Go\n\n\n import (\n \t\"context\"\n \t\"time\"\n\n \tpb \"github.com/GoogleCloudPlatform/golang-samples/run/grpc-ping/pkg/api/v1\"\n \t\"google.golang.org/grpc\"\n )\n\n // pingRequest sends a new gRPC ping request to the server configured in the connection.\n func pingRequest(conn *grpc.ClientConn, p *pb.Request) (*pb.Response, error) {\n \tctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)\n \tdefer cancel()\n\n \tclient := pb.NewPingServiceClient(conn)\n \treturn client.Send(ctx, p)\n }\n\n\u003cbr /\u003e"]]