Spring Cloud機能を利用したサーバーレス機能

1前書き

このチュートリアルでは、Spring Cloud Functionの使い方を学びます。

  • 簡単なSpring Cloud Functionをローカルで構築して実行し、それをAWSにデプロイします。**

2 Spring Cloud機能の設定

最初に、ゼロから実装し、2つの機能を持つ単純なプロジェクトを異なる方法でテストしましょう。

  • プレーンメソッドを使用した文字列リバーサ

  • 専用のクラスを使ったグリーター

2.1. Mavenの依存関係

最初にやるべきことはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A%22spring-cloudを含めることです。 -starter-function-web%22[ spring-cloud-starter-function-web ]依存関係。

これは、私たちのローカルアダプタとして機能し、私たちの関数をローカルで実行するために必要な依存関係を持ち込みます。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-function-web</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>

AWSにデプロイしているときは、これを少し変更しますのでご注意ください。

2.2. Spring Cloud関数を書く

Spring Cloud Functionでは、 Function Consumer 、または Supplier 型の____ @ Beanを個別のメソッドとして公開できます。

@SpringBootApplication
public class CloudFunctionApplication {

    public static void main(String[]args) {
        SpringApplication.run(CloudFunctionApplication.class, args);
    }

    @Bean
    public Function<String, String> reverseString() {
        return value -> new StringBuilder(value).reverse().toString();
    }
}

このコードのように、リバースストリング機能を Function として公開することができます。これをターゲットの機能プラットフォームで呼び出すことができます。

2.3. 逆引き文字列関数をローカルでテストする

__spring-cloud-starter-function-web は、この関数をHTTPエンドポイントとして公開します。 CloudFunctionApplication__を実行したら、ターゲットを丸めてローカルでテストすることができます。

curl localhost:8080/reverseString -H "Content-Type: text/plain" -d "Baeldung User"
  • エンドポイントはBeanの名前です。 **

そして予想通り、逆の文字列を出力として得ます。

resU gnudleaB

2.4. パッケージ内のSpring Cloud機能をスキャンする

私たちのメソッドを __ @ Beanとして公開することとは別に、 weは私たちのソフトウェアを機能インターフェイス Function <T、R> __を実装するクラスとして書くこともできます。

public class Greeter implements Function<String, String> {

    @Override
    public String apply(String s) {
        return "Hello " + s + ", and welcome to Spring Cloud Function!!!";
    }
}

その後、 application.properties で関連するBeanをスキャンするためのパッケージを指定できます。

spring.cloud.function.scan.packages=com.baeldung.spring.cloudfunction.functions

2.5. Greeter関数をローカルでテストする

繰り返しますが、アプリを起動してcurlを使用して Greeter 関数をテストします。

curl localhost:8080/greeter -H "Content-Type: text/plain" -d "World"
  • エンドポイントはFunctionalインタフェースを実装するクラスの名前です。 **

そして、驚くことではありませんが、予想される挨拶が返ってきます。

Hello World, and welcome to Spring Cloud function!!!

3 AWS 上のSpring Cloud機能

Spring Cloud Functionを非常に強力にするのは、クラウドに依存しないSpring対応の機能を構築できるということです。関数自体は、それがどのように呼び出されたのか、またはそれがデプロイされた環境を知る必要はありません。たとえば、** ビジネスロジックを変更することなく、このグリーターをAWS、Azure、またはGoogle Cloudプラットフォームに簡単にデプロイできます。

AWS Lambdaは人気のあるサーバーレスソリューションの1つなので、ここにアプリをデプロイする方法に注目しましょう。

それでは、もう待つことなく、私たちの機能をクラウドにデプロイしましょう。

3.1. Mavenの依存関係

もともと追加した spring-cloud-starter-function-web 依存関係を覚えておいてください。今それを変える時が来ました。

Spring Cloud Functionを実行する場所に応じて、適切な依存関係を追加する必要があります。

AWSの場合、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A%22spring-cloud-function-アダプタaws%22[ クラウドクラウド機能アダプタaws ]:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>

次に、Lambdaイベントを処理するために必要なAWSの依存関係を追加しましょう。

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>2.0.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.1.0</version>
    <scope>provided</scope>
</dependency>

最後に、Mavenビルドによって生成されたアーティファクトをAWS Lambdaにアップロードするので、影付きのアーティファクトを構築する必要があります。つまり、依存関係はすべて、jarではなく個々のクラスファイルとして展開されます。

[spring-boot-thin-layout__ 依存関係は、不要な依存関係を除外することで、成果物のサイズを減らすのに役立ちます。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot.experimental</groupId>
                    <artifactId>spring-boot-thin-layout</artifactId>
                    <version>1.0.10.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>aws</shadedClassifierName>
            </configuration>
        </plugin>
    </plugins>
</build>

3.2. AWSハンドラ

HTTPリクエストを介して文字列リバーサを再度公開する場合は、Spring Cloud Function AWSに SpringBootRequestHandlerが同梱されます。これはAWSの RequestHandler__を実装し、AWSリクエストを私たちの関数にディスパッチすることを担当します。

public class MyStringHandlers extends SpringBootRequestHandler<String, String> {

}

Spring Cloud関数AWSには、他の例として SpringBootStreamHandler および FunctionInvokingS3EventHandler も付属しています。

  • 今、 MyStringHandlers が単なる空のクラスであることは少し奇妙に思えるかもしれませんが、Lambda関数のエントリポイントとしての役割とその入力および出力タイプの定義の両方で重要な役割を果たしています。

下のスクリーンショットに示すように、AWS Lambda設定ページの[Handler]入力フィールドにこのクラスの完全修飾名を入力します。

3.3. AWSはどのクラウド機能を呼び出すべきかをどのように認識しますか?

結局のところ、アプリケーション内に複数のSpring Cloud Functionがある場合でも、 AWSはそのうちの1つだけを呼び出すことができます

次のセクションでは、AWSコンソールの FUNCTION NAME__という環境変数でクラウド関数名を指定します。

4 AWSに関数をアップロードしてテストする

最後に、mavenを使用してjarファイルを作成してから、AWSコンソールUIを介してアップロードしましょう。

4.1. AWSコンソールでLambda関数を作成して設定する

AWS Lambdaコンソールページの[機能コード]セクションで、 Java 8 ランタイムを選択し、[ アップロード] をクリックするだけです。

その後、 Handler フィールドに SpringBootRequestHandler を実装するクラスの完全修飾名、または私たちの場合は __com.baeldung.spring.cloudfunction.MyStringHandlers __を指定する必要があります。

リンク:/uploads/cloud1-100x23.png%20100w[]

そして、環境変数で、 __ FUNCTION NAME ____environment変数で呼び出すSpring関数Beanを指定します。

リンク:/uploads/cloud2-100x16.png%20100w[]

それでは、テストイベントを作成してサンプル文字列を入力して、Lambda関数をテストしましょう。

リンク:/uploads/cloud3-100x112.png%20100w[]

4.2. AWS で機能をテストする

それでは、テストを「保存」してから、「テスト」ボタンをクリックします。

そして、予想通り、関数をローカルでテストしたときと同じ出力が得られます。

リンク:/uploads/cloud4-100x47.png%20100w[]

4.3. 他の機能をテストする

覚えておいて、私たちのアプリケーションにもう一つの機能があります:それも機能することを確認しましょう。

__FUNCTION NAME __environment変数を greeter__に変更します。

リンク:/uploads/cloud5-100x16.png%20100w[]

[保存]ボタンをクリックし、最後に[テスト]ボタンをもう一度クリックします。

リンク:/uploads/cloud6-100x47.png%20100w[]

5結論

まとめると、初期段階にあるものの、Spring Cloud Functionはビジネスロジックを特定のランタイムターゲットから切り離すための強力なツールです。

これにより、同じコードをWebエンドポイントとして、クラウドプラットフォーム上で、またはストリームの一部として実行できます。これにより、トランスポートの詳細とインフラストラクチャがすべて抽象化され、開発者は使い慣れたツールとプロセスをすべて維持し、ビジネスロジックに集中することができます。

いつものように、このチュートリアルのソースコードをチェックしてください。