SPN
SPN は Chip-in 内部で閉鎖されたプライベートなネットワークで、 mTLS 認証によって相互認証し、暗号化されます。 SPN Hub を中心として SPN エンドポイントから QUIC プロトコルで接続することで仮想的なネットワークを構築します。 QUIC上のストリームを TCP コネクションとして使用することで、TCP 通信と互換性を持っており、 SPN エージェントを使用することでマイクロサービス間でTCP通信を行えます。
上記はユーザが API Gateway にアクセスし、それがプロキシされて SPN 経由でロジックサービスにアクセスし、ロジックサービスが SPN 経由でDBMSにアクセスする様子を表しています。
SPN Hub
SPN Hub では SPN エンドポイントからの QUIC での接続を受け付けて、仮想的で閉じたネットワークを提供します。
SPN エンドポイント
SPN エンドポイントは QUIC で SPN Hub に接続するクライアントです。SPNエンドポイントは SPN create を使用して rust で開発することが可能です。 また、SPN エージェントを利用して、TCPのクライアント/サーバにも接続できます。
SPN セッション
SPN セッションは QUIC のコネクションと同義ですが、SPNのコネクションとの混同を避けるためにあえて、SPN セッションと呼びます。 この他に Chip-in では HTTP のセッションやコネクションも登場しますが、それらとも区別してください。
QUIC コネクション確立後、最初に SPN エンドポイントから SPN Hub に向かって制御ストリームを開始します。制御ストリームの最初の通信として SPN エンドポイントはSPN hub に SPN セッション確立要求を送信します。 SPN Hub は、セッション確立要求が SPN 内のサービス定義に照らし合わせて許容されていれば SPN エンドポイントにACKを返すとともに SPN セッションオブジェクトをメモリ上に作成します。 セッション確立後も制御ストリームは接続した状態となり、 さまざまな制御パケットの通信に使用されます。
SPN セッションオブジェクトには以下が保持されます。
項目名 | 説明 |
---|---|
startAt | セッション開始時刻 |
spnSessionId | セッションID(QUIC のサーバ側コネクションIDを使用する) |
spnEndPoint | QUICコネクションの確立に使用されたクライアント証明書の Subject の値 |
endPointType | "serviceProvider", "serviceConsumer" のいずれか |
serviceUrn | セッションのサービスのエンドポイントのURN |
totalConnectionCount | このセッション上で作成された SPNコネクションの総数 |
SPN セッションはセッションの開設時と終了時にログを出力します。ログの項目は以下の通り。
項目名 | 説明 |
---|---|
timestamp | イベント発生時刻(ログの出力時刻と異なる場合があるのでイベント発生時の時刻を記録する) |
spnSessionId | セッションID(QUIC のサーバ側コネクションIDを使用する) |
spnEndPoint | QUICコネクションの確立に使用されたクライアント証明書の Subject の値 |
eventType | "startSpnSession", "endSpnSession" のいずれか |
endPointType | "serviceProvider", "serviceConsumer" のいずれか |
serviceUrn | セッションのサービスのURN |
totalConnectionCount | このセッション上で作成された SPNコネクションの総数。endSpnSession のときのみ出力される |
elapsedTime | セッション開設時からの経過時間。endSpnSession のときのみ出力される |
terminateReason | セッションの終了理由。"shutdown", "terminatedByPeer", "error" のいずれか。endSpnSession のときのみ出力される |
SPN コネクション
SPN コネクションは QUIC のコネクションと異なり、serviceConsumer エンドポイントから SPN Hub を経由して serviceProvider エンドポイントに接続するストリームです。 SPN コネクションは以下の構成要素からなります。
- serviceConsumer エンドポイントと SPN Hub の間の双方向 QUIC ストリーム
- SPN Hub と serviceProvider エンドポイントの間の双方向 QUIC ストリーム
- SPN コネクション管理オブジェクト
SPNコネクションの確立は
- serviceConsumer エンドポイントは SPN Hub との間の双方向 QUIC ストリーム上に最初のパケットを送る
- SPN Hub は serviceProvider エンドポイントとの間の双方向 QUIC ストリーム上にそのパケットを転送する SPN コネクションオブジェクトには以下が保持されます。
項目名 | 説明 |
---|---|
startAt | コネクション開始時刻 |
spnConnectionId | SPNコネクションID(QUIC のストリームIDを serviceConsumer側、serviceProvider側の順に連結したものを使用する) |
consumerSideSpnSessionId | serviceConsumer側 SPN セッションのID |
providerSideSpnSessionId | serviceProvider側 SPN セッションのID |
totalSentBytes | このストリー ム上で serviceConsumerからserviceProviderに送信したデータの累計バイト数 |
totalReceiveBytes | このストリーム上で serviceConsumer がserviceProviderから受信したデータの累計バイト数 |
SPN セッションはセッションの開設時と終了時にログを出力します。ログの項目は以下の通り。
項目名 | 説明 |
---|---|
timestamp | イベント発生時刻(ログの出力時刻と異なる場合があるのでイベント発生時の時刻を記録する) |
spnConnectionId | SPNコネクションID(QUIC のストリームIDを serviceConsumer側、serviceProvider側の順に連結したものを使用する) |
eventType | "startSpnConnection", "endSpnConnection" のいずれか |
consumerSideSpnSessionId | serviceConsumer側 SPN セッションのID |
providerSideSpnSessionId | serviceProvider側 SPN セッションのID |
totalSentBytes | このストリーム上で serviceConsumerからserviceProviderに送信したデータの累計バイト数。 endSpnConnection のときのみ出力される |
totalReceiveBytes | このストリーム上で serviceConsumer がserviceProviderから受信したデータの累計バイト数。 endSpnConnection のときのみ出力される |
elapsedTime | コネクション開設時からの経過時間。 endSpnConnection のときのみ出力される |
disconnectReason | コネクションの切断理由。"closedByPeer", "closed", "error" のいずれか。 endSpnConnection のときのみ出力される |
spnhub コマンド
spnhub コマンドは SPN Hub を実装します。spnhub コマンドのパラメータはコマンドラインオプションと環境変数のいずれかで指定できます。 パラメータには以下のものがあります。
オプション | 環境変数名 | 説明 | デフォルト |
---|---|---|---|
-c | SPNHUB_INVENTORY_URL | SPN Hub の構成情報を提供するインベントリのURL。 | http://localhost:8080 |
spnhubコマンドは起動時とリロードシグナル受信時に構成情報をインベントリ から読み込みます。具体的には以下の順に読み込みます。リロードシグナルは SIGUSR1 です。
1. レルムの読み込み
全てのレルムを読み込みます。 SPN Hub はレルムごとに内部が分離されており、マルチテナントのシステムを容易に実装できます。