With the 1.3 release, Kong is now able to natively manage and proxy gRPC services. In this blog post, we'll explain what gRPC is and how to manage your gRPC services with Kong.
What is gRPC?
gRPC is a remote procedure call (RPC) framework initially developed by Google circa 2015 that has seen growing adoption in recent years. Based on HTTP/2 for transport and using Protobuf as Interface Definition Language (IDL), gRPC has a number of capabilities that traditional REST APIs struggle with, such as bi-directional streaming and efficient binary encoding.
While Kong supports TCP streams since version 1.0, and, as such, can proxy any protocol built on top of TCP/TLS, we felt native support for gRPC would allow a growing user base to leverage Kong to manage their REST and gRPC services uniformly, including using some of the same Kong plugins they have already been using in their REST APIs.
Native gRPC Support
What follows is a step-by-step tutorial on how to set up Kong to proxy gRPC services, demonstrating two possible scenarios. In the first scenario, a single Route entry in Kong matches all gRPC methods from a service. In the second one, we have per-method Routes, which allows, for example, to apply different plugins to specific gRPC methods.
Before starting, install Kong Gateway, if you haven’t already.
As gRPC uses HTTP/2 for transport, it is necessary to enable HTTP/2 proxy listeners in Kong. To do so, add the following property in your Kong configuration:
Resolved method descriptor:rpc SayHello ( .hello.HelloRequest ) returns ( .hello.HelloResponse );
Request metadata to send:(empty)
Response headers received:content-type: application/grpc
date: Tue,16 Jul 201921:37:36 GMT
server: openresty/1.15.8.1via: kong/1.2.1x-kong-proxy-latency:0x-kong-upstream-latency:0Response contents:{"reply":"hello Kong 1.3!"}Response trailers received:(empty)
Sent 1 request and received 1 response
Notice that Kong response headers, such as via and x-kong-proxy-latency, were inserted in the response.
Case 2: Single Service, Multiple Routes
Now we move on to a more complex use-case, where requests to separate gRPC methods map to different Routes in Kong, allowing for more flexible use of Kong plugins.
Building on top of the previous example, let’s create a few more routes, for individual gRPC methods. The gRPC "HelloService" service being used in this example exposes a few different methods, as we can see in its Protobuf definition (obtained from the gRPCbin repository):
Resolved method descriptor:rpc LotsOfReplies ( .hello.HelloRequest ) returns ( stream .hello.HelloResponse );
Request metadata to send:kong-debug:1Response headers received:content-type: application/grpc
date: Tue,30 Jul 201922:21:40 GMT
kong-route-id: 133659bb-7e88-4ac5-b177-bc04b3974c87
kong-service-id: 31a87674-f984-4f75-8abc-85da478e204f
kong-service-name: grpc
server: openresty/1.15.8.1via: kong/1.2.1x-kong-proxy-latency:14x-kong-upstream-latency:0Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response contents:{"reply":"hello Kong 1.3!"}Response trailers received:(empty)
Sent 1 request and received 10 responses
Notice that the kong-route-id response header now carries a different value and refers to the second Route created in this page.
Note: gRPC reflection requests will still be routed to the first route we created (the "catch-all" route), since the request matches neither SayHello nor LotsOfReplies routes.
Logging and Observability Plugins
As we mentioned earlier, Kong 1.3 gRPC support is compatible with logging and observability plugins. For example, let’s try out the File Log and Zipkin plugins with gRPC.
File Log
Issue the following request to enable File Log on the "SayHello" route:
As requests are proxied, new spans will be sent to the Zipkin server and can be visualized through the Zipkin Index page, which is, by default, http://localhost:9411/zipkin:
To display Traces, click "Find Traces", as shown above. The following screen will list all traces matching the search criteria:
A trace can be expanded by clicking into it:
Spans can also be extended, as displayed below:
Notice that, in this case, it’s a span for a gRPC reflection request.
What’s Next for gRPC support?
Future Kong releases will include support for natively handling Protobuf data, allowing gRPC compatibility with more plugins, such as request/response transformer.
Have questions or want to stay in touch with the Kong community? Join us wherever you hang out:
Viktor Gamov also contributed to this post.
In recent decades it's become common for communication between backend services to employ HTTP APIs with JSON payloads. Many HTTP APIs adhere (or at least aspire) to REST Principles, though many fall into
A developer portal is a storefront to your APIs (the products) that internal and external developers are trying to consume. The Kong Developer Portal provides a single source of truth for all developers to locate, access and consume services. With
Sven Walther
Modernizing Integration & API Management with Kong and PolyAPI
The goal of Integration Platform as a Service (iPaaS) is to simplify how companies connect their applications and data. The promise for the first wave of iPaaS platforms like Mulesoft and Boomi was straightforward: a central platform where APIs, sys
Gus Nemechek
Insights from eBay: How API Ecosystems Are Ushering In the Agentic Era
APIs have quietly powered the global shift to an interconnected economy. They’ve served as the data exchange highways behind the seamless experiences we now take for granted — booking a ride, paying a vendor, sending a message, syncing financial rec
Most APIs today are accessed over the ubiquitous HTTP protocol and the framework to create these APIs is known as REpresentational State Transfer (REST). These APIs are known as RESTful APIs . However, if you've been working in API development over
Kong is proud to announce our first-ever Long Term Support (LTS) version of Kong Enterprise. Kong Enterprise 2.8 LTS will be supported up to March 25, 2025. LTS is an industry term for a software release that is supported for a longer period of ti
We’re happy to announce the general availability of Kong Enterprise 3.2. In this release, we've taken significant steps to ensure the smooth and reliable operation of our API management solution. In Kong Enterprise 3.2, we've delivered key functio
Tom Brightbill
Ready to see Kong in action?
Get a personalized walkthrough of Kong's platform tailored to your architecture, use cases, and scale requirements.