Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

Java と C# が共存! Azure Spring Cloud の Steeltoe サポートを使ってみた

こんにちは。MLBお兄さんこと松村です。この記事はオルターブース Advent Calendar 2020の15日目の記事です。
昨日は弊社のゾンビランドサガ仲間のふるの君の記事でした!
aadojo.alterbooth.com

2020年、毎月実施してきた弊社のKOSMISCH全国キャラバンのウェビナー
マイクロソフトと共催ウェビナーではマイクロソフトの平岡さんにたくさん登壇いただきました。マジでありがとうございます。(土下座)

10月15日に実施したウェビナーの平岡さんのセッションのなかで、Azure Spring Cloudのアップデートが紹介されました。

www.slideshare.net

そこでひとつ、こちらの気になるページが。

f:id:tech-tsubaki:20201213162511p:plain

なんと Azure Spring Cloud で .NET のアプリケーションが動くというではありませんか! Steeltoe というツールで実現するということ。
つまり Java アプリケーションの実行環境である Azure Spring Cloud に、 .NET アプリケーションを共存させることができる。
.NETお兄さんでもある私としては聞き捨てならないということで、この機会に試してみました。

Steeltoe とは?

steeltoe.io

Steeltoe とは .NET でマイクロサービスアプリケーションを開発するためのモダンなクラウドプラットフォームです。
Cloud Foundry や Kubernetes などのクラウドネイティブ環境で .NET アプリケーションを実行させるための仕組みを持っています。

f:id:tech-tsubaki:20201213162534p:plain

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 アプリケーションを作ります。
プロジェクトの名前は何でもいいみたいですが、バージョン類はすべて最新を選択。あと、依存関係に構成サーバーを追加します。

f:id:tech-tsubaki:20201213162555p:plain

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# アプリケーションから利用することができるようになりました。

f:id:tech-tsubaki:20201213162632p:plain

Azure Spring Cloud のチュートリアルを試す

Steeltoe のもう一つの特徴として、 Azure Spring Cloud で C# アプリケーションをホストすることができるということ。
次は Azure Spring Cloud のチュートリアルを試します。このチュートリアルについては特にハマりどころはなく、スラスラ進めることができました。
docs.microsoft.com

f:id:tech-tsubaki:20201213162946p:plain f:id:tech-tsubaki:20201213163030p:plain f:id:tech-tsubaki:20201213163528p:plain

Steeltoe のチュートリアルアプリを Azure Spring Cloud にデプロイしてみる

※結論としては記事執筆時点で正しく動かすことができていません。

応用編として Steeltoe のチュートリアルアプリを Azure Spring Cloud にデプロイして、ローカルと同じように動くようにしてみます。

https://github.com/tsubakimoto/Spring-Config-Demo を Azure Spring Cloud の構成サーバーに登録します。

f:id:tech-tsubaki:20201213163612p:plain

次に Steeltoe のチュートリアルアプリを Azure Spring Cloud にデプロイします。
Azure Spring Cloud のチュートリアルに沿って、パッケージを追加し、 Program.cs や Startup.cs を修正していきます。

// 中略
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

f:id:tech-tsubaki:20201213163637p:plain f:id:tech-tsubaki:20201213163723p:plain

・・・残念ながら動きません。構成サーバーの内容を読み取れず正しいデータを表示することができません。
見様見真似で設定しているためですね。ちゃんと Azure Spring Cloud の仕組みを理解してから再チャレンジしたいと思います。


とはいえ Java と C# のアプリケーションを同じクラウドネイティブ環境に共存させることができ、なおかつ構成情報を共有できるという便利さはとても良いと思います。

adventar.org