gRPCã®ä»çµã¿ â HTTP/2ãšProtocol Buffersã§å®çŸããé«ééä¿¡
gRPCã¯GoogleãéçºããRPCïŒRemote Procedure CallïŒãã¬ãŒã ã¯ãŒã¯ã ããæ®éã®REST APIãHTTPãªã¯ãšã¹ããéã£ãŠããã®URLã®ããŒã¿ãã ãããã£ãŠããã®ã«å¯ŸããŠãgRPCã¯ããã®é¢æ°ãå®è¡ããŠãã£ãŠçŽæ¥åŒã³åºãæèŠã§éä¿¡ã§ãããã ããããéä¿¡ã«HTTP/2ã䜿ãããããã¡ããã¡ãéããã ãã
HTTP/2ã䜿ããšäœãããã®ïŒ
HTTP/2ã«ã¯3ã€ã®å€§ããªç¹åŸŽããããããŸããå€éåïŒãã«ããã¬ãã·ã³ã°ïŒãã§ã1ã€ã®æ¥ç¶ã§è€æ°ã®ãªã¯ãšã¹ããåæã«éãããæ¬¡ã«ãããããŒå§çž®ãã§ãæ¯ååããããªããããŒãéãç¡é§ããªããªãããããŠããã€ããªãã¬ãŒãã³ã°ãã§ãããã¹ããããªããã€ããªã§ããŒã¿ãããåãããããåŠçãéããã ãREST APIã®HTTP/1.1ã ãš1ãªã¯ãšã¹ãããšã«é çªåŸ ã¡ãçºçãããã©ãgRPCã¯ããããªããã ãã
Protocol Buffersã£ãŠããã®ãé¢ä¿ãããã ããïŒ
ãããgRPCã®å¿èéšã ããProtocol BuffersïŒprotobufïŒã¯ãããŒã¿ã®åœ¢åŒãšéä¿¡ã®å®çŸ©ã .proto ãã¡ã€ã«ã«æžãIDLïŒã€ã³ã¿ãŒãã§ãŒã¹å®çŸ©èšèªïŒã ããããšãã°ããŠãŒã¶ãŒæ å ±ã«ã¯nameïŒæååïŒãšageïŒæ°å€ïŒãããããGetUserãšãã颿°ã¯UserIdãåãåã£ãŠUserãè¿ããã¿ããã«å®çŸ©ããããã® .proto ãã¡ã€ã«ããGoãPythonãJavaãTypeScriptãªã©åèšèªã®ã³ãŒããèªåçæã§ãããã ã
ã³ãŒããèªåçæããããªããã¯ã©ã€ã¢ã³ããšãµãŒããŒã§åããºã¬ãå¿é ããªããã ãïŒ
ãã®éãïŒREST APIã ãšJSONã®åœ¢åŒã¯ããã¥ã¡ã³ãã«æžããŠããã ãã§ãå®éã«éãããŠããããŒã¿ãæ£ãããã¯ã©ã³ã¿ã€ã ãŸã§åãããªããã§ãgRPCãªã .proto ãã¡ã€ã«ããå¥çŽæžãã«ãªã£ãŠãã³ã³ãã€ã«æã«åãã§ãã¯ãããããå®å šãªãã ããããprotobufã¯ãã€ããªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã ãããJSONããå§åçã«ããŒã¿ãµã€ãºãå°ãããŠé«éã ãã
gRPCã«ã¯4ã€ã®éä¿¡ãã¿ãŒã³ãããã£ãŠèãããã©ãã©ãããããšïŒ
ãã質åã ãããŸã1ã€ç®ããUnaryïŒåé ïŒãã§ã1ãªã¯ãšã¹ãã»1ã¬ã¹ãã³ã¹ã®æ®éã®ããåãã2ã€ç®ããServer Streamingãã§ãã¯ã©ã€ã¢ã³ãã1åãªã¯ãšã¹ããããšãµãŒããŒãããŒã¿ãé£ç¶ã§è¿ããŠãããæ ªäŸ¡ã®ãªã¢ã«ã¿ã€ã é ä¿¡ã¿ãããªã€ã¡ãŒãžã ãã3ã€ç®ããClient Streamingãã§ãã¯ã©ã€ã¢ã³ããããŒã¿ãé£ç¶éä¿¡ããŠãµãŒããŒããŸãšããŠ1åå¿çããããã¡ã€ã«ã¢ããããŒãã«äŸ¿å©ã ãã4ã€ç®ããBidirectional Streamingãã§ãåæ¹åã«åæã«ããŒã¿ãæµããããã£ããã¢ããªã¿ãããªçšéã«ãŽã£ããã ãã
åæ¹åã¹ããªãŒãã³ã°ã£ãŠWebSocketã¿ãããªãã®ãªã®ïŒ
䌌ãŠããã©ãã£ãšæŽç·ŽãããŠãããWebSocketã¯çã®ãã€ãã¹ããªãŒã ã ãããããŒã¿åœ¢åŒããšã©ãŒåŠçãå šéšèªåã§å®è£ ããªããšãããªããgRPCã®åæ¹åã¹ããªãŒãã³ã°ã¯protobufã§åä»ããããŠããããããŒå¶åŸ¡ããšã©ãŒãã³ããªã³ã°ããã¬ãŒã ã¯ãŒã¯ãé¢åãèŠãŠããããããšãgRPCã«ã¯ãChannelïŒãã£ãã«ïŒããšãStubïŒã¹ã¿ãïŒãã£ãŠããæŠå¿µããã£ãŠãChannelããµãŒããŒãžã®æ¥ç¶ã管çããStubããã®äžã§é¢æ°åŒã³åºããè¡ããã ãæ¥ç¶ã®åå©çšãããŒããã©ã³ã·ã³ã°ãChannelãèªåã§ãã£ãŠããããã
ããã«ãŠã§ã¢ã¿ããã«ãå ±éåŠçãæãããšãã§ããã®ïŒ
ã§ããããgRPCã§ã¯ãInterceptorïŒã€ã³ã¿ãŒã»ãã¿ãŒïŒãããã®åœ¹å²ãæãããã ãèªèšŒããŒã¯ã³ã®ä»äžããã°åºåãã¡ããªã¯ã¹åéããªãã©ã€åŠçãªãããInterceptorãšããŠå®è£ ããã°ããã¹ãŠã®RPCåŒã³åºãã«èªåã§é©çšã§ãããREST APIã®ããã«ãŠã§ã¢ãšåãçºæ³ã ãã©ãgRPCã ãšã¯ã©ã€ã¢ã³ãåŽã«ããµãŒããŒåŽã«ãInterceptorã眮ããã®ãç¹åŸŽã ãã
ããã䜿ãåãã倧äºã ããgRPCã¯ãã€ã¯ããµãŒãã¹éã®å éšéä¿¡ã«ã¯æåŒ·ã ãã©ã匱ç¹ãããããŸããã©ãŠã¶ããçŽæ¥åŒã¹ãªããHTTP/2ã®ãã¬ãŒãã³ã°ããã©ãŠã¶ã®JavaScriptããå¶åŸ¡ã§ããªãããããgRPC-Webã£ãŠãããããã·ãæãæ¹æ³ã¯ãããã©ãUnaryãšãµãŒããŒã¹ããªãŒãã³ã°ãããµããŒãããŠãªããããšãcurlããã©ãŠã¶ã§æè»œã«ãã¹ãã§ããªããã人éãèªããªããã€ããªéä¿¡ã ãããããã°ãã«ããé¢ãããã
ããããããšãã§ãgRPCã«ã¯ãŸã é¢çœãæ©èœããããããReflection APIãã䜿ããšããµãŒããŒãèªåã®æã£ãŠããµãŒãã¹å®çŸ©ãåçã«æããŠãããããã.protoãã¡ã€ã«ããªããŠãgrpcurlã¿ãããªããŒã«ã§å©ãããããšgRPCã«ã¯æšæºã®ãHealth Checking Protocolãããã£ãŠãKubernetesã®ãã«ã¹ãã§ãã¯ãšçµ±åãããããã ããã€ã¯ããµãŒãã¹ãæ¬çªéçšãããšãã«ãããå°å³ã«å¹ããŠãããã
ãã£ããèšããšããã€ã¯ããµãŒãã¹éã®é«ééä¿¡ãã¹ããªãŒãã³ã°ãå¿ èŠãªå Žé¢ãå€èšèªç°å¢ã§ã®åå®å šãªé£æºã«ã¯gRPCããã©ãŠã¶ããçŽæ¥å©ããããªãã¯APIããµãŒãããŒãã£åãã®ãªãŒãã³APIãã·ã³ãã«ãªCRUDæäœã«ã¯RESTãæè¿ã¯gRPCã§å éšéä¿¡ãã€ã€ãå€éšåãã«ã¯APIã²ãŒããŠã§ã€ã§RESTã«å€æãããgRPC Gatewayããã¿ãŒã³ã人æ°ã ããäž¡æ¹ã®è¯ããšãåããã§ãããã ã
ãŸãã«ãããçŸä»£ã®ãã¹ããã©ã¯ãã£ã¹ã®äžã€ã ããã¡ãªã¿ã«gRPCã®ãgãã¯Googleã®ãgãã ãã©ãããŒãžã§ã³ããšã«éãæå³ãä»ããããŠãŠã1.0ã¯ãgRPCãã1.1ã¯ãgoodãã1.2ã¯ãgreenãã£ãŠéã³å¿ããããã ãæè¡çã«åªããŠãã ããããªããŠããšã³ã·ã¹ãã ãå å®ããŠããããå€§èŠæš¡åæ£ã·ã¹ãã ãäœããªãäžåºŠã¯è§Šã£ãŠãããããã¬ãŒã ã¯ãŒã¯ã ãã