1. Введение
В этом уроке мы узнаем, как использовать функцию Spring Cloud.
Мы создадим и запустим простую функцию Spring Cloud локально, а затем развернем ее в 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/| мы можем выставлять @Bean s типа Функции , Потребителя или поставщика в качестве отдельных методов :
@SpringBootApplication public class CloudFunctionApplication { public static void main(String[] args) { SpringApplication.run(CloudFunctionApplication.class, args); } @Bean public FunctionreverseString() { return value -> new StringBuilder(value).reverse().toString(); } }
Как и в этом коде, мы можем представить функцию обратной строки в виде функции |, которую может вызвать наша целевая функциональная платформа.
2.3. Локальное тестирование функции обратной строки
spring-cloud-starter-function-web предоставляет функцию в качестве конечной точки HTTP. После запуска приложения Cloud Function мы можем свернуть нашу цель , чтобы протестировать ее локально:
curl localhost:8080/reverseString -H "Content-Type: text/plain" -d "Baeldung User"
Обратите внимание, что конечная точка-это имя компонента.
И, как и ожидалось, мы получаем обратную строку в качестве вывода:
resU gnudleaB
2.4. Сканирование функции Spring Cloud в пакетах
Помимо представления нашего метода в виде @Bean, мы также могли бы написать наше программное обеспечение в виде классов, реализующих функциональный интерфейс Function R> : R>
public class Greeter implements Function{ @Override public String apply(String s) { return "Hello " + s + ", and welcome to Spring Cloud Function!!!"; } }
Затем мы можем указать пакеты для сканирования соответствующих компонентов в application.properties :
spring.cloud.function.scan.packages=com.baeldung.spring.cloudfunction.functions
2.5. Локальное тестирование функции приветствия
Опять же, мы можем запустить приложение и использовать curl для тестирования функции Greater :
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 настолько мощной, так это то, что мы можем создавать функции с поддержкой Spring, которые не зависят от облака. Самой функции не нужно знать о том, как она была вызвана или в какой среде она развернута. Например, мы можем легко развернуть этот встречающий на облачной платформе AWS, Azure или Google без изменения какой-либо бизнес-логики.
Поскольку AWS Lambda является одним из популярных бессерверных решений, давайте сосредоточимся на том, как развернуть в нем наше приложение.
Итак, давайте не будем больше ждать и развернем нашу функцию в облаке!
3.1. Зависимости Maven
Помните зависимость spring-cloud-starter-function-web , которую мы добавили изначально. Теперь пришло время это изменить.
Видите ли, в зависимости от того, где мы собираемся запустить функцию Spring Cloud, нам нужно добавить соответствующую зависимость.
Для AWS мы будем использовать spring-cloud-function-adapter-aws :
org.springframework.cloud spring-cloud-function-adapter-aws
Затем давайте добавим необходимые зависимости AWS для обработки лямбда-событий:
com.amazonaws aws-lambda-java-events 2.0.2 provided com.amazonaws aws-lambda-java-core 1.1.0 provided
Наконец, поскольку мы собираемся загрузить артефакт, созданный сборкой maven, в AWS Lambda, нам нужно создать артефакт, который будет заштрихован, то есть все зависимости будут разнесены в виде отдельных файлов классов, а не банок.
Зависимость 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
Если мы хотим снова открыть наш stringreverser через HTTP-запрос, то функция Spring Cloud AWS поставляется с SpringBootRequestHandler. Он реализует RequestHandler AWS и отвечает за отправку запроса AWS в нашу функцию.
public class MyStringHandlers extends SpringBootRequestHandler{ }
Функция Spring Cloud AWS также поставляется с Spring Boot StreamHandler и Функцией вызова обработчика событий S3 в качестве других примеров
Теперь может показаться немного странным, что MyStringHandlers является просто пустым классом, но он играет важную роль как в качестве точки входа лямбда-функции, так и в определении ее типов ввода и вывода.
Как мы увидим на скриншоте ниже, мы предоставим полное имя этого класса в поле ввода обработчика на странице конфигурации AWS Lambda.
3.3. Как AWS Узнает, Какую Облачную функцию следует вызывать?
Как оказалось, даже если в нашем приложении есть несколько функций Spring Cloud, AWS может вызвать только одну из них.
В следующем разделе мы зададим имя облачной функции в переменной среды с именем FUNCTION_NAME на консоли AWS.
4. Загрузите функцию в AWS и протестируйте ее
Наконец, давайте создадим наш jar с помощью maven, а затем загрузим его через пользовательский интерфейс консоли AWS.
4.1. Создайте Лямбда-функцию на консоли AWS и настройте ее
На странице консоли AWS Lambda в разделе Код функции мы можем выбрать Java 8 runtime и просто нажать Upload .
После этого нам нужно указать в поле Обработчик полное имя класса, реализующего SpringBootRequestHandler или com.baeldung.spring.cloudfunction. Мои обработчики строк в нашем случае:
А затем в переменных среды мы указываем, какой компонент функции Spring вызывать с помощью переменной среды FUNCTION_NAME :
И после этого нам пора протестировать лямбда-функцию, создав тестовое событие и предоставив пример строки:
4.2. Тестирование функции на AWS
Теперь мы Сохраняем наш тест, а затем нажимаем кнопку Тест .
И, как и ожидалось, мы получаем тот же результат, что и при локальном тестировании функции:
4.3. Тестирование Другой Функции
Помните, что у нас есть еще одна функция в нашем приложении: greeter . Давайте убедимся, что это тоже работает.
Мы изменим переменную окружения FUNCTION_NAME на больше :
Нажмите кнопку Сохранить и, наконец, снова кнопку Проверить :
5. Заключение
Таким образом, хотя и на ранних стадиях, функция Spring Cloud является мощным инструментом для отделения бизнес-логики от любой конкретной цели среды выполнения.
С его помощью один и тот же код может выполняться как веб-конечная точка, на облачной платформе или как часть потока. Он абстрагирует все детали транспорта и инфраструктуры, позволяя разработчику сохранить все знакомые инструменты и процессы и полностью сосредоточиться на бизнес-логике.
Как всегда, проверьте исходный код этого учебника на GitHub .