Go | TypeScript
TypeScript/NodeでのModular Monolith及びサービス間通信のサンプル実装です。
サービス間の通信はgRPC経由としていますが、ServiceServerとServiceClientをServiceAdapterが仲介することにより、ネットワーク接続がない状態でgRPCを使ったサービス間通信を実現しています。
ServiceAdapterの実装: src/grpc/service_adapter.ts
現時点ではGoでの実装と比較して実装が不完全ですが、今後改善を予定しています。
- Docker
- Docker Compose
- GNU Make
$ make up
$ make down
$ make buf-generate
Reflection Serviceをサポートしていないため、protoファイルを指定してリクエストを送る必要があります。 See connectrpc/connect-es#507
$ grpcurl -import-path api/proto -proto example/article/v1/article.proto -plaintext localhost:8080 example.article.v1.ArticleService/ListArticle
curlからリクエストを送る場合は src/infrastructure/http/server.ts
のコメントを参考にしてHTTP/2を無効化してください。
$ curl -X POST -H "Content-Type: application/json" -d '{}' http://localhost:8080/example.article.v1.ArticleService/ListArticle
$ curl 'http://localhost:8080/example.article.v1.ArticleService/ListArticle?encoding=json&message=\{\}'
このサンプルではモジュラモノリスアーキテクチャを採用しています。
以下の2つサービスで構成されています。
ArticleServiceは、記事の管理と提供を行うサービスです。
公開API
- ListArticle: 自サービスが管理する記事のリストを返却します。
UserServiceは、ユーザの管理と情報提供を行うサービスです。
内部API
- GetUser: ユーザIDを受け取り、対応するユーザ情報を返却します。
graph TD;
ListArticle --> GetUser
subgraph ArticleService
ListArticle
end
subgraph UserService
GetUser
end
- アプリケーション自体のエラーハンドリングが出来ていない
- gRPCのReflectionサービスがサポートされていない
- grpcurlでリクエストを送るためにはprotoファイルを指定する必要があり面倒
- Connect側で未サポート connectrpc/connect-es#507
- gRPC (Connect互換ではない方)とConnectの両対応
- 内部のサービス間通信にはConnectではなくgRPCを使いたい
- HTTP1とHTTP2の両対応
- curl (
--http2
つけてもだめ)とgrpcurlの両方でリクエストを送れるようにしたい
- curl (
.
├── api
│ └── proto
│ └── example // gRPCのプロトコル定義
├── docker // Docker関連ファイル
└── src
├── entrypoint.ts // エントリーポイント
├── component // モジュラモノリスの各サービス
│ ├── article // 記事サービス
│ │ ├── domain // ドメイン層
│ │ │ ├── model // モデル
│ │ │ └── repository // リポジトリインターフェース
│ │ ├── infrastructure // インフラストラクチャ層
│ │ │ └── inmemory // インメモリリポジトリ
│ │ ├── interface // インターフェース層
│ │ │ └── grpc // gRPCサーバー
│ │ └── usecase // ユースケース層
│ └── user // ユーザサービス
├── config // 設定
├── grpc
│ └── example // 自動生成されたgRPCコード
└── infrastructure
└── http // HTTPサーバー