My jsme naskočili později, takže přechod z v2 na v3 nás netrápí, zde neumím pomoci.
Každopádně možnost klasického JSON API na základě proto definice řešíme. Dokonce Protobuf používáme jako IDL na eventy a podobně.
V Go je nutnost používat google.golang.org/protobuf/encoding/protojson, to je občas na obtíž, pokud se tam připlete ne-proto objekt, který nesplňuje interface.
Souhlas, ze gRPC gateway je dost podivná. Každopádně nedávno jsem narazil na alternativní implementaci gRPC specifikace.
Je to od těch samých lidí, co udělali `buf` cli.
Vyklepu sem nějaké ty linky.
https://buf.build/blog/connect-a-better-grpc
https://connect.build/
https://github.com/bufbuild/connect-go
https://github.com/bufbuild/connect-web
A tady je hezká ukázka toho, jak gRPC funguje. Že to není žádná magie.
https://github.com/akshayjshah/grpc-demystified
s grpc a pb robim roky, len ako som pisal, problem je prave s jsonom. prvy problem bol medzi pb2 a pb3 kedy pb2 malo povinne a volitelne polia, pb3 uz to nema, co je dobre, ale zase berie prazdne pole a null ako rovnaku hodnotu, takze nemozno zistit, ci uzivatel neposlal ziadnu zmenu alebo chcel vyprazdnit pole. Na to zaviedli debilne field_mask.
Dalsi problem bol ze golang mal nativnu kniznicu pre pb, lenze ta nebola kompatibilna s google kniznicou, ktora sa stala casom popularnejsia a de facto ta nativna je deprecated. Okrem nekompatibility je tam problem s tym, ze ta nativna ma "emit defaults" switch kedy vide odoslat prazdne pole namiesto null, presny opak problemu na vstupe.
Treti problem je ze proto json vie naparsovat int64 a uint64 spravne. Cize json string naparsuje na datovy typ u/int64 a naopak.
No a moj problem bol ze som si presiel vsetkymi tymito stadiami a neustale riesil problemy jeden za druhym. Co sa grpc gateway tyka, to bolo v pohode, len mi vadilo na tom ze princip bol taky ze json -> unmarshal na pb objekt -> marshal na pb -> brana -> unmarshal na proto objekt. Takze to v principe bolo neefektivne dost, ale funkcne.
Casom som to opustil, tak ako postupne vsetko. No a dnes uz som sa rozhodol pb dat doprec kompletne lebo grpc nepouzivam a pb mi robi viac skody nez uzitku. Hlavne tie bloatnute structy co to generuje, plne pointerov, wrapperov, mutexov a gzip definicii v globalnych premennych a podobne.
Takze idem do cisteho go kodu. Nemam nutnost riesit kompatibilitu s inymi jazykmi, takze proto schema mi chybat nebude zas moc. Nativny json, resp. pouzivam goccy teraz, vie spravne riesit omitempty a null vs prazdne pole/mapa... a tiez vdaka tomu triku hore aj u/int64 parsovanie.
Jedine o co som teraz prisiel je ze v proto som mal definovane aj sluzby a rpc ale na druhu stranu mam jeden http handler so switchom kde su definovane cesty(nepouzivam muxer) takze je to stale na jednom mieste.
Spravy asi presuniem do suborov s handlermi nech je to pokope a nie v jednom centralizovanom subore. Musim si akurat zvyknut po rokoch na novy postup. To je cele. Preto som sa pytal ako ludia riesia architekturu apiciek.