Porównanie usług gRPC za pomocą interfejsów API protokołu HTTPCompare gRPC services with HTTP APIs

Przez Kuba Kowalski-królaBy James Newton-King

W tym artykule wyjaśniono, w jaki sposób usługi gRPC Services porównują interfejsy API protokołu HTTP z JSON (w tym ASP.NET Core interfejsy API sieci Web)This article explains how gRPC services compare to HTTP APIs with JSON (including ASP.NET Core web APIs). Technologia używana do udostępniania interfejsu API dla aplikacji jest ważnym wyborem, a gRPC oferuje unikatowe korzyści w porównaniu do interfejsów API protokołu HTTP.The technology used to provide an API for your app is an important choice, and gRPC offers unique benefits compared to HTTP APIs. W tym artykule omówiono mocne i słabe zalety gRPC oraz zalecane scenariusze dotyczące korzystania z gRPC przez inne technologie.This article discusses the strengths and weaknesses of gRPC and recommends scenarios for using gRPC over other technologies.

Porównanie wysokiego poziomuHigh-level comparison

Poniższa tabela zawiera porównanie funkcji między gRPC i interfejsami API protokołu HTTP z kodem JSON.The following table offers a high-level comparison of features between gRPC and HTTP APIs with JSON.

CechyFeature gRPCgRPC Interfejsy API protokołu HTTP z JSONHTTP APIs with JSON
KontraktContract Wymagane ( . proto )Required ( .proto ) Opcjonalnie (OpenAPI)Optional (OpenAPI)
ProtokółProtocol HTTP/2HTTP/2 HTTPHTTP
ŁadunkuPayload Protobuf (mały, binarny)Protobuf (small, binary) JSON (duże, czytelne dla ludzi)JSON (large, human readable)
PrescriptivenessPrescriptiveness Specyfikacja StrictStrict specification Sypki.Loose. Wszystkie protokoły HTTP są prawidłowe.Any HTTP is valid.
Przesyłanie strumienioweStreaming Klient, serwer, dwukierunkowaClient, server, bi-directional Klient, serwerClient, server
Obsługa przeglądarkiBrowser support Nie (wymaga GRPC-Web)No (requires grpc-web) TakYes
ZabezpieczeniaSecurity Transport (TLS)Transport (TLS) Transport (TLS)Transport (TLS)
Generowanie kodu klientaClient code-generation TakYes Narzędzia OpenAPI + inne firmyOpenAPI + third-party tooling

mocne gRPCgRPC strengths

WydajnośćPerformance

komunikaty gRPC są serializowane przy użyciu protobuf, wydajnego formatu komunikatów binarnych.gRPC messages are serialized using Protobuf, an efficient binary message format. Protobuf się bardzo szybko na serwerze i kliencie.Protobuf serializes very quickly on the server and client. Serializacja protobuf skutkuje niewielkimi ładunekmi komunikatów, co jest ważne w ograniczonych scenariuszach dotyczących przepustowości, takich jak aplikacje mobilne.Protobuf serialization results in small message payloads, important in limited bandwidth scenarios like mobile apps.

gRPC została zaprojektowana dla protokołu HTTP/2, która stanowi znaczną wersję protokołu HTTP, która zapewnia znaczący wpływ na wydajność w porównaniu z protokołem HTTP 1. x:gRPC is designed for HTTP/2, a major revision of HTTP that provides significant performance benefits over HTTP 1.x:

  • Binarne ramki i kompresja.Binary framing and compression. Protokół HTTP/2 jest kompaktowy i wydajny zarówno podczas wysyłania, jak i otrzymywania.HTTP/2 protocol is compact and efficient both in sending and receiving.
  • Multipleksowanie wielu wywołań HTTP/2 za pośrednictwem jednego połączenia TCP.Multiplexing of multiple HTTP/2 calls over a single TCP connection. Multipleksowanie eliminuje blokowanie głowy.Multiplexing eliminates head-of-line blocking.

Protokół HTTP/2 nie jest wyłączny do gRPC.HTTP/2 is not exclusive to gRPC. Wiele typów żądań, w tym interfejsy API protokołu HTTP z notacją JSON, może korzystać z protokołu HTTP/2 i korzystać z jego ulepszeń wydajności.Many request types, including HTTP APIs with JSON, can use HTTP/2 and benefit from its performance improvements.

Generowanie koduCode generation

Wszystkie struktury gRPC zapewniają obsługę pierwszej klasy w celu generowania kodu.All gRPC frameworks provide first-class support for code generation. Podstawowy plik do gRPC Development to plik. proto, który definiuje kontrakt usług gRPC Services i messages.A core file to gRPC development is the .proto file, which defines the contract of gRPC services and messages. Z tego pliku struktury gRPC w kodzie generują klasę bazową usługi, komunikaty i kompletny klient.From this file gRPC frameworks will code generate a service base class, messages, and a complete client.

Udostępniając plik . proto między serwerem a klientem, można wygenerować komunikaty i kod klienta na końcu.By sharing the .proto file between the server and client, messages and client code can be generated from end to end. Generowanie kodu klienta eliminuje duplikowanie komunikatów na kliencie i serwerze, a następnie tworzy klienta o jednoznacznie określonym typie.Code generation of the client eliminates duplication of messages on the client and server, and creates a strongly-typed client for you. Nie trzeba pisać klienta powoduje oszczędność czasu projektowania w aplikacjach z wieloma usługami.Not having to write a client saves significant development time in applications with many services.

Specyfikacja StrictStrict specification

Specyfikacja formalna dla interfejsu API protokołu HTTP with JSON nie istnieje.A formal specification for HTTP API with JSON doesn't exist. Deweloperzy zanotują najlepszy format adresów URL, czasowników HTTP i kodów odpowiedzi.Developers debate the best format of URLs, HTTP verbs, and response codes.

Specyfikacja gRPC jest przedskryptowa o formacie, którego musi przestrzegać usługa gRPC.The gRPC specification is prescriptive about the format a gRPC service must follow. gRPC eliminuje debatę i zapisuje czas dewelopera, ponieważ gRPC jest spójny dla wielu platform i implementacji.gRPC eliminates debate and saves developer time because gRPC is consistent across platforms and implementations.

Przesyłanie strumienioweStreaming

Protokół HTTP/2 stanowi podstawę do długotrwałych strumieni komunikacji w czasie rzeczywistym.HTTP/2 provides a foundation for long-lived, real-time communication streams. gRPC zapewnia wsparcie pierwszej klasy do przesyłania strumieniowego za pośrednictwem protokołu HTTP/2.gRPC provides first-class support for streaming through HTTP/2.

Usługa gRPC obsługuje wszystkie kombinacje przesyłania strumieniowego:A gRPC service supports all streaming combinations:

  • Jednoargumentowy (bez przesyłania strumieniowego)Unary (no streaming)
  • Przesyłanie strumieniowe z serwera do klientaServer to client streaming
  • Przesyłanie strumieniowe klienta do serweraClient to server streaming
  • Dwukierunkowe przesyłanie strumienioweBi-directional streaming

Termin/limity czasu i anulowanieDeadline/timeouts and cancellation

gRPC umożliwia klientom określenie, jak długo czekają na ukończenie zdalnego wywoływania procedur.gRPC allows clients to specify how long they are willing to wait for an RPC to complete. Ostateczny termin jest wysyłany do serwera, a serwer może zdecydować, jakie działania należy podjąć, jeśli przekracza termin ostateczny.The deadline is sent to the server, and the server can decide what action to take if it exceeds the deadline. Na przykład serwer może anulować żądania gRPC/HTTP/Database w trakcie limitu czasu.For example, the server might cancel in-progress gRPC/HTTP/database requests on timeout.

Propagowanie terminu i anulowania za pomocą podrzędnych wywołań gRPC ułatwia wymuszenie limitów użycia zasobów.Propagating the deadline and cancellation through child gRPC calls helps enforce resource usage limits.

gRPC doskonale nadaje się do następujących scenariuszy:gRPC is well suited to the following scenarios:

  • Mikrousługi : gRPC został zaprojektowany z myślą o małym opóźnieniu i komunikacji o dużej przepływności.Microservices : gRPC is designed for low latency and high throughput communication. gRPC doskonale nadaje się do lekkich mikrousług, w których wydajność jest krytyczna.gRPC is great for lightweight microservices where efficiency is critical.
  • Komunikacja punkt-punkt w czasie rzeczywistym : gRPC ma doskonałą obsługę przesyłania strumieniowego dwukierunkowego.Point-to-point real-time communication : gRPC has excellent support for bi-directional streaming. usługi gRPC umożliwiają wypychanie komunikatów w czasie rzeczywistym bez sondowania.gRPC services can push messages in real-time without polling.
  • Środowiska Polyglot : narzędzia gRPC obsługują wszystkie popularne języki deweloperskie, co sprawia, że gRPC to dobry wybór w środowiskach wielojęzycznych.Polyglot environments : gRPC tooling supports all popular development languages, making gRPC a good choice for multi-language environments.
  • Środowiska ograniczone sieci : komunikaty gRPC są serializowane z protobuf, formatem uproszczonego komunikatu.Network constrained environments : gRPC messages are serialized with Protobuf, a lightweight message format. Komunikat gRPC jest zawsze krótszy niż odpowiedni komunikat JSON.A gRPC message is always smaller than an equivalent JSON message.
  • Komunikacja między procesami (IPC) : transport IPC, taki jak gniazda domen systemu UNIX i nazwane potoki, może być używany z gRPC do komunikacji między aplikacjami na tym samym komputerze.Inter-process communication (IPC) : IPC transports such as Unix domain sockets and named pipes can be used with gRPC to communicate between apps on the same machine. Aby uzyskać więcej informacji, zobacz Komunikacja między procesami przy użyciu gRPC.For more information, see Komunikacja między procesami przy użyciu gRPC.

słabe gRPCgRPC weaknesses

Ograniczona obsługa przeglądarkiLimited browser support

Obecnie nie można bezpośrednio wywołać usługi gRPC z przeglądarki.It's impossible to directly call a gRPC service from a browser today. gRPC intensywnie używa funkcji protokołu HTTP/2 i żadna przeglądarka nie zapewnia poziomu kontroli wymaganego w przypadku żądań sieci Web do obsługi klienta gRPC.gRPC heavily uses HTTP/2 features and no browser provides the level of control required over web requests to support a gRPC client. Na przykład przeglądarki nie zezwalają obiektowi wywołującemu na użycie protokołu HTTP/2 lub zapewniają dostęp do bazowych ramek HTTP/2.For example, browsers do not allow a caller to require that HTTP/2 be used, or provide access to underlying HTTP/2 frames.

Istnieją dwa typowe podejścia do gRPC do aplikacji przeglądarki:There are two common approaches to bring gRPC to browser apps:

  • gRPC-Web to dodatkowa technologia od zespołu gRPC, która zapewnia pomoc techniczną gRPC w przeglądarce.gRPC-Web is an additional technology from the gRPC team that provides gRPC support in the browser. gRPC — sieć Web umożliwia aplikacjom przeglądarki korzystanie z wysokiej wydajności i niskiego użycia sieci w gRPC.gRPC-Web allows browser apps to benefit from the high-performance and low network usage of gRPC. Nie wszystkie funkcje gRPC są obsługiwane przez gRPC-Web.Not all of gRPC's features are supported by gRPC-Web. Przesyłanie strumieniowe klienta i dwukierunkowego nie jest obsługiwane i ma ograniczoną obsługę przesyłania strumieniowego serwera.Client and bi-directional streaming isn't supported, and there is limited support for server streaming.

    Platforma .NET Core obsługuje program gRPC-Web..NET Core has support for gRPC-Web. Aby uzyskać więcej informacji, zobacz Używanie gRPC w aplikacjach przeglądarki.For more information, see Używanie gRPC w aplikacjach przeglądarki.

  • Interfejsy API sieci Web RESTful JSON można utworzyć automatycznie z poziomu usług gRPC, dodając adnotację do pliku . proto z metadanymi http.RESTful JSON Web APIs can be automatically created from gRPC services by annotating the .proto file with HTTP metadata. Dzięki temu aplikacja może obsługiwać zarówno gRPC, jak i interfejsy API sieci Web w formacie JSON, bez duplikowania nakładów pracy związanych z tworzeniem oddzielnych usług.This allows an app to support both gRPC and JSON web APIs, without duplicating effort of building separate services for both.

    Platforma .NET Core ma eksperymentalną obsługę tworzenia interfejsów API sieci Web JSON z usług gRPC Services..NET Core has experimental support for creating JSON web APIs from gRPC services. Aby uzyskać więcej informacji, zobacz Tworzenie internetowych interfejsów API JSON z usługi gRPC.For more information, see Tworzenie internetowych interfejsów API JSON z usługi gRPC.

Nie można odczytać ludziNot human readable

Żądania interfejsu API protokołu HTTP są wysyłane jako tekst i mogą być odczytywane i tworzone przez człowieka.HTTP API requests are sent as text and can be read and created by humans.

wiadomości gRPC są domyślnie kodowane przy użyciu protobuf.gRPC messages are encoded with Protobuf by default. Gdy protobuf jest wydajny do wysyłania i odbierania, jego format binarny nie jest czytelny.While Protobuf is efficient to send and receive, its binary format isn't human readable. Protobuf wymaga, aby opis interfejsu komunikatu określony w pliku . proto w celu poprawnego deserializacji.Protobuf requires the message's interface description specified in the .proto file to properly deserialize. Dodatkowe narzędzia są wymagane do analizowania ładunków protobuf w sieci oraz do ręcznego tworzenia żądań.Additional tooling is required to analyze Protobuf payloads on the wire and to compose requests by hand.

Funkcje takie jak odbicie serwera i Narzędzie wiersza polecenia gRPC istnieją, aby ułatwić wykonywanie binarnych komunikatów protobuf.Features such as server reflection and the gRPC command line tool exist to assist with binary Protobuf messages. Ponadto komunikaty protobuf obsługują konwersję do i z formatu JSON.Also, Protobuf messages support conversion to and from JSON. Wbudowana konwersja JSON zapewnia wydajny sposób konwersji komunikatów protobuf na i z formularza, który można odczytać przez człowieka podczas debugowania.The built-in JSON conversion provides an efficient way to convert Protobuf messages to and from human readable form when debugging.

Scenariusze dotyczące platformy alternatywnejAlternative framework scenarios

Inne struktury są zalecane w porównaniu z gRPC w następujących scenariuszach:Other frameworks are recommended over gRPC in the following scenarios:

  • Interfejsy API dostępne dla przeglądarki : gRPC nie jest w pełni obsługiwane w przeglądarce.Browser accessible APIs : gRPC isn't fully supported in the browser. gRPC — sieć Web może oferować pomoc techniczną przeglądarki, ale ma ograniczenia i wprowadza serwer proxy serwera.gRPC-Web can offer browser support, but it has limitations and introduces a server proxy.
  • Rozgłaszanie komunikacji w czasie rzeczywistym: gRPC obsługuje komunikację w czasie rzeczywistym za pośrednictwem przesyłania strumieniowego, ale pojęcie rozgłaszania komunikatów do zarejestrowanych połączeń nie istnieje.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. Na przykład w scenariuszu pokoju rozmów, w którym nowe wiadomości czatu powinny być wysyłane do wszystkich klientów w pokoju rozmowy, każde wywołanie gRPC jest wymagane do narzucania strumieniowego przesyłania nowych komunikatów rozmowy do klienta.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 jest przydatną strukturą dla tego scenariusza.SignalR is a useful framework for this scenario. SignalR ma koncepcję trwałych połączeń i wbudowaną obsługę rozgłaszania komunikatów.SignalR has the concept of persistent connections and built-in support for broadcasting messages.

Dodatkowe zasobyAdditional resources