«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.