Fungsi Tanpa Server dengan Fungsi Awan Musim Semi

1. Pengenalan

Dalam tutorial ini, kita akan belajar bagaimana menggunakan Spring Cloud Function.

Kami akan membina dan menjalankan Spring Cloud Function yang mudah secara tempatan dan kemudian menyebarkannya ke AWS.

2. Persediaan Fungsi Awan Musim Semi

Sebagai permulaan, mari kita laksanakan dari awal dan uji projek mudah dengan dua fungsi menggunakan pendekatan yang berbeza:

  • Pembalik String, menggunakan kaedah biasa
  • Dan seorang penyambut tetamu menggunakan kelas khusus

2.1. Ketergantungan Maven

Perkara pertama yang perlu kita lakukan ialah pergantungan spring-cloud-starter-function-web . Ini akan bertindak sebagai penyesuai tempatan kami dan membawa kebergantungan yang diperlukan untuk menjalankan fungsi kami secara tempatan:

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

Nantikan kami kerana kami akan mengubahnya sedikit ketika kami menggunakan AWS.

2.2. Menulis Fungsi Awan Musim Semi

Dengan Spring Cloud Function, kami dapat mengekspos @Bean jenis Fungsi , Pengguna atau Pembekal sebagai kaedah individu :

@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 kod ini, kita dapat memaparkan fitur rentetan terbalik sebagai Fungsi , yang dapat digunakan oleh platform fungsi sasaran kita.

2.3. Menguji Fungsi String Terbalik Secara Lokal

The bunga-awan starter fungsi-web mendedahkan fungsi sebagai HTTP titik akhir. Setelah kami menjalankan CloudFunctionApplication , kami dapat melengkapkan sasaran kami untuk mengujinya secara tempatan:

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

Perhatikan bahawa titik akhir adalah nama kacang.

Dan seperti yang diharapkan, kami mendapat rentetan terbalik sebagai output:

resU gnudleaB

2.4. Mengimbas Fungsi Awan Musim Semi dalam Pakej

Selain memperlihatkan kaedah kami sebagai @Bean, kami juga dapat menulis perisian kami sebagai kelas yang melaksanakan fungsi antara muka yang berfungsi :

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 untuk mengimbas kacang yang relevan dalam aplikasi. Harta tanah :

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

2.5. Menguji Fungsi Greeter secara tempatan

Sekali lagi, kita boleh memulakan aplikasi dan menggunakan curl untuk menguji fungsi Greeter :

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

Perhatikan bahawa titik akhir adalah nama kelas yang menerapkan antara muka Fungsional.

Dan, tidak menghairankan, kami mendapat ucapan yang diharapkan:

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

3. Fungsi Awan Musim Semi pada AWS

Apa yang menjadikan Spring Cloud Function begitu kuat ialah kita dapat membina fungsi Spring yang bersifat cloud agnostik. Fungsi itu sendiri tidak perlu mengetahui tentang bagaimana ia dipanggil atau persekitaran di mana ia digunakan. Sebagai contoh, kita dapat menggunakan penyambut ini dengan mudah ke platform AWS, Azure atau Google Cloud tanpa mengubah logik perniagaan apa pun.

Oleh kerana AWS Lambda adalah salah satu penyelesaian tanpa pelayan yang popular, mari kita fokus pada bagaimana menyebarkan aplikasi kita ke dalamnya.

Oleh itu, jangan tunggu lagi dan gunakan fungsi kita ke awan!

3.1. Ketergantungan Maven

Ingatlah pergantungan spring-cloud-starter-function-web , yang kami tambahkan pada asalnya. Sekarang tiba masanya untuk mengubahnya.

Lihat, bergantung pada tempat kita akan menjalankan Spring Cloud Function, kita perlu menambahkan kebergantungan yang sesuai.

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

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

Seterusnya, mari tambahkan kebergantungan 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 

Akhirnya, kerana kita akan memuat naik artifak yang dihasilkan oleh bangunan maven ke AWS Lambda, kita perlu membuat artifak yang berlorek, yang bermaksud, semua ketergantungan itu meletup sebagai fail kelas individu dan bukannya balang.

The bunga-boot-nipis susun atur pergantungan membantu kita untuk mengurangkan saiz artifak dengan mengecualikan beberapa kebergantungan 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. Pengendali 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, kod yang sama dapat dijalankan sebagai titik akhir web, di platform awan, atau sebagai bahagian aliran. Ia menyingkirkan semua butiran dan infrastruktur pengangkutan, yang membolehkan pemaju menyimpan semua alat dan proses yang sudah biasa, dan menumpukan perhatian pada logik perniagaan.

Seperti biasa, periksa kod sumber untuk tutorial ini di GitHub.