1. Protobufs importing each other becomes effortless. You don't need to download multiple repositories, if you have the proto repo, you have all the dependencies.
2. Decoupling "ownership" allows for a bit more freedom when creating proto files that describe shared data structures.
3. You get a singular location to browse infra. It doesn't describe relationships of course, but it's handy to be able to see what services you have and what their API looks like.
Disclaimer: I don't use gRPC, but I do use Protobufs & an RPC, Twirp.
It's probably best to separate the proto file for server and client and treat it as a dependency.
If you're using a mono-repo the solution is possibly a little simpler.
We keep them all in one repo.
Right now the entire API is a monorepo so it’s easy. But I plan to split it up soon...
All the protos in one repo. Ideally public so Segment users can use it as a reference too!
Then all the generated Go clients, servers, mocks, typescript, swagger, etc in another repo. This is what programs can import.
Then we can build gRPC services in their own repos if we want to. And it’s easy to produce and consume messages for all the other services.