Sprint Bootの次期リリースとなる2.0.0 M4では、改善されたアクチュエータエンドポイントインフラストラクチャが提供される予定だ。その最も重要な変更点としては、次のものがある。
- RESTful WebサービスJerseyのサポート
- リアクティブベースのWebアプリケーションWebFluxのサポート
- 新しいエンドポイントマッピング
- ユーザ定義エンドポイント作成の簡略化
- エンドポイントのセキュリティ向上
Spring Bootのアクチュエータエンドポイントでは、Webアプリケーションとのインタラクションの監視が可能になった。これまではSpring MVCでのみサポートされていた。また、ユーザ定義のエンドポイント作成には、相当な量の追加コードと設定が必要だった。
エンドポイントマッピング
/beans
や/health
などの組み込みエンドポイントが、デフォルトで/application
のrootコンテキストにマップされるようになった。これにより、例えば前バージョンの/beans
は/application/beans
でアクセスされるようになる。
ユーザー定義エンドポイントの作成
@Enpoint
アノテーションが新設されて、ユーザ定義のエンドポイントを作成するプロセスが単純化された。次の例ではperson
という名称のエンドポイントを生成する。(サンプルアプリケーション全体はGitHubで確認できる。)
@Endpoint(id = "person")
@Component
public class PersonEndpoint {
private final Map<string, person=""> people = new HashMap<>();
PersonEndpoint() {
this.people.put("mike", new Person("Michael Redlich"));
this.people.put("rowena", new Person("Rowena Redlich"));
this.people.put("barry", new Person("Barry Burd"));
}
@ReadOperation
public List getAll() {
return new ArrayList<>(this.people.values());
}
@ReadOperation
public Person getPerson(@Selector String person) {
return this.people.get(person);
}
@WriteOperation
public void updatePerson(@Selector String name, String person) {
this.people.put(name, new Person(person));
}
public static class Person {
private String name;
Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
}
</string,>
このエンドポイントでは、@ReadOperation
および@WriteOperation
アノテーションで定義された3つのメソッドを公開する。ソースコードを追加する必要はなく、エンドポイントは/application/person
と/application/person/{name}
を経由してアクセスされる。このエンドポイントはJMX MBeanとしても自動的にデプロイされるので、JConsoleのようなJMXクライアントからアクセスすることも可能だ。
エンドポイントのセキュリティ向上
Spring Boot 2.0では、Webエンドポイントがデフォルトでセキュアになるように、これまでとは違うアプローチを選択している。webエンドポイントがデフォルトで無効になり、management.security.enabled
プロパティが削除された。個々のエンドポイントは、次の例のようにapplication.properties
ファイル内の設定によって有効にできる。
endpoints.info.enabled=true
endpoints.beans.enabled=true
ただし、endpoints.default.web.enabled
プロパティをtrue
にセットすれば、すべてのアクチュエータとユーザ定義エンドポイントを公開することも可能だ。
PivotalのプリンシパルソフトウェアエンジニアであるStéphane Nicoll{氏は、アクチュエータエンドポイントを次のように説明してくれた。
InfoQ: アクチュエータエンドポイントをアップグレードして、JerseyとWebFluxをサポートしたことについて、どのように思われましたか?
Nicoll: 従来型のサーブレットベースの環境とリアクティブベースのWebアプリを同時にサポートすることは、特に広範な機能セットを扱う場合には難しい問題ですね。
InfoQ: Springは厳密でよく考えられたAPIを提供することで有名ですが、今回のリファクタリングはどのように扱われたのでしょう?
Nicoll: フレームワークチームでは、"spring-web"から多くの機能を共有する"spring-webmvc"と"spring-webflux"という取り組みを行なっています。機能の抽象化は難しい作業ですが、それを新たなレベルでもう一度やり直せたことはよかったと思っています。
InfoQ: アーキテクチャ上の原則としては、どのようなものを重視しましたか?
Nicoll: Spring Boot 2.0の基本は、機能構築に適した強固な基盤のセットアップにあります。この新しいエンドポイントアーキテクチャが、実用レベルの機能に向けた正しい方向に進むものと確信すると同時に、コミュニティからのフィードバックを期待しています。
InfoQ: GAのリリースはいつ頃を予定していますか?
Nicoll: まだ少し流動的(flux - webfluxと掛けたしゃれ)ですが、現時点での計画では、今年末のリリースを予定しています。
リソース
- 入門資料: Building an Application with Spring Boot
- Spring Boot 2.0.0-BUILD-SNAPSHOTマニュアル
- Stéphane Nicoll{氏のスクラッチリポジトリ
- Stéphane Nicoll{氏のデモリポジトリ
この記事を評価
- 編集者評
- 編集長アクション