Spring Cloud 함수를 사용한 서버리스 함수

1. 소개

이 튜토리얼에서는 Spring Cloud Function을 사용하는 방법을 배웁니다.

간단한 Spring Cloud 함수를 로컬에서 빌드하고 실행 한 다음 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 Function을 사용하면 Function , Consumer 또는 Supplier 유형의 @Bean 을 개별 메서드로 노출 할 수 있습니다 .

@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. 역방향 문자열 함수를 로컬에서 테스트

스프링 클라우드 스타터 기능 - 웹은 는 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 에서 관련 Bean을 검색 할 패키지를 지정할 수 있습니다 .

spring.cloud.function.scan.packages=com.baeldung.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. AWS의 Spring Cloud 함수

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 

다음으로 Lambda 이벤트를 처리하는 데 필요한 AWS 종속성을 추가해 보겠습니다.

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

마지막으로, maven 빌드에서 생성 된 아티팩트를 AWS Lambda에 업로드 할 예정이므로 음영 처리 된 아티팩트를 빌드해야합니다. 즉, 모든 종속성이 jar 대신 개별 클래스 파일로 폭발했습니다.

봄 부팅 얇은 레이아웃 의존성이 필요하지 않은 일부 종속성을 제외하여 이슈의 크기를 줄일하는 데 도움이 :

   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에서이 튜토리얼의 소스 코드를 확인하십시오.