BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Spring Cloud Functionフレームワークでの関数指向プログラミング

Spring Cloud Functionフレームワークでの関数指向プログラミング

ブックマーク

原文(投稿日:2017/08/06)へのリンク

Spring Cloud FunctionはPivotalのSpringチームによる新規プロジェクトである。これは関数を開発作業の基本単位として促進することを目指している。またプロジェクトはさまざまなデプロイプラットフォームを横断して関数ベースのソフトウェアをデプロイするための共通モデルを提供する。これにはアマゾンのAWS lambdaのようなFaaS (function as a service)プラットフォームも含まれる。

 

他のサーバレスモデルと同じように、プロジェクトは関数を開発者が開発に取り組むときの基本概念とすることを目的としている。プロジェクトで2つ目に重要な要素はビジネスロジックをデプロイプロファイルから切り離すことだ。ビジネスロジックは関数として実装されるのに対して、同じコードがRESTfulサービスやストリーム処理のアプリケーション(たとえばSpring Cloud Data Flowのような)、有限タスクとして関数を公開するデプロイプロファイルとして与えられる。これが意味することは、個々の関数はスタンドアロンのアプリケーションとしてデプロイされる、またはFaaSプラットフォームにデプロイされるということだ。チームがAWS LambdaApache OpenWhiskへのアダプタを提供する限り、一度Javaサポートを提供すればGoogle Cloud FunctionsやAzure Functionのような他のサーバレスプラットフォームへも提供されることになる。

 

AWS Lambdaのようなプラットフォームのきれいな抽象化と明確なコストの利点が多くの開発者を魅了している一方で、鍵となる関心事、とくに企業にとっては、ソースにフレームワーク特有のコードが含まれることによるベンダーロックインのリスクがあった。

 

サーバレスのエキスパートとしてMike Roberts氏はMartin Fowler氏のウェブサイトにこう書いている。

状況によるが、[サーバレスのFaaSシステムは]ベンダ依存のコストと(その時点で)サポートしているサービスが未完成であるコストの観点で運用コストと複雑性を劇的に減らせます。

Spring Cloud Functionはデリバリーパイプラインでのパッケージフェーズにデプロイプラットフォーム依存を導入することでこれを緩和できるようにする。これが意味することは、開発者が関数を分離して実装できるということだ(ユニットテスト作成も含む)。関数のロジックと入出力のパラメータだけに関心を持つ。関数は対象環境で実行できるように依存するものとともにパッケージされる。

 

Mark Fisher氏は、Spring Cloud Functionのプロジェクトリードであるが、InfoQにこう話した。

サーバレスにとってポータビリティや一貫性は大きな挑戦である以上、私たちはJava開発者の体験をを改善したいのです。

 

プロジェクトのコアは、SpringのPOJO規約に少し馴染んでいることとは対照的に関数をベースにしたプログラミングモデルの促進だ。すでにサーバレスの世界に少し足を踏み入れている人はこのモデルがわかるだろう。開発者は根底にあるインフラストラクチャやフレームワークについてまったく知らず、ボイラープレートや他の“配管”コードではなく単純にビジネスロジックの実装に集中する世界だ。Spring Cloud Functionで、ビジネスロジックはjava.util.functionパッケージで定義されたコアインタフェース、FunctionConsumerSupplierの実装を使って開発する。

 

このとても単純な例であるが、Functionインタフェースを実装するクラスを作成できる。

 import java.util.function.Function;
 public class LengthCounter implements Function<String, Integer> {
      @Override 
      public Integer apply(String name) {
          return new Integer(name.length());
      }
  }

@FunctionScanアノテーションで可能となるクラスパスのスキャンを通じて魔法が適用される。

@FunctionScan
@SpringBootApplication
public class ExampleSpringFunctionApplication {
...

あるいは、関数はクラス本体に宣言できる。@Beanアノテーションを付与する。

@Bean
public Function<String, Integer> lowercase() {
       return flux -> flux.map(value -> value.toLowerCase());
}

この手法を取る場合、@FunctionScanは必要ない。

関数は対照プラットフォームのための適切なデプロイプロファイルにより必要な設定とアダプタとともにラップされたJARファイルとしてパッケージされる。

Mark Fisher氏は私たちにこう言っている。

サーバレスは別として、私たちは開発単位として関数の単純さを促進したいです。おそらく開発対象の全領域にわたります。

 

開発者はSpring Bootエコシステムからの慣れ親しんだツールやプロセス、ユーティリティ(たとえば自動化されたテストや自動的な設定、依存性注入、メトリクス)を使い、ビジネスに焦点を当てた関数の作成に集中する。一方で根本的な伝達詳細やインフラストラクチャ、デプロイフレームワークは離れたところで抽象化されている。

 

プロジェクトは早期ステージにあるがSpringの人たちはまだ続くことを約束している。たとえばSpring Cloud Data Flowとのより緊密な連携とFissionや他のKubernetesベースのサーバレスプラットフォームとの連携だ。

 

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT