复习《微服务模式》第八章的API网关

第八章 外部API模式

    • 外部APIを公開する際の問題点

 

    • APIゲートウェイパターン

 

    • BFFパターン

 

    GraphQL

有一些类似的东西被介绍了。

在发布外部API时的问题

如果将每个服务的API作为外部API公开,可能会遇到以下问题

    • マイクロサービスアーキテクチャだとサービスの粒度が細かいので、結果的にAPIの粒度も外部APIとしては細かくなりすぎる。

Order情報を取得するのにも、数回のAPIを呼ばないといけない

サービスの粒度や、内部APIを変えられなくなる
内部APIはそもそもhttpを喋れないかもしれない
クライアントの種類によっては、APIの要件が変わってくる

それを各マイクロサービスが吸収するのか?

因此,由于直接公开内部API并无太多好处,我们决定在前端搭建一个API网关。

API网关模式

成为基于微服务的应用程序的入口点的服务。

进行下列活动

    • リクエストのルーティング

httpを転送すればいいだけの場合

API合成

粒度の細かいバックエンドAPIの結果を集約して、クライアントに使いやすい形にして返す

プロトコル変換

バックエンドがメッセージングなどhttp以外のAPIを持つ場合は、外部に対してhttpベースのAPIを公開する

エッジ機能

認証、認可、流量制御、キャッシング、メトリクス収集、リクエストロギング
11章では上記のうち、認可に関してはパスベースの簡単なものならいいが、それ以上のものはサービスの詳細に深く関わるので、各サービスで実装して方がいいとしている

总的来说,虽然有一个需要进行维护的服务器增加的缺点,但可以说是优点超过了缺点。

最好的朋友模式

    • BFF(Backend for Frontend)パターン

 

    • 一口に外部APIといっても、クライアントの種類(Webであったり、モバイルであったり)によって、API要件が違う場合がある

 

    • 要件が大きく違うのであれば、いっそクライアントの種類ごとにAPIゲートウェイを別立てにして、クライアント開発チームが、自身向けのAPIゲートウェイの開発と運用をするというのがBFFパターン

 

    • アプリロジックの役割分担という観点から言えば合理的

 

    • 一方で、要求されるテクノロジーやスキルが大きく違うので実際はそれほどうまくはいかないと思う

特に運用の部分は11章で説明されている横断的関心事を一通りこなさないと行けないので、クライアントチームがサーバーの運用に深く関わるのはあまりよろしくないと思う

API网关的需求

    • リクエストルーティング

 

    • API合成

 

    • エッジ機能

 

    プロトコル変換

在第七章的CQRS模式中,不仅需要基于路径的路由,而且还需要基于方法的路由才能实现(需要根据GET和其他方法来改变目标传送位置)。

预设的API网关

    • 以下が挙げられている

AWS API Gateway
AWS ロードバランサ
kong
Traefik

どれも先に上げた要件をすべて満たすわけではない
特にAPI合成は、個別に実装が必要なので、できあいのもので実現するのは難しい

建立API网关

    • 作者のおすすめフレームワークはSpring Cloud Gateway

 

    • メソッドベースのルーティングも含めて、先に上げた要件は一通り満たせるらしい

 

    • ただしhttpリクエストを、kafkaベースのメッセージングにプロトコル変換しながらルーティングできるのかは本文からは分からなかった

 

    実装も典型的なSpring風のものなので、経験者にはとっつきやすそう

用GraphQL实现API网关

    • API GatewayをGraph QLで実現する話

 

    • クライアント側でqueryの内容を変えられるので、graph qlのエンドポイントを一つ作るだけで様々な用途に対応できる

 

    • rest apiだと、多少はパラメータ化できるものの、普通はいくつものapiをつくることになる

 

    GraphQL スキーマ
type Query {
  orders(consumerId : Int): [Order]
  order(orderId : Int): Order
  consumer(consumerId : Int): Consumer
}


type Order {
  orderId: ID,
  consumerId : Int,
  consumer: Consumer
  restaurant: Restaurant
  deliveryInfo : DeliveryInfo
  ...
}
    • エンドポイントのところでtype Queryで定義されたクエリーを投げられる

 

    • エンドポイントがリクエストを受けたあとは、バックエンドのマイクロサービス群に、必要なクエリーを発行して、情報をあつめてレスポンスを返す

 

    • この例では、Order、Consumer、Restaurant、DeliveryInfoはそれぞれ別のマイクロサービスが担当している

 

    node.jsのApollo GraphQLというExpress上で動かせるフレームワークでの実装例が書いてある
广告
将在 10 秒后关闭
bannerAds