Serverless ist sehr aufregend. Einige Leute sagten, dass Java aufgrund des sogenannten Kaltstartproblems nicht für Serverless geeignet ist, aber die Situation hat sich aufgrund des Auftretens von Mikroframes wie Micronaut, die dieses Mal eingeführt wurden, und der nativen Bilderzeugungsfunktion (Substrate VM) von Graal VM geändert. Es hat sich sehr verändert.
Was den Fluss hier betrifft, gibt es wundervolle Vorlesungsmaterialien von @_kensh und @jyukutyo bei "JJUG CCC 2019 Fall". Seien wir also gespannt, sie zu sehen.
Jetzt machen wir mit Micronaut tatsächlich serverloses Java!
Micronaut behauptet, in seiner Catch-Kopie ein "Framework für Serverless" zu sein. Wir haben auch eine Sitzung über Micronaut und Lambda bei "re: Invent 2019" abgehalten. Im Vergleich zu anderen Frameworks habe ich mich auf Serverless konzentriert und fand es persönlich sehr attraktiv, also habe ich mich für diese Zeit entschieden.
Ich denke, es gibt drei wichtige Mikro-Frameworks, die von Java verwendet werden können (JVM-Sprachen wie).
All dies sind Frameworks, auf die ich mich in Zukunft freue. Ich habe die Fangkopie usw. verglichen. Bitte beziehen Sie sich darauf.
Rahmen | Kopie fangen | Freie Übersetzung |
---|---|---|
Micronaut | A modern, JVM-based, full-stack framework for building modular, easily testable microservice and serverless applications. | Es ist ein modernes Full-Stack-Framework für Microservices und ohne Server |
Quarkus | A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM. | Kubernetes natives Framework, optimiert für OpenJDK HotSpot und GraalVM |
Helidon | Lightweigt. Fast. Crafted for Microservices. | Es ist ein leichtes, schnelles Framework für Microservices. |
https://www.githubcompare.com/
Jetzt richten wir Micronaut ein. Auf der offiziellen Website wird die Installation mit SDKMAN empfohlen. Installieren Sie sie daher gemäß diesem Verfahren.
$ curl -s https://get.sdkman.io | bash
Starten Sie das Terminal neu oder führen Sie die folgende Shell aus
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
OK, wenn der Befehl sdk übergeben wird
$ sdk version
SDKMAN 5.7.4+362
$ sdk install micronaut
OK, wenn der Befehl mn übergeben wird
$ mn -V
| Micronaut Version: 1.2.7
| JVM Version: 11.0.5
Die Projektvorlage wird über den Befehl mn erstellt. Sie können es im interaktiven Modus starten, indem Sie nur mn eingeben. Dies ist praktisch, da Sie auch Befehle ausführen können. Sie können auch den Befehlsverlauf verfolgen.
$ mn
| Starting interactive mode...
| Enter a command name to run. Use TAB for completion:
mn>
Sie können überprüfen, wie der Befehl mit mn> help
verwendet wird.
mn> help
Usage: mn [-hnvVx] [COMMAND]
Micronaut CLI command line interface for generating projects and services.
Commonly used commands are:
create-app NAME
create-cli-app NAME
create-federation NAME --services SERVICE_NAME[,SERVICE_NAME]...
create-function NAME
・ ・ ・
Dieses Mal möchte ich eine Lambda-Funktion erstellen, also verwenden wir die Funktion "create-function".
mn> create-function hello-world
| Generating Java project...
| Function created at /Users/cojohnny/micronaut/hello-world
| Initializing application. Please wait...
Verlassen Sie den interaktiven Modus einmal und überprüfen Sie das generierte Projekt.
mn> exit
$ cd hello-world/
$ tree
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── micronaut-cli.yml
├── settings.gradle
└── src
├── main
│ ├── java
│ │ └── hello
│ │ └── world
│ │ ├── Application.java
│ │ ├── HelloWorld.java
│ │ └── HelloWorldFunction.java
│ └── resources
│ ├── application.yml
│ └── logback.xml
└── test
└── java
└── hello
└── world
├── HelloWorldClient.java
└── HelloWorldFunctionTest.java
Werfen wir einen Blick auf die generierte Quelle. Die Apply-Methode von HelloWorldFunction.java ist die Lambda-Funktion. Die aktuelle Implementierung gibt nur die Eingabe-JSON-Einstellung für den Namen zurück.
HelloWorldFunction.java
package hello.world;
import io.micronaut.function.executor.FunctionInitializer;
import io.micronaut.function.FunctionBean;
import javax.inject.*;
import java.io.IOException;
import java.util.function.Function;
@FunctionBean("hello-world")
public class HelloWorldFunction extends FunctionInitializer implements Function<HelloWorld, HelloWorld> {
@Override
public HelloWorld apply(HelloWorld msg) {
return msg;
}
/**
* This main method allows running the function as a CLI application using: echo '{}' | java -jar function.jar
* where the argument to echo is the JSON to be parsed.
*/
public static void main(String...args) throws IOException {
HelloWorldFunction function = new HelloWorldFunction();
function.run(args, (context)-> function.apply(context.get(HelloWorld.class)));
}
}
Lassen Sie uns mit "gradlew" bauen.
$ ./gradlew assemble
Zwei Arten von Gläsern sind abgeschlossen.
$ tree build/libs/
build/libs/
├── hello-world-0.1-all.jar
└── hello-world-0.1.jar
Die mit "-all" am Ende des Dateinamens ist "Fat Jar", das die abhängigen Bibliotheken enthält. Laden Sie diese also auf Lambda hoch.
Laden wir die erstellte "hello-world-0.1-all.jar" auf AWS hoch. Setzen Sie im Handler "hello.world.HelloWorldFunction :: apply".
Führen wir nun die Lambda-Funktion aus. Legen Sie den JSON-Wert der Anforderung über die Schaltfläche "Test" oben in der Lambda-Konsole fest. Geben Sie für JSON Folgendes an.
{
"name": "Lambda"
}
Führen Sie "Test" aus! Es funktionierte!
Diesmal war es nur ein einfacher Prozess, aber Sie können problemlos eine Lambda-Funktion erstellen und ausführen, die ein Framework enthält. Durch die Verwendung eines leichtgewichtigen Frameworks wie Micronaut wird es möglich sein, Lambda unter Verwendung der umfangreichen Funktionen des Frameworks zu erstellen, sodass die Anwendung der serverlosen Architektur auf große Anwendungen anscheinend weiter zunehmen wird.
In Bezug auf den Kaltstart, der das größte Problem darstellte, werden die Hürden für die Anwendung in der Produktionsumgebung immer geringer, da neulich eine leistungsstarke Lösung namens "Provisioned Concurrency" vorgestellt wurde, die auf der re: Invent 2019 angekündigt wurde.
Ich freue mich sehr auf die Welt ohne Server, die 2020 voraussichtlich weiter expandieren wird! Insbesondere selbst diejenigen, die mit weniger Servern nicht allzu vertraut waren, waren an einem großen Java-System beteiligt. Ich denke, dass es zu Beginn im Voraus ist. Beginnen wir gemeinsam mit serverlosem Java!
Probieren Sie die neuesten Java-Frameworks, Helidon, Micronaut, Quarkus zusammen bis zum nativen Image aus Micronaut User Guide AWS Lambda announces Provisioned Concurrency
Recommended Posts