Перейти к основному содержимому

Бессерверные функции с функцией Spring Cloud

· 6 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

1. Введение

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

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

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

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

  • Реверс String с использованием простого метода
  • И приветствующий, использующий специальный класс

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 Function мы можем выставлять @Bean типа 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 "ForEach User"

Обратите внимание, что конечной точкой является имя компонента.

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

resU gnudleaB

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

Помимо предоставления нашего метода как @Bean, мы также могли бы написать наше программное обеспечение как классы, реализующие функциональный интерфейс 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!!!";
}
}

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

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

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

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

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

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

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

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

3. Функция Spring Cloud на 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, нам нужно создать затененный артефакт, то есть в нем все зависимости представлены в виде отдельных файлов классов, а не 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. Он реализует RequestHandler AWS и отвечает за отправку запроса AWS нашей функции.

public class MyStringHandlers extends SpringBootRequestHandler<String, String> {

}

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

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

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

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

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

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

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

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

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

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

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

./c944a105d505f990473652b56768681b.png

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

./4e95114e1f095717e16e9b5e65d7502a.png

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

./98ec0066d4f00a4e12637cc65a5bb5e4.png

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

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

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

./3a301644a535d6d9cd8602d61b7995df.png

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

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

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

./7435ef28949009c8ee2b2e52951432b4.png

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

./d700d9687e1c082bf66d2a4f2f54cb10.png

5. Вывод

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

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

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