Azure SDK for Java に関連するアレコレ

# Azure SDK for Java について

今回は、Azure SDK for Java についてツラツラと書いていきたいと思います。適当なことを書いている可能性もあるので、細かい話は一次情報に当たってください！（免責）

Azure SDK for Java っていうと狭義のリポジトリから提供されるライブラリ群を指す気がするのですが、とりあえずAzure に関連する Java用SDK 全般って感じの意味愛にとっていただければ。

# SDKとREST API

はじめに、SDKとは説明するまでもありませんが、Software Development Kit の略で、JavaからAzureを色々操作したいときに利用するライブラリ群です。そして、Azureを自身を操作したり、Azureが提供するコンポーネント（Storageなど）を操作するRawレベルのAPI は REST API として提供されています。ザックリ言ってしまえば、各言語SDKは、このREST APIラッパーなわけです。

* [Azure REST API reference documentation | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/azure/)

そして、それらのAPI仕様は、OpenAPI Specification として定義されています。

* [Azure/azure-rest-api-specs: The source for REST API specifications for Microsoft Azure.](https://github.com/Azure/azure-rest-api-specs)

各言語のSDK（C#/Java/Python/JavaScript）などは、この仕様からの自動生成が中心となっています。

SDKには一応ガイドラインがあり、それに乗っ取って開発されています。かつてのJava SDK は、C#の実装があり、そこから派生して開発されていましたが、いまは各言語横並びで、その言語に依存した形で実装が進められているとの認識です。

* [General Guidelines: Introduction | Azure SDKs](https://azure.github.io/azure-sdk/general_introduction.html)

Javaのガイドラインは以下で、設計原則などが書かれています。

* [Java Azure SDK Design Guidelines | Azure SDKs](https://azure.github.io/azure-sdk/java_introduction.html)

ちなみにJava SDKは、以前はC#と似たクラス群、メソッドなどが提供されていましたが、ここ最近はJavaはJavaっぽいスタイルでの実装がすすんでます（実現できることはほぼ同じですが）。また、各言語バラバラに実装されている感も強かったのですが、これらのカイドラインができて着実に言語毎に最適化、進化している感じではあります。

ただ、Javaに関しては黒歴史もあったりしたので、以下の文書を読んでみると面白いと思います。

* [azure-storage-java/V12 Upgrade Story.md at master · Azure/azure-storage-java](https://github.com/Azure/azure-storage-java/blob/master/V12%20Upgrade%20Story.md)

# Azureに関連するSDK

提供されているSDKは、ほぼ Java8以降に対応してます。例外もありますが、これについては特に問題ないでしょう。

## Azure SDK for Java

Azure SDK for Java は大きく分けて２つのライブラリから成り立っています。

1. 管理ライブラリ (Management library)
2. クライアントライブラリ (Client library)

前者の管理ライブラリは、Azure自身を操作するための物で、例えばプログラムから仮想マシンを作成したり、削除したりすることができます。後者のクライアントライブラリは、Azureが提供するコンポーネントを操作するもので、例えば Azure Storage（AWSのS3みたいなもの） にファイルをアップロードしたり、削除したりできます。

Azureでシステム開発する多くの人にとっては、後者のクライアントライブラリを中心に見ていけば良いと思います。そして、それらのライブラリはMaven Central Repositoryで提供されているの、通常の開発環境からお手軽に利用できると思います。

Azure SDK for Java は、以下のリポジトリにまとまっています（一部例外あり）。なんからの不具合や機能リクエストなどがあれば、Isuueを立てると何らかの反応があると思います。

* [Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java)

リファレンスやドキュメントは、以下からたどるのが良いとおもいます。

* [Azure for Java developer documentation | Microsoft Docs](https://docs.microsoft.com/en-us/azure/developer/java/?view=azure-java-stable)
* [Azure SDK for Java | Azure SDK for Java](https://azure.github.io/azure-sdk-for-java/)

必要なリファレンス、ドキュメントは揃っている印象ですが、いささかググラビリティが低い気がします。

最近の動向としては、

* `com.azure` で名前空間が始まっている。`microsoft` だったり、`windowsazure` が含まれている物は基本古かったりもしますが、例外もあり。
* 同期API中心で、非同期APIはあって別ライブラリ扱いだったりしたのが、同期・非同期APIの同時のサポート。非同期APIには、Project Reactor を利用している。
* HTTPスタックは、reactor-netty をメインに使用。
* サービスクライアントはBuilder パターンで構築し、各クライアントライブラリで同じような作法となっている（共通化）

なんて感じになってます。

## その他のSDKライブラリ

いくつかの例外もあったりますが、Notification Hub SDKは、独自のリポジトリで管理されており、名前空間名が古いです。

* [Azure/azure-notificationhubs-java-backend: Azure Notification Hubs SDK for Java](https://github.com/Azure/azure-notificationhubs-java-backend)

Iot Hub SDKも別でした。

* [Azure/azure-iot-sdk-java: A Java SDK for connecting devices to Microsoft Azure IoT services](https://github.com/Azure/azure-iot-sdk-java)

このあたりでは、旧版を提供していますが、今となっては不要なので使わないでしょう。一部メンテはされてますが。

* [Azure/azure-storage-java: Microsoft Azure Storage Library for Java](https://github.com/Azure/azure-storage-java)

Functions絡みでは以下で、Annotationとか定義しているライブラリと、FunctionsのJava Workerライブラリ。後者は直接使いませんが、Functions絡みで怪しい挙動があるときはIssueをチェックするといいででしょう。

* [Azure/azure-functions-java-library: Contains annotations for writing Azure Functions in Java](https://github.com/Azure/azure-functions-java-library)
* [Azure/azure-functions-java-worker: Java runtime and core types for Microsoft Azure Functions](https://github.com/Azure/azure-functions-java-worker)

他にも探せばあるかもしれませんが、ご注意を。

# Maven 向けのライブラリ

SDKという訳ではありませんが、WebApps/Functions向けにMavenプラグインが提供されています。いずれ紹介していくつもりですが、以下がリポジトリです。

* [microsoft/azure-maven-plugins: Maven plugins for Azure](https://github.com/microsoft/azure-maven-plugins)

# Spring / Spring Cloud 向けSDK

以前は、独立したリポジトリですが、最近 Azure SDK for Java に統合されてしましまた。 Azure を便利に使うための、Spring Boot Starter モジュールを提供しています。追々紹介していきますが、以下にあります。

* [azure-sdk-for-java/sdk/spring at master · Azure/azure-sdk-for-java](https://github.com/*Azure/azure-sdk-for-java/tree/master/sdk/spring)

# まとめ

サービス当初こそC# とその他多勢な感じでしたが、ガイドラインも整備され、各言語はAzureの名の下に平等な感じになってきました。最後に、最新のリリース状況のページを紹介して終わりたいと思います。

[Azure SDK Releases | Azure SDKs](https://azure.github.io/azure-sdk/releases/latest/index.html#java)