Vergleich von gRPC-Diensten mit HTTP-APIsCompare gRPC services with HTTP APIs

Von James Newton-KingBy James Newton-King

In diesem Artikel wird der Vergleich von gRPC-Diensten mit HTTP-APIs mit JSON (einschließlich ASP.NET Core-Web-APIs) erläutert.This article explains how gRPC services compare to HTTP APIs with JSON (including ASP.NET Core web APIs). Die Technologie, mit der eine API für Ihre App bereitgestellt wird, ist eine wichtige Wahl, und gRPC bietet im Vergleich zu HTTP-APIs besondere Vorteile.The technology used to provide an API for your app is an important choice, and gRPC offers unique benefits compared to HTTP APIs. In diesem Artikel werden die Stärken und Schwächen von gRPC erläutert und Szenarien empfohlen, in denen gRPC gegenüber anderen Technologien bevorzugt zu verwenden ist.This article discusses the strengths and weaknesses of gRPC and recommends scenarios for using gRPC over other technologies.

Allgemeiner VergleichHigh-level comparison

Die folgende Tabelle bietet einen allgemeinen Vergleich der Features von gRPC und HTTP-APIs mit JSON.The following table offers a high-level comparison of features between gRPC and HTTP APIs with JSON.

FeatureFeature gRPCgRPC HTTP-APIs mit JSONHTTP APIs with JSON
VertragContract Erforderlich ( .proto)Required (.proto) Optional (OpenAPI)Optional (OpenAPI)
ProtokollProtocol HTTP/2HTTP/2 HTTPHTTP
PayloadPayload Protobuf (klein, binär)Protobuf (small, binary) JSON (groß, für Menschen lesbar)JSON (large, human readable)
PräskriptivitätPrescriptiveness Strikte SpezifikationStrict specification Locker.Loose. Jedes HTTP ist gültig.Any HTTP is valid.
StreamingStreaming Client, Server, bidirektionalClient, server, bi-directional Client, ServerClient, server
BrowserunterstützungBrowser support Nein (erfordert grpc-web)No (requires grpc-web) JaYes
SicherheitSecurity Transport (TLS)Transport (TLS) Transport (TLS)Transport (TLS)
ClientcodegenerierungClient code-generation JaYes OpenAPI + Tools von DrittanbieternOpenAPI + third-party tooling

gRPC-StärkengRPC strengths

LeistungPerformance

gRPC-Nachrichten werden mit Protobuf serialisiert, einem effizienten binären Nachrichtenformat.gRPC messages are serialized using Protobuf, an efficient binary message format. Protobuf wird sehr schnell auf dem Server und dem Client serialisiert.Protobuf serializes very quickly on the server and client. Die Protobuf-Serialisierung führt zu kleinen Nachrichtennutzlasten, was in Szenarien mit begrenzter Bandbreite wichtig ist, z. B. bei mobilen Apps.Protobuf serialization results in small message payloads, important in limited bandwidth scenarios like mobile apps.

gRPC wurde für HTTP/2 konzipiert, eine umfassende Überarbeitung von HTTP, die erhebliche Leistungsvorteile gegenüber HTTP 1.x bietet:gRPC is designed for HTTP/2, a major revision of HTTP that provides significant performance benefits over HTTP 1.x:

  • Binäre Rahmen und Komprimierung.Binary framing and compression. Das HTTP/2-Protokoll ist sowohl beim Senden als auch beim Empfangen kompakt und effizient.HTTP/2 protocol is compact and efficient both in sending and receiving.
  • Multiplexing mehrerer HTTP/2-Aufrufe über eine einzelne TCP-Verbindung.Multiplexing of multiple HTTP/2 calls over a single TCP connection. Durch Multiplexing werden Head-of-Line-Blockierungen beseitigt.Multiplexing eliminates head-of-line blocking.

HTTP/2 ist nicht exklusiv für GrpC.HTTP/2 is not exclusive to gRPC. Viele Anforderungstypen, einschließlich HTTP-APIs mit JSON, können HTTP/2 verwenden und von dessen Leistungsverbesserungen profitieren.Many request types, including HTTP APIs with JSON, can use HTTP/2 and benefit from its performance improvements.

CodeerzeugungCode generation

Alle gRPC-Frameworks bieten erstklassige Unterstützung für die Codegenerierung.All gRPC frameworks provide first-class support for code generation. Eine Kerndatei zur gRPC-Entwicklung ist die .proto-Datei, die den Vertrag der gRPC-Dienste und -Nachrichten definiert.A core file to gRPC development is the .proto file, which defines the contract of gRPC services and messages. Aus dieser Datei generieren die gRPC-Frameworks im Code eine Dienstbasisklasse, Nachrichten und einen vollständigen Client.From this file gRPC frameworks will code generate a service base class, messages, and a complete client.

Durch die Freigabe der .proto-Datei zwischen dem Server und dem Client können Nachrichten und Clientcode von Ende zu Ende generiert werden.By sharing the .proto file between the server and client, messages and client code can be generated from end to end. Die Codegenerierung des Clients verhindert die Duplizierung von Nachrichten auf dem Client und dem Server und erstellt einen stark typisierten Client für Sie.Code generation of the client eliminates duplication of messages on the client and server, and creates a strongly-typed client for you. Wenn Sie keinen Client schreiben müssen, sparen Sie bei Anwendungen mit vielen Diensten erheblich an Entwicklungszeit.Not having to write a client saves significant development time in applications with many services.

Strikte SpezifikationStrict specification

Eine formale Spezifikation für die HTTP-API mit JSON existiert nicht.A formal specification for HTTP API with JSON doesn't exist. Entwickler diskutieren über das beste Format für URLs, HTTP-Verben und Antwortcodes.Developers debate the best format of URLs, HTTP verbs, and response codes.

Die gRPC-Spezifikation gibt vor, welchem Format ein gRPC-Dienst folgen muss.The gRPC specification is prescriptive about the format a gRPC service must follow. gRPC macht Diskussionen überflüssig und spart Entwicklern Zeit, da gRPC über Plattformen und Implementierungen hinweg konsistent ist.gRPC eliminates debate and saves developer time because gRPC is consistent across platforms and implementations.

StreamingStreaming

HTTP/2 bietet eine Grundlage für langlebige Echtzeitkommunikationsdatenströme.HTTP/2 provides a foundation for long-lived, real-time communication streams. gRPC bietet erstklassige Unterstützung für das Streaming über HTTP/2.gRPC provides first-class support for streaming through HTTP/2.

Ein gRPC-Dienst unterstützt alle Streamingkombinationen:A gRPC service supports all streaming combinations:

  • Unär (kein Streaming)Unary (no streaming)
  • Streaming vom Server zum ClientServer to client streaming
  • Streaming vom Client zum ServerClient to server streaming
  • Bidirektionales StreamingBi-directional streaming

Stichtag/Zeitlimits und AbbruchDeadline/timeouts and cancellation

Mit gRPC können Clients angeben, wie lange sie bereit sind, auf den RPC-Abschluss zu warten.gRPC allows clients to specify how long they are willing to wait for an RPC to complete. Der Stichtag wird an den Server gesendet, und der Server kann entscheiden, welche Aktion bei einer Überschreitung der Frist durchgeführt werden soll.The deadline is sent to the server, and the server can decide what action to take if it exceeds the deadline. Der Server kann z. B. in Bearbeitung befindliche gRPC-/HTTP-/Datenbankanforderungen bei einem Timeout abbrechen.For example, the server might cancel in-progress gRPC/HTTP/database requests on timeout.

Die Weitergabe des Stichtags und des Abbruchs durch untergeordnete gRPC-Aufrufe hilft bei der Durchsetzung der Ressourcennutzungslimits.Propagating the deadline and cancellation through child gRPC calls helps enforce resource usage limits.

gRPC ist für die folgenden Szenarien besonders geeignet:gRPC is well suited to the following scenarios:

  • Microservices: gRPC ist für kurze Wartezeiten und Kommunikation mit hohem Durchsatz konzipiert.Microservices: gRPC is designed for low latency and high throughput communication. gRPC eignet sich hervorragend für einfache Microservices, bei denen die Effizienz entscheidend ist.gRPC is great for lightweight microservices where efficiency is critical.
  • Punkt-zu-Punkt-Echtzeitkommunikation: gRPC weist eine ausgezeichnete Unterstützung für bidirektionales Streaming auf.Point-to-point real-time communication: gRPC has excellent support for bi-directional streaming. gRPC-Dienste können Nachrichten in Echtzeit und ohne Abrufen bereitstellen.gRPC services can push messages in real-time without polling.
  • Mehrsprachige Umgebungen: gRPC-Tools unterstützen alle gängigen Entwicklungssprachen, was gRPC zu einer guten Wahl für mehrsprachige Umgebungen macht.Polyglot environments: gRPC tooling supports all popular development languages, making gRPC a good choice for multi-language environments.
  • Umgebungen mit Netzwerkbeschränkungen: gRPC-Nachrichten werden mit Protobuf serialisiert, einem einfachen Nachrichtenformat.Network constrained environments: gRPC messages are serialized with Protobuf, a lightweight message format. Eine gRPC-Nachricht ist immer kleiner als eine entsprechende JSON-Nachricht.A gRPC message is always smaller than an equivalent JSON message.

Schwächen von gRPCgRPC weaknesses

Eingeschränkte BrowserunterstützungLimited browser support

Es ist heute unmöglich, einen gRPC-Dienst direkt von einem Browser aus aufzurufen.It's impossible to directly call a gRPC service from a browser today. gRPC nutzt in hohem Maße HTTP/2-Features, und kein Browser bietet das für die Unterstützung eines gRPC-Clients erforderliche Maß an Kontrolle über Webanforderungen.gRPC heavily uses HTTP/2 features and no browser provides the level of control required over web requests to support a gRPC client. Browser gestatten es einem Aufrufer z. B. nicht, die Verwendung von HTTP/2 zu erfordern oder den Zugriff auf zugrunde liegende HTTP/2-Frames zu ermöglichen.For example, browsers do not allow a caller to require that HTTP/2 be used, or provide access to underlying HTTP/2 frames.

gRPC-Web ist eine zusätzliche Technologie des gRPC-Teams, die eine begrenzte gRPC-Unterstützung im Browser bietet.gRPC-Web is an additional technology from the gRPC team that provides limited gRPC support in the browser. gRPC-Web besteht aus zwei Teilen: einem JavaScript-Client, der alle modernen Browser unterstützt, und einem gRPC-Webproxy auf dem Server.gRPC-Web consists of two parts: a JavaScript client that supports all modern browsers, and a gRPC-Web proxy on the server. Der gRPC-Webclient ruft den Proxy auf, und der Proxy leitet die gRPC-Anforderungen an den gRPC-Server weiter.The gRPC-Web client calls the proxy and the proxy will forward on the gRPC requests to the gRPC server.

Nicht alle Features von gRPC werden von gRPC-Web unterstützt.Not all of gRPC's features are supported by gRPC-Web. Client- und bidirektionales Streaming wird nicht unterstützt, und es gibt nur begrenzte Unterstützung für Serverstreaming.Client and bi-directional streaming isn't supported, and there is limited support for server streaming.

Tipp

.NET Core unterstützt gRPC-Web..NET Core has support for gRPC-Web. Weitere Informationen finden Sie unter Verwenden von gRPC in Browser-Apps.Visit Verwenden von gRPC in Browser-Apps for more information.

Nicht für Menschen lesbarNot human readable

HTTP-API-Anforderungen werden als Text gesendet und können von Menschen gelesen und erstellt werden.HTTP API requests are sent as text and can be read and created by humans.

gRPC-Nachrichten werden standardmäßig mit Protobuf codiert.gRPC messages are encoded with Protobuf by default. Obwohl Protobuf effizient zu senden und zu empfangen ist, ist sein binäres Format nicht für Menschen lesbar.While Protobuf is efficient to send and receive, its binary format isn't human readable. Protobuf benötigt die in der .proto-Datei angegebene Schnittstellenbeschreibung der Nachricht, um sie ordnungsgemäß zu deserialisieren.Protobuf requires the message's interface description specified in the .proto file to properly deserialize. Zusätzliche Tools sind erforderlich, um die Protobuf-Nutzlasten im Netzwerk zu analysieren und Anforderungen manuell zusammenzustellen.Additional tooling is required to analyze Protobuf payloads on the wire and to compose requests by hand.

Es gibt Features wie Serverreflexion und das gRPC-Befehlszeilentool, die bei binären Protobuf-Nachrichten helfen.Features such as server reflection and the gRPC command line tool exist to assist with binary Protobuf messages. Außerdem unterstützen Protobuf-Nachrichten die Konvertierung zu und von JSON.Also, Protobuf messages support conversion to and from JSON. Die integrierte JSON-Konvertierung bietet eine effiziente Möglichkeit, Protobuf-Nachrichten beim Debuggen in und aus der für Menschen lesbaren Form zu konvertieren.The built-in JSON conversion provides an efficient way to convert Protobuf messages to and from human readable form when debugging.

Alternative FrameworkszenarienAlternative framework scenarios

In den folgenden Szenarien werden andere Frameworks als gRPC empfohlen:Other frameworks are recommended over gRPC in the following scenarios:

  • Über Browser zugängliche APIs: gRPC wird im Browser nicht vollständig unterstützt.Browser accessible APIs: gRPC isn't fully supported in the browser. gRPC-Web kann eine Browserunterstützung bieten, hat aber Einschränkungen und führt einen Serverproxy ein.gRPC-Web can offer browser support, but it has limitations and introduces a server proxy.
  • Übertragung von Echtzeitkommunikation: gRPC unterstützt Echtzeitkommunikation per Streaming, das Konzept der Übertragung einer Nachricht an registrierte Verbindungen existiert allerdings nicht.Broadcast real-time communication: gRPC supports real-time communication via streaming, but the concept of broadcasting a message out to registered connections doesn't exist. In einem Chatraum-Szenario, in dem z. B. neue Chatnachrichten an alle Clients im Chatraum gesendet werden sollen, ist jeder gRPC-Aufruf erforderlich, um neue Chatnachrichten einzeln an den Client zu senden.For example in a chat room scenario where new chat messages should be sent to all clients in the chat room, each gRPC call is required to individually stream new chat messages to the client. SignalR ist ein hilfreiches Framework für dieses Szenario.SignalR is a useful framework for this scenario. SignalR weist das Konzept der dauerhaften Verbindungen und der integrierten Unterstützung für das Senden von Nachrichten auf. has the concept of persistent connections and built-in support for broadcasting messages.
  • Prozessübergreifende Kommunikation: Ein Prozess muss zum Akzeptieren eingehender gRPC-Aufrufe einen HTTP/2-Server hosten.Inter-process communication: A process must host an HTTP/2 server to accept incoming gRPC calls. Für Windows sind Pipes für die prozessübergreifende Kommunikation eine schnelle, einfache Kommunikationsmethode.For Windows, inter-process communication pipes is a fast, lightweight method of communication.

Zusätzliche RessourcenAdditional resources