gRPC was a mistake
Ever since this morning, I have been bothered by the thought: gRPC added nothing but endless overhead to our product. Using it was an absolute mistake.
The greatest pitfall comes from the fact that the generated libraries are almost always useless directly, so you would need to define two different mappers, one from the Protocol Buffer-generated struct and one to Protocol Buffer-generated struct, manually. That mapping also takes away any performance, or ergonomic benefits gRPC may have had.
If you need streaming, gRPC is very good. But I would only use it in those specific circumstances, and every other endpoint would be JSON and HTTP 1, and message brokers 2.
And the compiler is also weird, the tooling is unsatisfactory.
The promised language agnosticism doesn’t pay off in small teams, since the generated library is usually so massive that reading it would take more time than just messaging your colleagues and asking for the fields in the JSON request body. In retrospect, we had much less trouble with end-points that did not incorporate gRPC.