关于gRPC和GraphQL在微服务中的用法以及BFF技术选择的问题
gRPC和GraphQL
我以前就对gRPC这个词有所了解,只是认为它是一种新的Rest API,但并不太清楚。
作为一个工程师,
我认为在被使用过一次之后需要调查相关事项,
我看了Mercari的文章,稍微理解了一点,所以我写了这篇文章。
虽然下面的解释比较简略,但请多多关照。
首先,gRPC通常用于微服务之间的通信,
而GraphQL经常用于前端和后端之间的通信。
GraphQL是由Facebook开发的一种新的API通信规范。简单来说,它可以通过发送查询来只获取所需的数据,从而减少通信负荷。
关于在微服务中使用gRPC和GraphQL的方式,
最前端后台 (Front-end Backend)
最近似乎越来越常见以这种设计方式制作。
BFF采用企业
美丽加和佐佐某以及安卓平板等公司已被使用。
BFF在前端和后端(每个微服务)之间进行中转。
这是类似于路由的东西。
为了改善被认为很慢的微服务的速度,在那个时候,需要采取措施。
前台和BFF之间的通信是通过GraphQL进行的,而BFF与后端(使用微服务构建的)之间的通信则是通过gRPC进行的,这样可以保持速度不受影响。

关于BFF技术选择
然而,BFF需要通过GraphQL与前端进行通信,并需要与后端进行gRPC交互,
因此BFF似乎需要同时使用GraphQL和gRPC。
因此,BFF通常使用Node.js框架NestJS。

抽取一篇文章部分
──効率性と将来性を考えてGraphQLを採用されたのですね。
末田:ライブラリについても言及すると、BFFの実装にはNestJSのGraphQLのモジュールを使用しています。
コードを書いてデコレーターでスキーマ情報を定義し、自動的にスキーマを書き出すコードベースの方式を採用しています。
全体としては、BFFサーバーの中でgRPCクライアントを生成し、そこから各マイクロサービスにリクエストして、各フィールドに必要な情報を取得しています。
──なるほど。技術選定の際、NestJS以外の候補はありましたか?
名村:マイクロサービスに対するアクセスとGraphQLのインターフェースを両方カバーしているフレームワークは、NestJS以外にあまりないんですよ。
また、NestJSはJavaのようなDependency Injection(DI)の考えがあるので、DIの仕組みに乗っかっていれば、
マイクロサービスが肥大化してもコード量をたくさん増やさなくてもいい。必要なサービスをGraphQLのリゾルバーで呼び出すことができると思ったので、NestJSを採用しました。
使用する上での制約もありますが、DIのレイヤーで依存関係を構築できたので、NestJSを採用して良かったと思っています。