Quarkus (https://quarkus.io/) ist "SUPER SONIC SUBATOMIC JAVA"
A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.
Korrekt. Ich weiß nicht, was du sagst, aber es sieht gut aus.
Da es möglich ist, Java-Programme nativ mit der Funktion von GraalVM zu konvertieren, kann es mit der benutzerdefinierten Laufzeit von AWS Lambda kombiniert werden, um das ** Kaltstartproblem ** zu lösen, das für Java-Anwendungen charakteristisch ist, die auf AWS Lambda ausgeführt werden. Sie können es erwarten.
Ich habe es gemäß dem Verfahren auf der offiziellen Website versucht, daher werde ich das Verfahren verlassen.
QUARKUS - BUILDING A NATIVE EXECUTABLE https://quarkus.io/guides/building-native-image
QUARKUS - AMAZON LAMBDA https://quarkus.io/guides/amazon-lambda
Amazon Linux 2 von Docker Image kann nicht "tar" oder "entpacken", daher werde ich verschiedene Dinge setzen. Ich weiß nicht, ob ich alle brauche, aber ich habe so viel investiert.
yum install -y sudo shadow-utils procps tar.x86_64 gzip xz unzip witch git python3 tree
Laden Sie es von der offiziellen Website herunter und erweitern Sie es.
curl -s -L -o /tmp/graalvm-ce-java11-linux-amd64-20.1.0.tar.gz https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.1.0/graalvm-ce-java11-linux-amd64-20.1.0.tar.gz
tar zxf /tmp/graalvm-ce-java11-linux-amd64-20.1.0.tar.gz -C /opt/
ln -s /opt/graalvm-ce-java11-20.1.0 /opt/graalvm
Setzen Sie JAVA_HOME
auf GraalVM und verwenden Sie GraalVM, um Maven zu erstellen.
export GRAALVM_HOME=/opt/graalvm
export JAVA_HOME=$GRAALVM_HOME
export PATH=$GRAALVM_HOME/bin:$PATH
Installieren Sie abschließend das für Native Build erforderliche "native-image". Der Befehl lautet gu
(Graal VM Updater).
gu install native-image
Der Maven, mit dem Quarkus erstellt wurde, benötigt eine Version von 3.6.2 oder höher. Die Version, die mit yum
installiert werden kann, war alt, also habe ich sie von der offiziellen Website heruntergeladen und installiert.
curl -s -L -o /tmp/apache-maven-3.6.3-bin.tar.gz https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar zxf /tmp/apache-maven-3.6.3-bin.tar.gz -C /opt/
ln -s /opt/apache-maven-3.6.3 /opt/apache-maven
Überprüfen Sie die Version von Maven
bash-4.2# mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /opt/apache-maven
Java version: 11.0.7, vendor: GraalVM Community, runtime: /opt/graalvm-ce-java11-20.1.0
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.19.76-linuxkit", arch: "amd64", family: "unix"
bash-4.2#
Sie können sehen, dass es auf der GraalVM-JVM ausgeführt wird.
Erstellen Sie ein Projekt mit dem Befehl mvn
.
mvn archetype:generate \
-DarchetypeGroupId=io.quarkus \
-DarchetypeArtifactId=quarkus-amazon-lambda-archetype \
-DarchetypeVersion=1.6.0.Final
Nach einer Weile wird Ihnen an der Eingabeaufforderung eine Frage gestellt. Beantworten Sie sie daher. Der in [] eingeschlossene Teil ist die Benutzereingabe.
Define value for property 'groupId': [myGroup]
Define value for property 'artifactId': [myArtifact]
Define value for property 'version' 1.0-SNAPSHOT: : []
Define value for property 'package' myGroup: : [example]
Confirm properties configuration:
groupId: myGroup
artifactId: myArtifact
version: 1.0-SNAPSHOT
package: example
Y: : [Y]
Ein Verzeichnis wird mit arifactId
(myArtifact) erstellt und ein Projekt generiert.
Die Projektstruktur unmittelbar nach der Erstellung sieht folgendermaßen aus.
bash-4.2# tree myArtifact/
myArtifact/
├── build.gradle
├── gradle.properties
├── payload.json
├── pom.xml
├── settings.gradle
└── src
├── main
│ ├── java
│ │ └── example
│ │ ├── InputObject.java
│ │ ├── OutputObject.java
│ │ ├── ProcessingService.java
│ │ ├── StreamLambda.java
│ │ ├── TestLambda.java
│ │ └── UnusedLambda.java
│ └── resources
│ └── application.properties
└── test
├── java
│ └── example
│ └── LambdaHandlerTest.java
└── resources
└── application.properties
9 directories, 14 files
bash-4.2#
Der von Lambda aufgerufene Handler wird in "quarkus.lambda.handler" von "resources / application.properties" festgelegt.
resources/application.properties
quarkus.lambda.handler=test
Mit den obigen Einstellungen wird die unten stehende Klasse "test" aufgerufen.
java:main/java/example.TestLambda.java
@Named("test")
public class TestLambda implements RequestHandler<InputObject, OutputObject> {
}
Der Rest ist wie normales Lambda codiert. Neben "test" ist "stream" auch als Vorlage verfügbar.
Erstellen wir ein Bereitstellungspaket mit der Vorlage, wie sie ist.
mvn clean package -Pnative
Es benötigt viel Zeit. Ich denke, es wird mehr als 10 Minuten dauern.
Sobald das Bereitstellungspaket erfolgreich erstellt wurde, wird target / function.zip
generiert. Als ich versuchte, es zu erweitern, war der Inhalt nur "Bootstrap".
bash-4.2# unzip function.zip
Archive: function.zip
inflating: bootstrap
bash-4.2#
Eine Datei mit dem Namen "manage.sh" wird auch im "Ziel" -Verzeichnis generiert, und Sie können sie anscheinend von hier aus auf AWS bereitstellen. Ich war neu in benutzerdefinierten Laufzeiten, also habe ich es über die Verwaltungskonsole versucht. Nach dem Erstellen des Bereitstellungspakets wird auch eine Datei mit dem Namen "target / sam.native.yaml" generiert, auf die ich für den Handlernamen und die Umgebungsvariablen verwiesen habe.
Erstellen Sie eine neue Funktion. Angenommen, die Laufzeit stellt "Ihren eigenen Bootstrap bereit".
Laden Sie nach dem Erstellen der Funktion das Programm hoch. Wählen Sie im Funktionscode "ZIP-Datei hochladen" aus "Aktion" und wählen Sie "Funktion.zip".
Der Handler wird in der bereitgestellten Laufzeit nicht verwendet.
Fügen Sie der Umgebungsvariablen "DISABLE_SIGNAL_HANDLERS" hinzu und setzen Sie den Wert auf "true".
Die Einstellung ist bis zu diesem Punkt abgeschlossen. Lassen Sie uns den Test mit dem folgenden JSON als Eingabe testen.
{
"name": "Bill",
"greeting": "hello"
}
Hier ist das Operationsergebnis. Es hat sicher funktioniert.
Um das AWS SDK verwenden zu können, müssen Sie einige Einstellungen vornehmen und nicht nur pom.xml hinzufügen.
Fügen Sie Folgendes zu resources / application.properties
hinzu. (Obwohl es scheint, dass das offizielle Dokument besagt, dass es standardmäßig gültig ist)
resources/application.properties
quarkus.ssl.native=true
Zuerst brauchen wir "Quarkus-Jaxb", also werden wir es hinzufügen.
pom.xml
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jaxb</artifactId>
</dependency>
Als Nächstes werde ich die AWS SDK-Bibliothek hinzufügen.
For native image, however the URL Connection client must be preferred over the Apache HTTP Client when using synchronous mode, due to issues in the GraalVM compilation (at present).
Wenn übersetzt `Bei nativen Images sollte der URL-Verbindungsclient jedoch aufgrund eines GrailVM-Kompilierungsproblems (derzeit) Vorrang vor dem Apache-HTTP-Client haben, wenn der synchrone Modus verwendet wird. `` Korrekt. Daher lautet die Beschreibung wie folgt.
pom.xml
<properties>
<aws.sdk2.version>2.10.69</aws.sdk2.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>${aws.sdk2.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<exclusions>
<!-- exclude the apache-client and netty client -->
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
</exclusion>
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>commons-logging-jboss-logging</artifactId>
<version>1.0.0.Final</version>
</dependency>
</dependencies>
Geben Sie in diesem Beispiel für den Zugriff auf S3 beim Erstellen von S3Client explizit "UrlConnectionHttpClient" in "httpClient" an.
S3Client s3 = S3Client.builder()
.region(Region.AP_NORTHEAST_1)
.httpClient(software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.builder().build())
.build();
Das Bereitstellungspaket muss für die SSL-Kommunikation Folgendes enthalten:
Erstellen Sie zuerst das Verzeichnis "src / main / zip.native /" und erstellen Sie den "Bootstrap".
zip.native/bootstrap
#!/usr/bin/env bash
./runner -Djava.library.path=./ -Djavax.net.ssl.trustStore=./cacerts
Dann kopiere libsunec.so
und cacerts
. Diese beiden Dateien sind in GraalVM enthalten.
cp $GRAALVM_HOME/lib/libsunec.so $PROJECT_DIR/src/main/zip.native/
cp $GRAALVM_HOME/lib/security/cacerts $PROJECT_DIR/src/main/zip.native/
Das Verfahren zum Erstellen eines Bereitstellungspakets bleibt unverändert.
mvn clean package -Pnative
Wenn Sie ein Bereitstellungspaket mit aktiviertem SSL erstellen, ändert sich der Inhalt von target / function.zip
.
bash-4.2# unzip function.zip
Archive: function.zip
inflating: bootstrap
inflating: cacerts
inflating: libsunec.so
inflating: runner
bash-4.2#
Sie können sehen, dass der vorbereitete bootstrap``cacerts``libsunec.so
enthalten ist.
Überprüfen Sie hier, ob die Ergebnisse des Kaltstarts schneller als die normale Java-Laufzeit sind.
Quarkus rettet Java Lambda! ?? https://qiita.com/moritalous/items/4de31a66edac728ba088
Recommended Posts