Безсерверні функції з функцією Spring Cloud

1. Вступ

У цьому підручнику ми дізнаємося, як використовувати функцію Spring Cloud.

Ми створимо та запустимо просту функцію Spring Cloud Function локально, а потім розгорнемо її на 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 Function ми можемо виставити @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. Тестування функції зворотного рядка локально

Весна-хмара-стартер-функція-веб виставляє функції в якості HTTP кінцевої точки. Після запуску CloudFunctionApplication ми можемо скрутити ціль, щоб перевірити її локально:

curl localhost:8080/reverseString -H "Content-Type: text/plain" -d "Baeldung User"

Зверніть увагу, що кінцевою точкою є ім'я зерна.

І, як очікувалося, ми отримуємо зворотний рядок як вихід:

resU gnudleaB

2.4. Сканування функції Spring Cloud у пакетах

Окрім виставлення нашого методу як @Bean, ми також можемо писати наше програмне забезпечення як класи, що реалізують функціональний інтерфейс Function :

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 для тестування функції 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 :

 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, нам потрібно створити артефакт, який затінений, тобто він має всі залежності, що вибухнули як окремі файли класу замість банок.

Весна-завантаження тонких верстки залежність допомагає зменшити розмір артефакту, за винятком деяких залежностей, які не потрібні:

   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

If we want to expose our string reverser again via an HTTP request, then Spring Cloud Function AWS ships with SpringBootRequestHandler. It implements AWS's RequestHandler and is in charge of dispatching the AWS request to our function.

public class MyStringHandlers extends SpringBootRequestHandler { }

Spring Cloud Function AWS also ships with SpringBootStreamHandler and FunctionInvokingS3EventHandler as other examples

Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important role in both acting as the entry point of the Lambda function and also defining its input and output types.

As we'll see in the screenshot below, we'll provide the fully qualified name of this class in the Handler input field of the AWS Lambda configuration page.

3.3. How Does AWS Know Which Cloud Function to Invoke?

As it turns out, even if we have more than one Spring Cloud Function in our application, AWS can invoke only one of them.

In the next section, we'll specify the cloud function name in an environment variable called FUNCTION_NAME on the AWS console.

4. Upload the Function to AWS and Test

Finally, let's build our jar with maven, and then upload it via the AWS Console UI.

4.1. Create a Lambda Function on AWS Console and Configure It

On the AWS Lambda console page, in the Function code section, we can select a Java 8 runtime and simply click Upload.

After that, we need to indicate in the Handler field the fully-qualified name of the class that implements SpringBootRequestHandler, or com.baeldung.spring.cloudfunction.MyStringHandlers in our case:

And then in Environment variables, we indicate which Spring function bean to invoke via the FUNCTION_NAME environment variable:

And having done that, it's time for us to test the Lambda function by creating a test event and supplying a sample string:

4.2. Testing the Function on AWS

Now, we Save our test, then click the Test button.

And, as expected, we get the same output as what we got when we tested the function locally:

4.3. Testing Another Function

Remember, we have one more function in our application: greeter. Let's make sure that works too.

We'll change the FUNCTION_NAME environment variable to greeter:

Click the Save button and finally, the Test button again:

5. Conclusion

In summary, though in its early stages, Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.

За допомогою нього той самий код може працювати як веб-кінцева точка, на хмарній платформі або як частина потоку. Він абстрагує всі транспортні деталі та інфраструктуру, дозволяючи розробнику зберігати всі знайомі інструменти та процеси та твердо зосередитися на бізнес-логіці.

Як завжди, ознайомтесь із вихідним кодом цього підручника на GitHub.