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

Бессерверные функции с функцией 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 FunctionConsumer 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 в нашем случае:

image

Затем в переменных среды мы указываем, какой компонент функции Spring вызывать через переменную окруженияFUNCTION_NAME :

image

И, сделав это, пора нам протестировать функцию Lambda, создав тестовое событие и предоставив образец строки:

image

4.2. Тестирование функции на AWS

Теперь мыSave наш тест, затем нажимаем кнопкуTest.

И, как и ожидалось, мы получаем тот же вывод, что и при локальном тестировании функции:

image

4.3. Тестирование другой функции

Помните, что в нашем приложении есть еще одна функция:greeter. Убедимся, что это тоже работает.

Изменим переменную окруженияFUNCTION_NAME наgreeter:

image

Нажмите кнопкуSave и, наконец, снова кнопкуTest:

image

5. Заключение

Таким образом, хотя на ранних стадиях,Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.

С его помощью один и тот же код может работать как конечная точка сети, на облачной платформе или как часть потока. Он абстрагирует все детали транспорта и инфраструктуру, позволяя разработчику сохранить все знакомые инструменты и процессы и сосредоточиться на бизнес-логике.

Как всегда, ознакомьтесь с исходным кодом этого руководстваover on GitHub.