Бессерверные функции с функцией Spring Cloud
1. Вступление
В этом уроке мы узнаем, как использовать Spring Cloud Function.
Мы создадим и запустим простую облачную функцию Spring локально, а затем развернем ее в AWS.
2. Настройка функции Spring Cloud
Для начала давайте реализуем с нуля и протестируем простой проект с двумя функциями, используя разные подходы:
-
Строковый реверсер, используя простой метод
-
И приветствующий, используя выделенный класс
2.1. Maven Зависимости
Первое, что нам нужно сделать, это включить зависимостьspring-cloud-starter-function-web. Это будет действовать как наш локальный адаптер и вносит необходимые зависимости для локального запуска нашей функции:
org.springframework.cloud
spring-cloud-starter-function-web
1.0.1.RELEASE
Следите за обновлениями, мы немного изменим это при развертывании на AWS.
2.2. Написание функции Spring Cloud
С функцией Spring Cloud,we can expose @Beans of type Function, Consumer or Supplier as individual methods:
@SpringBootApplication
public class CloudFunctionApplication {
public static void main(String[] args) {
SpringApplication.run(CloudFunctionApplication.class, args);
}
@Bean
public Function 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 "example User"
Обратите внимание, что конечная точка - это имя bean-компонента.
И, как и ожидалось, мы получаем обратную строку в качестве вывода:
resU gnudleaB
2.4. Сканирование функции Spring Cloud в пакетах
Помимо демонстрации нашего метода как@Bean, we можно также написать наше программное обеспечение как классы, реализующие функциональный интерфейсFunction<T, R>:
public class Greeter implements Function {
@Override
public String apply(String s) {
return "Hello " + s + ", and welcome to Spring Cloud Function!!!";
}
}
Затем мы можем указать пакеты для сканирования на наличие соответствующих bean-компонентов вapplication.properties:
spring.cloud.function.scan.packages=com.example.spring.cloudfunction.functions
2.5. Локальное тестирование функции Greeter
Опять же, мы можем запустить приложение и использовать 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, которые не зависят от облака. Самой функции не нужно знать, как она была вызвана или в какой среде она развернута. Например,we can easily deploy this greeter to AWS, Azure or Google Cloud platform without changing any of the business logic.
Поскольку AWS Lambda - одно из популярных бессерверных решений, давайте сосредоточимся на том, как развернуть в нем наше приложение.
Итак, не будем больше ждать и развернем нашу функцию в облаке!
3.1. Maven Зависимости
Вспомните зависимостьspring-cloud-starter-function-web, которую мы добавили изначально. Пришло время это изменить.
Понимаете, в зависимости от того, где мы собираемся запустить Spring Cloud Function, нам нужно добавить соответствующую зависимость.
Для AWS мы будем использоватьspring-cloud-function-adapter-aws:
org.springframework.cloud
spring-cloud-function-adapter-aws
Затем давайте добавим необходимые зависимости AWS для обработки событий Lambda:
com.amazonaws
aws-lambda-java-events
2.0.2
provided
com.amazonaws
aws-lambda-java-core
1.1.0
provided
Наконец, поскольку мы собираемся выгрузить артефакт, сгенерированный сборкой maven, в AWS Lambda, нам нужно создать артефакт с затенением, то есть все зависимости разложены в виде отдельных файлов классов, а не jar-файлов.
Зависимостьspring-boot-thin-layout помогает нам уменьшить размер артефакта, исключив некоторые ненужные зависимости:
org.apache.maven.plugins
maven-deploy-plugin
true
org.springframework.boot
spring-boot-maven-plugin
org.springframework.boot.experimental
spring-boot-thin-layout
1.0.10.RELEASE
org.apache.maven.plugins
maven-shade-plugin
false
true
aws
3.2. Обработчики AWS
Если мы хотим снова открыть наш реверсор строк через HTTP-запрос, тогда Spring Cloud Function AWS поставляется сSpringBootRequestHandler.. Он реализует AWSRequestHandler и отвечает за отправку запроса AWS нашей функции.
public class MyStringHandlers extends SpringBootRequestHandler {
}
Spring Cloud Function AWS также поставляется сSpringBootStreamHandler иFunctionInvokingS3EventHandler в качестве других примеров.
Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important role действует как точка входа в функцию лямбда, а также определяет ее типы ввода и вывода.
Как видно на снимке экрана ниже, мы предоставим полное имя этого класса в поле ввода Handler на странице конфигурации AWS Lambda.
3.3. Как AWS знает, какую облачную функцию вызывать?
Как оказалось, даже если в нашем приложении более одной функции Spring Cloud,AWS can invoke only one of them.
В следующем разделе мы укажем имя облачной функции в переменной среды с именемFUNCTION_NAME на консоли AWS.
4. Загрузите функцию в AWS и протестируйте
Наконец, давайте создадим наш jar-файл с помощью maven, а затем загрузим его через пользовательский интерфейс консоли AWS.
4.1. Создайте лямбда-функцию в консоли AWS и настройте ее
На странице консоли AWS Lambda в разделе кода функции мы можем выбрать среду выполненияJava 8 и просто щелкнутьUpload.
После этого нам нужно указать в полеHandler полное имя класса, реализующегоSpringBootRequestHandler, илиcom.example.spring.cloudfunction.MyStringHandlers в нашем случае:
Затем в переменных среды мы указываем, какой компонент функции Spring вызывать через переменную окруженияFUNCTION_NAME :
И, сделав это, пора нам протестировать функцию Lambda, создав тестовое событие и предоставив образец строки:
4.2. Тестирование функции на AWS
Теперь мыSave наш тест, затем нажимаем кнопкуTest.
И, как и ожидалось, мы получаем тот же вывод, что и при локальном тестировании функции:
5. Заключение
Таким образом, хотя на ранних стадиях,Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.
С его помощью один и тот же код может работать как конечная точка сети, на облачной платформе или как часть потока. Он абстрагирует все детали транспорта и инфраструктуру, позволяя разработчику сохранить все знакомые инструменты и процессы и сосредоточиться на бизнес-логике.
Как всегда, ознакомьтесь с исходным кодом этого руководстваover on GitHub.





