Рубрики
Без рубрики

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

Узнайте, как работать без сервера с Spring, использовать функции Spring Cloud и развертываться в AWS Lambda.

Автор оригинала: baeldung.

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 Function reverseString() {
        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 .