Fungsi Tanpa Server dengan Spring Cloud Function

1. Perkenalan

Dalam tutorial ini, kita akan mempelajari cara menggunakan Spring Cloud Function.

Kami akan membangun dan menjalankan Spring Cloud Function secara lokal dan kemudian menerapkannya ke AWS.

2. Pengaturan Spring Cloud Function

Untuk memulai, mari implementasikan dari awal dan uji proyek sederhana dengan dua fungsi menggunakan pendekatan berbeda:

  • Sebuah pembalik String, menggunakan metode biasa
  • Dan seorang penyapa menggunakan kelas khusus

2.1. Dependensi Maven

Hal pertama yang perlu kita lakukan adalah menyertakan dependensi web-cloud-starter-function-web . Ini akan bertindak sebagai adaptor lokal kami dan membawa dependensi yang diperlukan untuk menjalankan fungsi kami secara lokal:

 org.springframework.cloud spring-cloud-starter-function-web 1.0.1.RELEASE 

Pantau terus karena kami akan sedikit memodifikasi ini saat kami menerapkan ke AWS.

2.2. Menulis Fungsi Cloud Musim Semi

Dengan Spring Cloud Function, kami dapat menampilkan @Bean s dari jenis Fungsi , Konsumen , atau Pemasok sebagai metode individual :

@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(); } }

Seperti dalam kode ini, kita dapat mengekspos fitur string terbalik sebagai Fungsi , yang dapat dipanggil oleh platform fungsional target kita.

2.3. Menguji Fungsi String Terbalik Secara Lokal

The semi-awan-starter-fungsi-web menghadapkan fungsi sebagai HTTP endpoint. Setelah kami menjalankan CloudFunctionApplication , kami dapat menggulung target kami untuk mengujinya secara lokal:

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

Perhatikan bahwa titik akhir adalah nama kacang.

Dan seperti yang diharapkan, kami mendapatkan string terbalik sebagai output:

resU gnudleaB

2.4. Memindai Fungsi Cloud Musim Semi dalam Paket

Selain mengekspos metode kami sebagai @Bean, kami juga dapat menulis perangkat lunak kami sebagai kelas yang mengimplementasikan fungsi antarmuka fungsional :

public class Greeter implements Function { @Override public String apply(String s) { return "Hello " + s + ", and welcome to Spring Cloud Function!!!"; } }

Kami kemudian dapat menentukan paket yang akan dipindai kacang yang relevan di application.properties :

spring.cloud.function.scan.packages=com.baeldung.spring.cloudfunction.functions

2.5. Menguji Fungsi Penyapa Secara Lokal

Sekali lagi, kita dapat memulai aplikasi dan menggunakan curl untuk menguji fungsi Greeter :

curl localhost:8080/greeter -H "Content-Type: text/plain" -d "World"

Perhatikan bahwa titik akhir adalah nama kelas yang mengimplementasikan antarmuka Fungsional.

Dan, tidak mengherankan, kami mendapatkan salam yang diharapkan kembali:

Hello World, and welcome to Spring Cloud function!!!

3. Spring Cloud Function di AWS

Apa yang membuat Spring Cloud Function begitu hebat adalah kami dapat membuat fungsi yang mendukung Spring yang cloud agnostik. Fungsi itu sendiri tidak perlu tahu tentang bagaimana fungsi itu dipanggil atau lingkungan tempat fungsi itu diterapkan. Misalnya, kami dapat dengan mudah menerapkan penyapa ini ke platform AWS, Azure, atau Google Cloud tanpa mengubah logika bisnis apa pun.

Karena AWS Lambda adalah salah satu solusi tanpa server yang populer, mari kita fokus pada cara menerapkan aplikasi kita ke dalamnya.

Jadi, jangan menunggu lebih lama lagi dan terapkan fungsi kita ke cloud!

3.1. Dependensi Maven

Ingat dependensi spring-cloud-starter-function-web , yang awalnya kami tambahkan. Sekarang saatnya untuk mengubahnya.

Lihat, tergantung di mana kita akan menjalankan Spring Cloud Function, kita perlu menambahkan dependensi yang sesuai.

Untuk AWS, kami akan menggunakan spring-cloud-function-adapter-aws :

 org.springframework.cloud spring-cloud-function-adapter-aws 

Selanjutnya, mari tambahkan dependensi AWS yang diperlukan untuk menangani peristiwa Lambda:

 com.amazonaws aws-lambda-java-events 2.0.2 provided   com.amazonaws aws-lambda-java-core 1.1.0 provided 

Terakhir, karena kami akan mengunggah artefak yang dihasilkan oleh maven build ke AWS Lambda, kami perlu membuat artefak yang diarsir, yang berarti, semua dependensi meledak sebagai file kelas individual, bukan stoples.

The semi-boot-tipis-layout ketergantungan membantu kita untuk mengurangi ukuran artefak dengan tidak termasuk beberapa dependensi yang tidak diperlukan:

   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. Penangan 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.

Dengannya, kode yang sama dapat dijalankan sebagai titik akhir web, di platform cloud, atau sebagai bagian dari aliran. Ini mengabstraksi semua detail dan infrastruktur transportasi, memungkinkan pengembang untuk menyimpan semua alat dan proses yang sudah dikenal, dan fokus dengan kuat pada logika bisnis.

Seperti biasa, lihat kode sumber untuk tutorial ini di GitHub.