イントロダクション


Goaとは何か

Goa はマイクロサービスを作成するための Go フレームワークで、信頼できる唯一の情報源 (Single Source of Truth) を提供することによって、サーバーコード、クライアントコード、ならびにドキュメントを生成することによってベストプラクティスを促進します。 Goa によって生成されたコードは、トランスポート、エンドポイント、およびビジネスロジックレイヤーに対して構成可能なモジュールとして生成された、クリーンアーキテクチャパターンに従います。 Goa のパッケージには、ミドルウェアやプラグイン、生成されたコードと連携して効率的な方法で完全なマイクロサービスを実装することができるその他の補足機能が含まれています。 マイクロサービス開発に Goa を使用すると、 Goa は HTTP ベースのサービス用の OpenAPI 仕様と gRPC ベースのサービス用の gRPC プロトコルバッファファイル(または両方のトランスポートをサポートしている場合はその両方)を生成するので、実装者はドキュメントが同期しなくなることを心配する必要はありません。 また、レビュアーやコンシューマーは、同じソースから生成されたコードとしてのドキュメントに実装が従うため安心できます。

関心事の分離

Goa v2 の DSL はトランスポートにとらわれない方法でサービスを記述することを可能にしています。 サービスメソッドの DSL はそれぞれメソッドの入力および出力のタイプを記述します。 トランスポート固有の DSL は、入力データから入力メソッドがどのように構築され、出力がどのようにシリアライズされるかを記述します。 たとえば、メソッドが2つのフィールドで構成されるオブジェクトを入力として受けとるように指定した場合、HTTP 固有の DSL は属性の1つがリクエストヘッダーから読み取られ、その他がリクエストボディから読み取られるように指定できます。

この明確な分離は、同じサービス実装が HTTP や gRPC などの複数のトランスポートを介してアクセス可能なエンドポイントを公開できることを意味しています。 Goa は、エンコード、デコード、バリデーションを含むすべてのトランスポート固有のコードを生成します。 ユーザーコードは、実際のサービスメソッドの実装にのみ焦点を合わせる必要があります。

基本のデータ型

基本型としては、Int, Int32, Int64, UInt UInt32, UInt64, Float32, Float64, Bytes があります。 これにより gRPC などのトランスポートをサポートすることが可能になりますが、HTTP インターフェースの定義は JSON が許すものよりも明瞭になります。

構成可能なコード生成

コード生成は2段階のプロセスに従います。最初のフェーズでは、最終的な生成物を作り出す最後のフェーズを実行する前に、さらに修正可能なテンプレートを公開するライターが作成されます。 これにより、プラグインが組み込みコードジェネレータによって生成されたコードを変更することが可能になります。

Goa v2 は v1 とどう違う?

  • Goa v2 は コンポーザブル(構成可能) です。 パッケージやコード生成アルゴリズム、生成されるコードは、すべてよりモジュール化されており、Goa v1 よりも仮定が少なくなっています。
  • Goa v2 によって設計されたマイクロサービスは トランスポートにとらわれません。 実際のサービス実装からトランスポート層を分離することは、同じサービスが HTTP や gRPC などの複数のトランスポートを介してアクセス可能なエンドポイントを公開できることを意味します。 Goa v2 は、エンコード、デコード、およびリクエストとレスポンスのバリデーションを含む、トランスポート固有のすべてのコードを生成します。 Goa v1 は HTTP トランスポートのみです。
  • 生成されたコードは、実際のサービスの実装がトランスポートコードから分離されている 徹底した関心事の分離 に従います。 ユーザーコードのみ、実際のサービスメソッドの実装に焦点を合わせる必要があります。
  • Goa v2 の生成する 大部分をGoの標準ライブラリの型に依存したコードは、外部コードとのインターフェースをより簡単にします。
  • goa-kit プラグインが、Goa デザインから go-kit マイクロサービスを生成することを可能にします。