たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

第一章:古の魔法は死んだ。王の帰還だ。 ~WCFからgRPCへ、魂の継承儀式~

どうやら、一筋縄ではいかない砂の迷宮に迷い込んだらしい。この顛末を書き残しておくか。

かつて、.NET Framework(Microsoftの従来型開発フレームワーク)という大地で、我々はWCF(Windows Communication Foundation:.NET通信フレームワーク)という名の、万能にして偉大な魔法を操っていた。しかし、時代は流れ、.NET 6(Microsoftの最新開発フレームワーク)という新たな大地では、その古の魔法はもはや使えない。神々(Microsoft)は、その後継者として「gRPC」(高性能RPC通信フレームワーク)という、より強力で、より高速な、新たな王を我々に示した。

今回は、Windows(Microsoft製OS)という故郷の大地で、この新たな王gRPCの力を借り、ゴーレムを錬成する。そして、localhost(自端末のみアクセス可能な特殊アドレス)という名の安息所から、IPアドレス(ネットワーク識別番号)という広大な世界へ、その魂を解き放つ儀式を執り行う。これは、古き王への追悼と、新たなる王への忠誠を誓う、魂の継承儀式の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • gRPCという、HTTP/2の光の道を駆ける、新たな魔法体系に興味がある者
  • WCFという古の魔法の終焉に戸惑い、次なる力を求める探求者
  • .NET 6への移行を検討しているレガシーシステム開発者
  • マイクロサービス間通信の高速化を目指す実務家

砂漠の道標

  • WCF - Windows Communication Foundationの略。.NET Frameworkの通信フレームワーク。.NET 6では非推奨。
  • gRPC - Google開発の高性能RPC(Remote Procedure Call)フレームワーク。HTTP/2ベース。
  • .NET 6 - Microsoftのオープンソースなクロスプラットフォーム開発フレームワーク。
  • ASP.NET Core - Webアプリケーション・API開発のためのフレームワーク。クロスプラットフォーム対応。
  • HTTP/2 - HTTPプロトコルの第2版。多重化により高速通信が可能。
  • NLog - .NET用の高機能ログ出力ライブラリ。ファイル、コンソール等へのログ出力が可能。
  • launchSettings.json - ASP.NET Coreのローカル開発設定ファイル。起動URL等を定義。
  • 0.0.0.0 - 全てのネットワークインターフェースで待ち受けることを示す特殊なIPアドレス。
  • 自己署名証明書 - 認証局を介さず自身で発行したSSL/TLS証明書。開発・テスト環境で使用。

第一の儀式:gRPCサーバという名の、王の神殿を築く

Visual Studio 2022(Microsoft製統合開発環境)という名の魔法の工房で、新たなプロジェクトを創造する。テンプレートから「ASP.NET Core gRPC サービス」(gRPCサーバプロジェクトテンプレート)を選び、GrpcGreeterという名の、王の神殿を築き始める。

gRPC (ASP.NET Core gRPC サービス) を選択する

新たな王の神殿を、ここに築く

神殿には、王の声を聴くための魔法の耳「NLog」(.NET用ログ出力ライブラリ)を、NuGet(.NETパッケージ管理システム)という名の宝物庫から授ける。

NLog を追加する

王の声を聴くための、魔法の耳

魂の設計図を書き換える:launchSettings.json(開発設定ファイル)

ここが、今回の儀式で最も重要な秘儀だ。神殿の設計図であるlaunchSettings.json(ASP.NET Core開発設定ファイル)を開き、applicationUrl(アプリケーション起動URL)に記されたlocalhost(自端末のみアクセス可能な特殊アドレス)という内なる言葉を、0.0.0.0(全ネットワークインターフェースで待ち受け)という、全世界に向けた開かれた言葉へと書き換える。

{
  "profiles": {
    "GrpcGreeter": {
      "applicationUrl": "http://0.0.0.0:5217;https://0.0.0.0:7217",  // 全てのIPで待ち受け
      // ...
    }
  }
}

この一文こそが、王が自らの神殿に閉じこもるのをやめ、広大な世界からの呼びかけに応えるための、最も重要な呪文である。

王の降臨

神殿を起動すると、初回に限り、SSL証明書(暗号化通信用デジタル証明書)という名の「聖なる結界」を信頼するかの信託を問われる。これを承認すれば、王はついに、我々の世界に降臨する。

IIS Express SSL 証明書の信頼

聖なる結界を、信頼せよ

第二の儀式:王と対話する、使徒を創る(gRPCクライアント)

王と対話するためには、その言葉を理解し、伝えるための「使徒(クライアントアプリケーション)」が必要だ。 新たなコンソールアプリ(コマンドライン実行アプリケーション)のプロジェクトを創り、サーバと同様に、gRPCとNLogに必要なパッケージ(ライブラリ)を授ける。

使徒の心得:greet.proto(gRPC通信仕様定義ファイル)

王との対話の作法を記した、greet.proto(Protocol Buffers定義ファイル)という名の聖典を、サーバの神殿からコピーする。ただし、csharp_namespace(C#の名前空間)は、この使徒自身の名であるGrpcGreeterClientへと書き換えねばならない。

魂の接続:Program.cs(メインプログラム)

いよいよ、使徒が王と対話する、感動の瞬間だ。 ipconfig(Windows用ネットワーク情報表示コマンド)で突き止めた、王の神殿の座標(IPアドレス:ネットワーク識別番号)を指定する。そして、自己署名証明書(開発用SSL証明書)という結界を信頼する、という誓いを立てることを忘れてはならない。

// 王の神殿の座標(WindowsのIPアドレスとHTTPSポート)
var server = "https://172.18.149.227:7217";

var option = new GrpcChannelOptions()
{
    HttpClient = new HttpClient(new HttpClientHandler
    {
        // 自己署名証明書という結界を、信頼する(開発環境専用設定)
        ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
    })
};
var channel = GrpcChannel.ForAddress(server, option);
var client = new Greeter.GreeterClient(channel);

// 使徒が王へ、最初の言葉を投げかける
var response = await client.SayHelloAsync(new HelloRequest { Name = "World" });

対話の記録:Log2Console(ログビューアアプリケーション)

Log2Console(ログビューアツール)という名の真実の鏡を覗き込めば、王と使徒、二つの魂が交わした、荘厳な対話の記録を、その目で確かめることができる。

Log2Console によるログの確認

真実の鏡に映る、王と使徒の対話

羊皮紙を巻く前に

WCF(.NET Framework通信フレームワーク)の時代は終わった。しかし、我々はgRPC(高性能RPC通信フレームワーク)という、より強力な魔法を手に入れた。古き王への追悼と、新たなる王への忠誠を誓う、この魂の継承儀式は、思いのほか明快なものだった。

gRPCがもたらす新時代の恩恵

  1. 劇的なパフォーマンス向上 - HTTP/2ベースの多重化により、WCFと比較して数倍の高速通信を実現。マイクロサービス間通信の遅延を大幅に削減
  2. 真のクロスプラットフォーム対応 - Windows、Linux、macOSで完全に同一のコードが動作。.NET 6のクロスプラットフォーム思想を完璧に体現
  3. Protocol Buffersによる型安全性 - .protoファイルで通信仕様を厳密に定義。コンパイル時の型チェックでランタイムエラーを防止
  4. 双方向ストリーミング対応 - クライアント・サーバ間の双方向リアルタイム通信が可能。チャットやリアルタイムダッシュボードに最適

この儀式で学んだ重要な呪文

localhost(自端末のみアクセス可能)の壁を越え、IPアドレス(ネットワーク識別番号)で世界と繋がるためのlaunchSettings.json(開発設定ファイル)の書き換えは、たった一行の変更だが、決定的に重要な儀式だった。applicationUrl0.0.0.0に設定することで、王の神殿は外界からの呼びかけに応えられるようになる。

また、自己署名証明書(開発用SSL証明書)を信頼するためのServerCertificateCustomValidationCallback設定も、開発環境では必須の呪文である。本番環境では正式な証明書を使用すべきだが、開発段階ではこの呪文が我々を多くの苦労から救ってくれる。

まとめ

この旅で得た知見は、次の冒険、すなわち「Linux」(UNIXベースのOS)という異世界でのゴーレム錬成へと繋がっていく。Windows版で基本を押さえたことで、異なる大地でも同じ魔法が使えることを実感できるだろう。

この羊皮紙が、同じように古き王との別れを悲しみ、新たなる王への忠誠を誓う、未来の冒険者の助けとなることを願う。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が「古き王は死んだ、新しい王の時代だ!」なんて、一人で興奮している。俺に言わせりゃ、王様なんてのは、誰だっていいんだ。ちゃんと俺に、美味い干し草と、新鮮な水をくれる王様ならな。それに、王が変わったからって、俺の仕事が楽になるわけでもねえ。相変わらず荷物運びだ。まったく、人間の忠誠心ってやつは、よく分からんぜ。王より干し草の方が大事だろうが。やれやれだぜ。