Skip to content

Ecosystem & Advanced

By now you can design a schema, define a service, implement it, stream, and secure it. This final module is about everything around that core — the reality that your gRPC service rarely lives alone.

Browsers can’t speak native gRPC. Some clients still want REST and JSON. Your API will outlive its first version. And a fleet of services needs to be observable and testable. Each of those is a solved problem with a well-worn tool, and this module walks through them.

LessonWhat you’ll learn
gRPC-WebWhy browsers need a proxy, the gRPC-Web protocol, and Connect
gRPC-Gateway & transcodingExposing a REST/JSON facade from the same .proto
Versioning & evolutionVersioned packages, additive vs breaking changes, buf breaking
Observability & testingReflection, tracing/metrics, and in-process testing

A production gRPC system usually looks less like “clients call one server” and more like a small ecosystem of translators and observers:

flowchart TB
  browser["browser
(gRPC-Web)"] --> proxy["proxy /
transcoder"]
  rest["REST client
(JSON)"] --> proxy
  proxy --> core["gRPC services
(v1, v2)"]
  svc["other gRPC
services"] --> core
  core --> obs["interceptors →
metrics · traces · logs"]
One gRPC core, many ways in and out

The .proto you wrote is still the single source of truth. Everything here — the web client, the REST gateway, the next API version, the tracing — hangs off that same contract.

Why does a production gRPC system usually need extra components around the core?
What stays the single source of truth across web clients, REST gateways, and versions?
How do gRPC services typically become observable?