どうやら、一筋縄ではいかない砂の迷宮に迷い込んだらしい。この顛末を書き残しておくか。
かつて、.NET Framework(Microsoftの従来型開発フレームワーク)という大地で、我々はWCF(Windows Communication Foundation:.NET通信フレームワーク)という名の、万能にして偉大な魔法を操っていた。しかし、時代は流れ、.NET 6(Microsoftの最新開発フレームワーク)という新たな大地では、その古の魔法はもはや使えない。神々(Microsoft)は、その後継者として「gRPC」(高性能RPC通信フレームワーク)という、より強力で、より高速な、新たな王を我々に示した。
今回は、Windows(Microsoft製OS)という故郷の大地で、この新たな王gRPCの力を借り、ゴーレムを錬成する。そして、localhost(自端末のみアクセス可能な特殊アドレス)という名の安息所から、IPアドレス(ネットワーク識別番号)という広大な世界へ、その魂を解き放つ儀式を執り行う。これは、古き王への追悼と、新たなる王への忠誠を誓う、魂の継承儀式の記録である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 砂漠の道標
- 第一の儀式:gRPCサーバという名の、王の神殿を築く
- 第二の儀式:王と対話する、使徒を創る(gRPCクライアント)
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- 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という名の、王の神殿を築き始める。
神殿には、王の声を聴くための魔法の耳「NLog」(.NET用ログ出力ライブラリ)を、NuGet(.NETパッケージ管理システム)という名の宝物庫から授ける。
魂の設計図を書き換える: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証明書(暗号化通信用デジタル証明書)という名の「聖なる結界」を信頼するかの信託を問われる。これを承認すれば、王はついに、我々の世界に降臨する。
第二の儀式:王と対話する、使徒を創る(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(ログビューアツール)という名の真実の鏡を覗き込めば、王と使徒、二つの魂が交わした、荘厳な対話の記録を、その目で確かめることができる。
羊皮紙を巻く前に
WCF(.NET Framework通信フレームワーク)の時代は終わった。しかし、我々はgRPC(高性能RPC通信フレームワーク)という、より強力な魔法を手に入れた。古き王への追悼と、新たなる王への忠誠を誓う、この魂の継承儀式は、思いのほか明快なものだった。
gRPCがもたらす新時代の恩恵
- 劇的なパフォーマンス向上 - HTTP/2ベースの多重化により、WCFと比較して数倍の高速通信を実現。マイクロサービス間通信の遅延を大幅に削減
- 真のクロスプラットフォーム対応 - Windows、Linux、macOSで完全に同一のコードが動作。.NET 6のクロスプラットフォーム思想を完璧に体現
- Protocol Buffersによる型安全性 - .protoファイルで通信仕様を厳密に定義。コンパイル時の型チェックでランタイムエラーを防止
- 双方向ストリーミング対応 - クライアント・サーバ間の双方向リアルタイム通信が可能。チャットやリアルタイムダッシュボードに最適
この儀式で学んだ重要な呪文
localhost(自端末のみアクセス可能)の壁を越え、IPアドレス(ネットワーク識別番号)で世界と繋がるためのlaunchSettings.json(開発設定ファイル)の書き換えは、たった一行の変更だが、決定的に重要な儀式だった。applicationUrlを0.0.0.0に設定することで、王の神殿は外界からの呼びかけに応えられるようになる。
また、自己署名証明書(開発用SSL証明書)を信頼するためのServerCertificateCustomValidationCallback設定も、開発環境では必須の呪文である。本番環境では正式な証明書を使用すべきだが、開発段階ではこの呪文が我々を多くの苦労から救ってくれる。
まとめ
この旅で得た知見は、次の冒険、すなわち「Linux」(UNIXベースのOS)という異世界でのゴーレム錬成へと繋がっていく。Windows版で基本を押さえたことで、異なる大地でも同じ魔法が使えることを実感できるだろう。
この羊皮紙が、同じように古き王との別れを悲しみ、新たなる王への忠誠を誓う、未来の冒険者の助けとなることを願う。
おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。
砂漠で見つけた魔法のランプ
- ASP.NET Core gRPC チュートリアル - Microsoft Docs | Microsoft公式のgRPC実装ガイド。最も信頼できる古文書
- NLog with ASP.NET Core 6 - GitHub | NLogによるログ管理の実践的な古文書
- DangerousAcceptAnyServerCertificateValidator - Microsoft Docs | 自己署名証明書の信頼設定に関する公式解説
- Log2Console 日本語対応版 - GitHub | ログを可視化する真実の鏡。たびとのアトリエで改良版を公開中
- WCFから gRPCへの移行 - Microsoft Docs | WCFからgRPCへの移行を詳細に解説した公式の移行ガイド
ラクダの独り言
ご主人が「古き王は死んだ、新しい王の時代だ!」なんて、一人で興奮している。俺に言わせりゃ、王様なんてのは、誰だっていいんだ。ちゃんと俺に、美味い干し草と、新鮮な水をくれる王様ならな。それに、王が変わったからって、俺の仕事が楽になるわけでもねえ。相変わらず荷物運びだ。まったく、人間の忠誠心ってやつは、よく分からんぜ。王より干し草の方が大事だろうが。やれやれだぜ。