Share this
gRPC - A Contract-First Alternative That's Already Here
by Jason Walker on 22 January 2026
For nearly two decades, “REST” has often been used as shorthand for HTTP endpoints that return JSON. Ideas originating in Roy Fielding’s architectural work have gradually been conflated with a broader set of API design practices, until REST has come to mean little more than resource-shaped JSON exchanged over HTTP.

The limitations of this interpretation are well documented, and there is no need to re-litigate the critiques raised by Fielding, Fowler and many others. Nor should the value these approaches have delivered be dismissed — they have shaped the modern web, enabled interoperability at scale, and remain enormously influential. For many teams, they are a pragmatic and productive default.
Nonetheless, complexity and misunderstanding mean that most implementations fall well short of being truly RESTful.
But it is worth asking a different question.
What if we had a type-safe, language-agnostic, contract-first protocol for remote communication over HTTP — one designed explicitly around schema evolution, strong tooling, and long-lived compatibility?
That alternative already exists.
Enter gRPC
gRPC is a modern, open-source, high-performance Remote Procedure Call (RPC) framework built on HTTP/2. Services are defined once in a .proto file using Protocol Buffers (protobuf), and tooling generates strongly typed client and server code for many languages.
In .NET, gRPC is deeply integrated with ASP.NET Core (DI, logging, authentication/authorisation, health checks, etc.), which makes it a practical option for internal service-to-service APIs.
A Small Contract, Generated Everywhere
A minimal protobuf service definition might look like this:
syntax = "proto3";
package hello.v1;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
And the corresponding server implementation in ASP.NET Core looks like this:
public sealed class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
=> Task.FromResult(new HelloReply { Message = $"Hello {request.Name}" });
}
No controller boilerplate, no hand-written client libraries, and far fewer "did we serialise this the same way?" surprises. You start from a schema, generate code, and let the compiler enforce the contract.
Typed Interfaces and Interoperability (With Real Versioning Rules)
Protobuf gives you a language-neutral schema and a compact wire format. That doesn't mean "anything goes" - it comes with clear compatibility rules. Teams that treat .proto files as stable contracts (and follow protobuf best practices for evolution) tend to see more consistent interoperability than teams relying on loosely versioned JSON conventions.
Performance and Streaming - Where gRPC Shines
gRPC uses:
- HTTP/2 (multiplexing, header compression, long-lived connections).
- Binary protobuf payloads (compact and fast to parse compared to many JSON workloads).
In practice, this often results in lower latency and higher throughput for service-to-service calls, especially for "chatty" internal APIs. Microsoft's guidance is clear that gRPC has strengths here - but also that it is not a universal replacement for HTTP/JSON APIs.
Streaming is a first-class feature in gRPC (server streaming, client streaming, and bidirectional streaming). This is a natural fit when you want long-lived, push-based communication patterns. It's worth noting that you can achieve streaming behaviours with HTTP in other ways (for example, Server-Sent Events or WebSockets), but gRPC makes it part of the core contract model.
The AI Connection (Without the Hype)
Modern AI systems often need:
- Token-by-token streaming responses.
- Incremental updates (progress, partial results, telemetry).
- Long-running or interactive workflows between services.
Many teams already do this over HTTP streaming, but gRPC's structured streaming can be a strong fit for internal AI platforms and agent systems where you control both ends of the connection and want a typed contract.
Beyond RPC - Protobuf as a Shared Contract Language
Protobuf isn't married to gRPC. It can also serve as a contract format for events and messages (for example, in Kafka ecosystems via schema registries), helping teams standardise payloads across request/response and event-driven workflows.
That said, adopting protobuf as a "canonical wire format" is a deliberate architectural choice. It can reduce inconsistency, but it also commits you to tooling, schema governance, and compatibility discipline.
Tooling and Testing - It's No Longer a Weak Spot
One of HTTP/JSON's enduring strengths is the tooling ecosystem. gRPC's binary payloads can feel less approachable at first - but the tooling is now very good.
Practical options include:
- grpcurl - command-line interaction with gRPC services.
- grpcui - a browser-based UI built on top of grpcurl.
- Postman - includes a gRPC client interface.
- Insomnia - supports gRPC requests.
- Kreya - a desktop client for gRPC/REST/WebSockets (local-first workflows).
Cake and Eat It
gRPC does provide a REST/JSON fallback mechanism via HTTP transcoding, allowing a single gRPC service definition to be exposed simultaneously as conventional HTTP endpoints. In theory, this offers an appealing bridge: a strongly typed, contract-first internal interface with a familiar REST-shaped façade for external consumers. In practice, however, this fallback is rarely a compelling way to arrive at REST. The generated HTTP surface is constrained by the gRPC contract, tends toward RPC semantics rather than resource-oriented design, and often feels awkward when forced into REST conventions it was never designed to honour. That said, in specific situations — particularly where an organisation wants to preserve gRPC as the primary system of record while offering limited interoperability, tooling compatibility, or gradual migration paths — transcoding can be a pragmatic compromise. It is less a replacement for thoughtfully designed REST APIs, and more a tactical concession: not a best-of-both-worlds solution, but occasionally a useful way to keep both worlds in play.
Why It Matters
In practice, many ‘REST APIs’ function less as protocols and more as tightly coupled JSON contracts, with the operational and versioning risks that implies.
gRPC isn't "the new REST". It's a strong, mature option for a specific set of problems:
- Internal service-to-service APIs.
- Polyglot environments where code generation pays off.
- Low-latency, high-throughput communication.
- Streaming-first workflows.
In ASP.NET Core, getting started really is simple:
app.MapGrpcService<MyService>();
You still need to make real engineering decisions around authentication, authorisation, retries/timeouts, observability, schema evolution, and operational compatibility (for example, browser access and certain proxies/load balancers).
Adopt it where it fits - and it can remove a surprising amount of accidental complexity from distributed systems. Denying the ubiquity of REST would be foolish, but the value of gRPC is incredibly accessible.
- Microsoft Learn: Overview for gRPC on .NET
- Microsoft Learn: Compare gRPC services with HTTP APIs
- Microsoft Learn: Test gRPC services with grpcurl and grpcui
- Microsoft Learn: gRPC on .NET supported platforms (including gRPC-Web)
- Microsoft Learn: gRPC-Web in ASP.NET Core gRPC apps
- CNCF: gRPC project page
- gRPC: grpc.io
- Protocol Buffers: proto3 language guide
- Protocol Buffers: best practices - dos and don'ts
- Confluent: Protobuf serializer/deserializer for Schema Registry
- Buf: Why a Protobuf schema registry?
- Postman: gRPC client overview
- Kong/Insomnia: gRPC requests in Insomnia
- Kreya: Kreya project
- Roy Fielding: REST APIs must be hypertext-driven (2008)
- Martin Fowler Richardson Maturity Model
- Stefan Tilkov REST Anti-Patterns
Share this
- Agile Development (84)
- Software Development (66)
- Scrum (39)
- Business Analysis (28)
- Agile (27)
- Application Lifecycle Management (26)
- Capability Development (20)
- Requirements (20)
- Solution Architecture (19)
- Lean Software Development (17)
- Digital Disruption (16)
- IT Project (15)
- Project Management (15)
- Coaching (14)
- DevOps (14)
- Equinox IT News (12)
- IT Professional (11)
- Knowledge Sharing (10)
- Strategic Planning (10)
- Agile Transformation (9)
- Digital Transformation (9)
- IT Governance (9)
- International Leaders (9)
- People (9)
- IT Consulting (8)
- AI (7)
- Cloud (7)
- MIT Sloan CISR (7)
- ✨ (7)
- Change Management (6)
- Azure DevOps (5)
- Innovation (5)
- Working from Home (5)
- Business Architecture (4)
- Continuous Integration (4)
- Enterprise Analysis (4)
- FinOps (4)
- Client Briefing Events (3)
- Cloud Value Optimisation (3)
- GitHub (3)
- IT Services (3)
- .Net Core (2)
- Business Rules (2)
- Data Visualisation (2)
- Java Development (2)
- Security (2)
- System Performance (2)
- API (1)
- Automation (1)
- Communities of Practice (1)
- Kanban (1)
- Lean Startup (1)
- Microsoft Azure (1)
- Satir Change Model (1)
- Testing (1)
- January 2026 (1)
- November 2025 (1)
- August 2025 (3)
- July 2025 (3)
- March 2025 (1)
- December 2024 (1)
- August 2024 (1)
- February 2024 (3)
- January 2024 (1)
- September 2023 (2)
- July 2023 (3)
- August 2022 (4)
- July 2021 (1)
- March 2021 (1)
- February 2021 (1)
- November 2020 (2)
- July 2020 (1)
- June 2020 (2)
- May 2020 (2)
- March 2020 (3)
- August 2019 (1)
- July 2019 (2)
- June 2019 (1)
- April 2019 (2)
- October 2018 (1)
- August 2018 (1)
- July 2018 (1)
- April 2018 (2)
- January 2018 (1)
- September 2017 (1)
- July 2017 (1)
- February 2017 (1)
- January 2017 (1)
- October 2016 (2)
- September 2016 (1)
- August 2016 (4)
- July 2016 (3)
- June 2016 (3)
- May 2016 (4)
- April 2016 (5)
- March 2016 (1)
- February 2016 (1)
- January 2016 (1)
- December 2015 (5)
- November 2015 (11)
- October 2015 (3)
- September 2015 (1)
- August 2015 (1)
- July 2015 (7)
- June 2015 (7)
- April 2015 (1)
- March 2015 (2)
- February 2015 (2)
- December 2014 (3)
- September 2014 (2)
- July 2014 (1)
- June 2014 (2)
- May 2014 (8)
- April 2014 (1)
- March 2014 (2)
- February 2014 (2)
- November 2013 (1)
- October 2013 (2)
- September 2013 (2)
- August 2013 (2)
- May 2013 (1)
- April 2013 (3)
- March 2013 (2)
- February 2013 (1)
- January 2013 (1)
- November 2012 (1)
- October 2012 (1)
- September 2012 (1)
- July 2012 (2)
- June 2012 (1)
- May 2012 (1)
- November 2011 (2)
- August 2011 (2)
- July 2011 (3)
- June 2011 (4)
- April 2011 (2)
- February 2011 (1)
- January 2011 (2)
- December 2010 (1)
- November 2010 (1)
- October 2010 (1)
- February 2010 (1)
- July 2009 (1)
- October 2008 (1)