[JAVA] Schreiben Sie einen reaktiven Server mit Micronaut

Micronaut Reactive HTTP Request Processing

Da Micronaut auf Netty basiert, ist es möglich, nicht blockierende E / A durchzuführen.

Reactive HTTP Request Processing

If your controller method returns a non-blocking type such as an RxJava Observable or a CompletableFuture then Micronaut will use the Event loop thread to subscribe to the result.

Wenn die Controller-Methode das RxJava Observable oder CompletableFuture zurückgibt, verwendet sie den Event-Loop-Thread, um das Controller-Ergebnis zu abonnieren.

If however you return any other type then Micronaut will execute your @Controller method in a preconfigured I/O thread pool.

Wenn ein anderer Typ zurückgegeben wird, wird der E / A-Thread-Pool verwendet.

Der Typ des Rückgabewerts von "Controller" ist wichtig.

Nun, es ist einfach, aber lass es uns benutzen.

Umgebung

Klicken Sie hier für diese Umgebung.

$ mn -V
| Micronaut Version: 1.0.4
| JVM Version: 1.8.0_191

Beispielanwendung

Erstellen Sie vorerst ein Vorlagenprojekt.

$ mn create-app hello-reactive --build maven
$ cd hello-reactive

Lassen Sie die Klasse vorerst mit der Hauptmethode

src/main/java/hello/reactive/Application.java

package hello.reactive;

import io.micronaut.runtime.Micronaut;

public class Application {

    public static void main(String[] args) {
        Micronaut.run(Application.class);
    }
}

Machen wir "Controller".

src/main/java/hello/reactive/HelloReactiveController.java

package hello.reactive;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Post;
import io.reactivex.Flowable;
import org.reactivestreams.Publisher;

@Controller("/reactive")
public class HelloReactiveController {

}

Schreiben wir den Inhalt der Methode.

Lassen Sie uns zunächst das Dokument überprüfen, um festzustellen, welcher Typ zurückgegeben werden soll.

Reactive Responses

Es scheint so.

Darüber hinaus können Sie anscheinend "CompletableFuture" oder "Reactive" für das Argument der Methode verwenden.

Erstellen wir eine "text / event-stream" -Methode, die jede Sekunde eine Nachricht zurückgibt.

    @Get(value = "/hello", produces = MediaType.TEXT_EVENT_STREAM)
    public Publisher<String> hello() {
        return Flowable
                .fromArray("Hello Reactive")
                .repeat(10)
                .delay(1, TimeUnit.SECONDS)
                .map(m -> String.format("[%s] %s", LocalDateTime.now(), m));
    }

Als ich die Abhängigkeiten des erstellten Projekts überprüft habe, habe ich RxJava gefunden und dieses verwendet.

$ ./mvnw dependency:tree

[INFO] +- io.micronaut:micronaut-runtime:jar:1.0.4:compile
[INFO] |  +- io.micronaut:micronaut-aop:jar:1.0.4:compile
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.8:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.8:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.9.8:compile
[INFO] |  +- io.reactivex.rxjava2:rxjava:jar:2.2.2:compile

Starten und überprüfen.

$ curl -i localhost:8080/reactive/hello
HTTP/1.1 200 OK
transfer-encoding: chunked
Date: Wed, 20 Feb 2019 13:00:07 GMT
transfer-encoding: chunked
content-type: text/event-stream

data: [2019-02-20T13:00:08.861] Hello Reactive

data: [2019-02-20T13:00:09.940] Hello Reactive

data: [2019-02-20T13:00:10.943] Hello Reactive

data: [2019-02-20T13:00:11.946] Hello Reactive

data: [2019-02-20T13:00:12.948] Hello Reactive

data: [2019-02-20T13:00:13.950] Hello Reactive

data: [2019-02-20T13:00:14.953] Hello Reactive

data: [2019-02-20T13:00:15.954] Hello Reactive

data: [2019-02-20T13:00:16.956] Hello Reactive

data: [2019-02-20T13:00:17.959] Hello Reactive

Irgendwie funktioniert es so.

Schreiben wir etwas, das Argumente akzeptiert.

    @Post(value = "echo", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_EVENT_STREAM)
    public Publisher<String> echo(@Body Flowable<String> text) {
        return text.map(t -> "★" + t + "★");
    }

Die Eingabe wird auch nicht gestreamt ...

$ curl -i -XPOST -H 'Content-Type: text/plain' localhost:8080/reactive/echo -d 'hello'
HTTP/1.1 200 OK
transfer-encoding: chunked
Date: Wed, 20 Feb 2019 13:01:29 GMT
transfer-encoding: chunked
content-type: text/event-stream

data: ★hello★

Ist es in Ordnung, Reactor in die Abhängigkeit zu setzen?

Vorerst konnte ich eine einfache Bestätigung geben.

Recommended Posts

Schreiben Sie einen reaktiven Server mit Micronaut
Starten Sie einen Stub-Server mit WireMock
Erstellen Sie einen Web-API-Server mit Spring Boot
Richten Sie mit Vagrant einen virtuellen Cent OS-Server ein
Versuchen Sie DI mit Micronaut
Schreiben Sie solide mit PhpStorm
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Hallo Welt mit Micronaut
Serverlose Funktion mit Micronaut
Greifen Sie mit Micronaut auf Apache Kafka zu
Erstellen Sie einen Spielplatz mit Xcode 12
So schreiben Sie ein benutzerorientiertes Programm (1)
Eine Geschichte, die bei NotSerializableException steckt
Implementieren Sie einen einfachen Web-REST-API-Server mit Spring Boot + MySQL
Erstellen Sie einen einfachen Webserver mit der Java-Standardbibliothek com.sun.net.httpserver
Eine Geschichte über die Verbindung zu einem CentOS 8-Server mit einem alten Ansible