gRPC和GraphQL
首先
由于不知道如何正确使用gRPC和GraphQL,导致我很困惑,所以我进行了简单的整理。
这两者有什么不同?
GraphQL是用于API的查询语言,通过指定所需的数据,可以避免不必要的通信。另一方面,gRPC使用协议缓冲区实现了RPC(将在客户端上调用服务器上的方法)。
两者的目的都是向服务器发送请求并接收响应。但是,gRPC没有像GraphQL那样灵活的查询(函数调用)。它通过调用RPC函数来获取结果,但结果的形式是固定的。
另外,正如Medium的文章所提到的,gRPC更适合底层,而GraphQL更适合高层。因此,在构建Web应用程序时,可以使用GraphQL作为前端访问的API,而使用gRPC实现该API与其他API的通信。
顺便提一下,实际上有一种名为web-grpc的技术,可以让前端也能够使用gRPC。这方面有什么最佳实践呢?
补充
gRPC即为gRPC
gRPC是由Google开发的RPC(远程过程调用)库,使用称为Protocol Buffer的序列化方式来处理RPC。
Protocol Buffer也是由Google开发的。
RPC是一种机制,使得客户端可以像服务器端代码一样,从客户端调用它。
GraphQL-请以本地汉语进行释义
这是一个用于API的查询语言。它具有以下三个特点。
-
- 必要なものを必要な分だけ
-
- 例えばJSONを返すようなRESTだと、返ってくるデータにはクライアント側では不要なものも含まれており、
-
- 無駄な通信帯域を消費していた。GraphQLでは、クエリを用いて必要なデータのみを取ってくることができる。
-
- 例えば以下のように特定の人の情報を返すようなREST APIがあったとする。
-
- もし仮にクライアント側ではid, firstname, lastnameしか必要ないとしても、
-
- APIがそういう仕様なので受け取って必要ないものは捨てる。
-
- あるいは、REST APIの仕様を変えて特定の条件下ではid, firstname, lastnameしか返さないようにする。
- 要はREST APIは柔軟性にかける。
{
"person": {
"id": 2,
"age": 25,
"firstname": "dora",
"lastname": "emon"
"phonenumber": [
"080-xxx-yyyy",
"090-zzz-xxxx"
]
}
}
在GraphQL中,可以通过查询轻松指定所需数据。
{
person {
id
firstname
lastname
}
}
-
- できるだけ多くのリソースを一回のリクエストで取得
-
- n + 1問題などのようにリクエスト回数をできるだけ減らすことができる。 例えば/users/${id}がユーザーIDが${id}のユーザー情報を返すとする。また、そのデータにははユーザーのフォロワーのID一覧がリストで含まれている。もしフォロワーの名前も取得するとなると、フォロワーの数(n)だけ/users/${id}にアクセスしないといけなくなり、通信のオーバーヘッドが大きくなってしまう。もちろん/users/${id}で返されるデータにフォロワーの詳細情報も含めることができる。クライアントが必要としない(しなくなるかもしれない)無駄な情報とともに。
- 1つのエンドポイントでAPIを提供
请参考以下网站
-
- gRPC公式サイト
-
- GraphQL公式サイト
GraphQL & gRPC (Part 1): Mediumの記事