こんにちは。MLBお兄さんこと松村です。この記事はオルターブース Advent Calendar 2020の15日目の記事です。
昨日は弊社のゾンビランドサガ仲間のふるの君の記事でした!
aadojo.alterbooth.com
2020年、毎月実施してきた弊社のKOSMISCH全国キャラバンのウェビナー。
マイクロソフトと共催ウェビナーではマイクロソフトの平岡さんにたくさん登壇いただきました。マジでありがとうございます。(土下座)
10月15日に実施したウェビナーの平岡さんのセッションのなかで、Azure Spring Cloudのアップデートが紹介されました。
そこでひとつ、こちらの気になるページが。
なんと Azure Spring Cloud で .NET のアプリケーションが動くというではありませんか! Steeltoe というツールで実現するということ。
つまり Java アプリケーションの実行環境である Azure Spring Cloud に、 .NET アプリケーションを共存させることができる。
.NETお兄さんでもある私としては聞き捨てならないということで、この機会に試してみました。
Steeltoe とは?
Steeltoe とは .NET でマイクロサービスアプリケーションを開発するためのモダンなクラウドプラットフォームです。
Cloud Foundry や Kubernetes などのクラウドネイティブ環境で .NET アプリケーションを実行させるための仕組みを持っています。
Steeltoe のチュートリアルを試す
早速 Spring 向けのチュートリアルを試してみます。
steeltoe.io
まず Spring の構成サーバーとしてのリポジトリを用意し YAML ファイルを一つ作成します。
https://github.com/tsubakimoto/Spring-Config-Demo/blob/master/my-values.yml
Value1: some-val Value2: another-val
そのリポジトリを使った構成サーバーを Docker で起動します。
docker run \ --publish 8888:8888 \ steeltoeoss/config-server \ --spring.cloud.config.server.git.uri=https://github.com/tsubakimoto/Spring-Config-Demo.git
次に Steeltoe Initializr というサイトで、構成サーバーを使う .NET アプリケーションを作ります。
プロジェクトの名前は何でもいいみたいですが、バージョン類はすべて最新を選択。あと、依存関係に構成サーバーを追加します。
ASP.NET Core Web API のプロジェクトが作成されます。
そのプロジェクトの appsettings.json に対して、Docker で動いている構成サーバーの情報を追加します。
{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "spring": { "application": { "name": "my-values" }, "cloud": { "config": { "uri": "http://localhost:8888", "validateCertificates": false } } } }
dotnet run
でアプリケーションを起動すると、構成サーバーに接続して情報を読み取ります。
このときハマった点としてリポジトリを指定した Spring 構成サーバーは master
ブランチがないと正しく動かないということ。
GitHub では既定のブランチ名が master
から main
に変更となっていますが、 main
ブランチしかないリポジトリでは内容を読み取ってくれませんでした。
stackoverflow.com
my-values.yml に定義された情報が環境変数に登録されます。
C# では IConfiguration
を介して my-values.yml の情報を取得することができます。(このパッケージのおかげ)
これにて Spring Boot で使用している構成情報を C# アプリケーションから利用することができるようになりました。
Azure Spring Cloud のチュートリアルを試す
Steeltoe のもう一つの特徴として、 Azure Spring Cloud で C# アプリケーションをホストすることができるということ。
次は Azure Spring Cloud のチュートリアルを試します。このチュートリアルについては特にハマりどころはなく、スラスラ進めることができました。
docs.microsoft.com
Steeltoe のチュートリアルアプリを Azure Spring Cloud にデプロイしてみる
※結論としては記事執筆時点で正しく動かすことができていません。
応用編として Steeltoe のチュートリアルアプリを Azure Spring Cloud にデプロイして、ローカルと同じように動くようにしてみます。
https://github.com/tsubakimoto/Spring-Config-Demo を Azure Spring Cloud の構成サーバーに登録します。
次に Steeltoe のチュートリアルアプリを Azure Spring Cloud にデプロイします。
Azure Spring Cloud のチュートリアルに沿って、パッケージを追加し、 Program.cs や Startup.cs を修正していきます。
- https://www.nuget.org/packages/Steeltoe.Discovery.ClientCore/
- https://www.nuget.org/packages/Microsoft.Azure.SpringCloud.Client/
// 中略 using Microsoft.Azure.SpringCloud.Client; namespace SteeltoeExample { public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args) .UseAzureSpringCloudService() .Build() .Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var builder = WebHost.CreateDefaultBuilder(args) .AddConfigServer() .UseStartup<Startup>(); return builder; } } }
// 中略 using Steeltoe.Discovery.Client; namespace SteeltoeExample { public class Startup { // 中略 public void ConfigureServices(IServiceCollection services) { // 中略 services.AddDiscoveryClient(Configuration); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 中略 app.UseDiscoveryClient(); } } }
Azure Spring Cloud にアプリを追加してコードをデプロイします。
dotnet publish -c release -o ./publish az spring-cloud app create -n my-values -s asc-yuta-mysteeltoeapp -g rg-asc --is-public --runtime-version NetCore_31 az spring-cloud app deploy -n my-values -s asc-yuta-mysteeltoeapp -g rg-asc --runtime-version NetCore_31 --main-entry SteeltoeExample.dll --artifact-path ./deploy.zip
・・・残念ながら動きません。構成サーバーの内容を読み取れず正しいデータを表示することができません。
見様見真似で設定しているためですね。ちゃんと Azure Spring Cloud の仕組みを理解してから再チャレンジしたいと思います。
とはいえ Java と C# のアプリケーションを同じクラウドネイティブ環境に共存させることができ、なおかつ構成情報を共有できるという便利さはとても良いと思います。