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
в нашем случае:
А затем в переменных среды мы указываем, какой функциональный компонент Spring вызывать через переменную среды FUNCTION_NAME
:
И после этого пришло время протестировать функцию Lambda, создав тестовое событие и предоставив образец строки:
4.2. Тестирование функции на AWS
Теперь мы сохраняем
наш тест, затем нажимаем кнопку « Тест»
.
И, как и ожидалось, мы получаем тот же результат, что и при локальном тестировании функции:
4.3. Тестирование другой функции
Помните, у нас есть еще одна функция в нашем приложении: Greeter
. Давайте удостоверимся, что это тоже работает.
Мы изменим переменную окружения FUNCTION_NAME на
Greeter
:
Нажмите кнопку « Сохранить
» и, наконец, снова кнопку « Тест» :
5. Вывод
Подводя итог, можно сказать, что хотя Spring Cloud Function находится на ранних стадиях, он является мощным инструментом для отделения бизнес-логики от какой-либо конкретной цели среды выполнения.
С его помощью один и тот же код может работать как веб-конечная точка, на облачной платформе или как часть потока. Он абстрагирует все транспортные детали и инфраструктуру, позволяя разработчику сохранить все знакомые инструменты и процессы и полностью сосредоточиться на бизнес-логике.
Как всегда, ознакомьтесь с исходным кодом этого руководства на GitHub .