«1. Введение

В этом уроке мы узнаем, как использовать функцию Spring Cloud.

Мы создадим и запустим простую облачную функцию Spring локально, а затем развернем ее на AWS.

2. Настройка функции Spring Cloud

Для начала давайте реализуем с нуля и протестируем простой проект с двумя функциями, используя разные подходы:

    Реверсер строк, используя простой метод И приветствие, используя выделенный класс

2.1. Зависимости Maven

Первое, что нам нужно сделать, это включить зависимость 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 мы можем предоставить @Beans типа Function, Consumer или Supplier как отдельные методы:

@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();
    }
}

Как и в этом коде, мы можем предоставить функцию обратной строки как функцию , который может вызывать наша целевая функциональная платформа.

2.3. Локальное тестирование функции обратной строки

Spring-cloud-starter-function-web предоставляет функцию как конечную точку HTTP. После того, как мы запустим CloudFunctionApplication, мы можем свернуть нашу цель, чтобы протестировать ее локально:

curl localhost:8080/reverseString -H "Content-Type: text/plain" -d "Baeldung User"

Обратите внимание, что конечная точка — это имя компонента.

И, как и ожидалось, на выходе мы получаем перевернутую строку:

resU gnudleaB

2.4. Сканирование функции Spring Cloud в пакетах

Помимо представления нашего метода как @Bean, мы также можем написать наше программное обеспечение в виде классов, реализующих функциональный интерфейс Function\u003cT, R\u003e:

public class Greeter implements Function<String, String> {

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

Затем мы можем указать пакеты для сканирования соответствующих bean-компонентов в application.properties:

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

2.5. Локальное тестирование функции приветствия

Опять же, мы можем запустить приложение и использовать curl для тестирования функции приветствия:

curl localhost:8080/greeter -H "Content-Type: text/plain" -d "World"

Обратите внимание, что конечная точка — это имя класса, реализующего функциональный интерфейс.

И, неудивительно, мы получаем ответное приветствие:

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

3. Spring Cloud Function на AWS

Что делает Spring Cloud Function настолько мощным, так это то, что мы можем создавать функции с поддержкой Spring, которые не зависят от облака . Самой функции не нужно знать, как она была вызвана или в какой среде она развернута. Например, мы можем легко развернуть это приветствие на платформе AWS, Azure или Google Cloud без изменения какой-либо бизнес-логики.

Поскольку AWS Lambda — одно из популярных бессерверных решений, давайте сосредоточимся на том, как развернуть в нем наше приложение.

Итак, не будем больше ждать и развернем нашу функцию в облаке!

3.1. Зависимости Maven

Помните зависимость spring-cloud-starter-function-web, которую мы добавили изначально. Теперь пришло время изменить это.

Видите ли, в зависимости от того, где мы собираемся запускать функцию Spring Cloud, нам нужно добавить соответствующую зависимость.

Для AWS мы будем использовать spring-cloud-function-adapter-aws:

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

Далее добавим необходимые зависимости AWS для обработки событий Lambda:

<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, нам нужно создать затененный артефакт, то есть все зависимости в нем представлены в виде отдельных файлов классов, а не банок.

Зависимость 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. Он реализует RequestHandler AWS и отвечает за отправку запроса AWS нашей функции.

public class MyStringHandlers extends SpringBootRequestHandler<String, String> {

}

Spring Cloud Function AWS также поставляется с SpringBootStreamHandler и FunctionInvokingS3EventHandler в качестве других примеров

Теперь может показаться немного странным, что MyStringHandlers — это просто пустой класс, но он играет важную роль в обоих действиях в качестве записи точку лямбда-функции, а также определение ее входных и выходных типов.

«Как видно на снимке экрана ниже, мы укажем полное имя этого класса в поле ввода Handler на странице конфигурации AWS Lambda.

3.3. Как AWS узнает, какую облачную функцию вызывать?

Как оказалось, даже если в нашем приложении есть более одной функции Spring Cloud, AWS может вызвать только одну из них.

В следующем разделе мы укажем имя облачной функции в переменной среды FUNCTION_NAME на консоли AWS.

4. Загрузите функцию в AWS и протестируйте

Наконец, давайте создадим нашу банку с помощью maven, а затем загрузим ее через пользовательский интерфейс консоли AWS.

4.1. Создайте функцию Lambda в консоли AWS и настройте ее

На странице консоли AWS Lambda в разделе «Код функции» мы можем выбрать среду выполнения Java 8 и просто нажать «Загрузить».

После этого нам нужно указать в поле Handler полное имя класса, реализующего SpringBootRequestHandler, или com.baeldung.spring.cloudfunction.MyStringHandlers в нашем случае:

И далее в переменных Environment мы укажите, какой функциональный компонент Spring вызывать через переменную окружения FUNCTION_NAME:

И после этого пришло время протестировать функцию Lambda, создав тестовое событие и предоставив образец строки:

4.2. Тестирование функции на AWS

Теперь мы сохраняем наш тест, затем нажимаем кнопку «Тест».

И, как и ожидалось, мы получаем тот же результат, что и при локальном тестировании функции:

4.3. Тестирование другой функции

Помните, что в нашем приложении есть еще одна функция: welcomer. Давайте удостоверимся, что это тоже работает.

Мы изменим переменную окружения FUNCTION_NAME на Greeter:

Нажмите кнопку «Сохранить» и, наконец, снова кнопку «Тест»:

5. Заключение

Подводя итог, несмотря на то, что Spring Cloud Function находится на ранних стадиях — это мощный инструмент для отделения бизнес-логики от любой конкретной цели среды выполнения.

С его помощью один и тот же код может работать как веб-конечная точка, на облачной платформе или как часть потока. Он абстрагирует все транспортные детали и инфраструктуру, позволяя разработчику сохранить все знакомые инструменты и процессы и полностью сосредоточиться на бизнес-логике.

Как всегда, ознакомьтесь с исходным кодом этого руководства на GitHub.