Spring Cloud Function [Part 2]
จากตัวอย่างครั้งที่แล้ว https://zengcode.medium.com/spring-cloud-function-part-1-8bc83ae1a837
เราได้ implement
package com.zengcode.springcloudfunctions;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.util.function.Function;
import java.util.function.Supplier;
@SpringBootApplication
public class SpringCloudFunctionsApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudFunctionsApplication.class, args);
}
@Bean
public Supplier<String> helloWorld() {
return () -> "Hello World";
}
@Bean
public Function<String, String> getUpperCaseName() {
return (name) -> new StringBuilder(name).toString().toUpperCase();
}
@Bean
public Consumer<String> consumedMessage() {
return (str) -> System.out.println("Consumed : " + str);;
}
}
โดยเราได้ implement Function Interface ด้วยการใช้ Annotation Bean ไปแล้วนะครับ นอกจากนั้นเรายังสามารถสร้าง Class ที่ implements Function Interface ได้ด้วยนะครับ จะยแตัวอย่างเช่น
@Bean
public Function<String, String> getUpperCaseName() {
return (name) -> new StringBuilder(name).toString().toUpperCase();
}
เราก็สามารถสร้าง class แบบนี้ได้นะครับ
package com.zengcode.springcloudfunctions;
import java.util.function.Function;
public class GetUpperCaseName implements Function<String, String> {
@Override
public String apply(String s) {
return new StringBuilder(s).toString().toUpperCase();
}
}
และก็เพิ่ม application.properties ด้วยนะครับ
spring.cloud.function.scan.packages = com.zengcode.springcloudfunctions
หรือไม่ก็ใส่ Annotation Component ไปนะครับ
รันแล้วลองเรียกใช้งานดูก็จะได้แบบนี้ครับ
ต่อไปเราจะมา Implement Spring Cloud Function ด้วย SpringBootRequestHandler<T,R> เพื่อที่ import เป็น lambda function เพื่อรันบน AWS กันดูนะครับ
แก้ pom เป็นแบบนี้เลยครับ
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.techprimers.serverless</groupId>
<artifactId>spring-cloud-function</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-function</name>
<description>Spring Boot with Spring Cloud Function Demo</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-aws</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
<version>1.0.10.RELEASE</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
</configuration>
</plugin>
</plugins>
</build>
</project>
สร้าง function interface ง่ายๆ ครับ เอาแบบ simple ๆ เนอะ
package com.zengcode.springcloudfunctions;
import org.springframework.stereotype.Component;
import java.util.function.Function;
@Component
public class Zengcode implements Function<APIGatewayProxyRequestEvent, String> {
@Override
public String apply(String s) {
return "Hello : " + s;
}
}
ต่อไปสร้าง Lambda Handler ขึ้นมาเพื่อจะไป deploy บน AWS
package com.zengcode.springcloudfunctions;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import org.springframework.stereotype.Component;
import java.util.function.Function;
@Component
public class Zengcode implements Function<APIGatewayProxyRequestEvent, String> {
@Override
public String apply(APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent) {
return "Hello -> " + apiGatewayProxyRequestEvent.getBody();
}
}
แค่นี้ก็พร้อมไป deploy บน AWS แล้วล่ะครับ build jar file กันนะครับ
ไปหน้า AWS console แล้วเลือก Lambda
เสร็จแล้ว เลือก Create Function สร้าง Function Name = springboot-cloud-function เลือก Runtime เป็น Java 8 เนอะ
พอกด Create Function เสร็จแล้วก็จะวิ่งมาหน้านี้ เราก็สามารถ upload ตัว jar file ของเราขึ้นไปได้
Edit Runtime Settings
Handler = com.zengcode.springcloudfunctions.ZengcodeLambdaHandler
ไปที่ Tab Test กดปุ่ม Test ดูครับ
ดูผลการ เทส
เป็นอันว่าเราได้ deploy service ของเรารันเป็น Lambda Function บน AWS ได้แล้ว
ต่อไปเราจะสร้าง API Gateway เพื่อ access ไปหา service ของเรา
กด Add trigger
เลือก option ต่างๆ ตามนี้เลยนะครับ
กด Add เลยครับ เราจะได้ trigger มาประมาณนี้
ลองเข้าผ่าน browser ดูก็จะได้ประมาณนี้
ต่อไปลองมาเทสกันครับ
นั่นสำเร็จ ลองไปเล่นกันดูนะครับ