[JAVA] Einführung in PlayFramework 2.7 ① Übersicht

Einführung

Von nun an planen wir, uns mit Mikrodiensten zu befassen, die rund um Play Framework (im Folgenden als Play bezeichnet) erstellt wurden. Das Spiel hat jedes Mal, wenn die Version auf 0,1 steigt, eine ganze Reihe von Änderungen. Um einige in der vorherigen Version implementierte Dienste auf die neueste Version zu aktualisieren, werde ich im Moment die neueste Version von Play Framework 2.7 (erneut) einführen. Ich verwende selten Version 2.6, daher werde ich bei Bedarf mit den Kenntnissen von Version 2.6 Schritt halten.

Für diejenigen, die play2.7 starten möchten.

Play macht es einfach, ein Projekt basierend auf sbt zu starten (Befehl seed template unten).

Spielen Sie die neueste Versionsvorlage für Java:

sbt new playframework/play-java-seed.g8

Spielen Sie die neueste Versionsvorlage für Scala:

sbt new playframework/play-scala-seed.g8

Das erstmalige Starten dauert jedoch lange, da die abhängigen Bibliotheken aus jedem Repository gesammelt werden. Wenn Sie Play ausprobieren, ist es eine gute Idee, einen der oben genannten Befehle zu drücken, dann sbt auszuführen und dann die erforderlichen Informationen zu sammeln.

In meinem Fall dauerte es ungefähr 6 Minuten, bis Play im Entwicklermodus gestartet wurde, und ungefähr 30 Sekunden, bis der Browser auf Port 9000 zugegriffen, die erste Kompilierung abgeschlossen und eine Antwort erhalten hatte. Je nach Leitungszustand dauert es länger.

Was ist neu in Version 2.7 von Play?

Lesen Sie "Play 2.7.0 ist da!" im Play Framework-Blog. Dort werden acht neue Funktionen von Play 2.7 aufgelistet. Unten mein Eindruck:

gRPC-Unterstützung

Ein auf akka-grpc basierendes play-grpc wurde zur Verfügung gestellt. Aus der Perspektive der Entwicklung von Microservices bin ich glücklich (obwohl es derzeit als Inkubation behandelt wird). Wenn grpc standardmäßig unterstützt wird, ist die Integration mit anderen Diensten mithilfe von Standardschemasprachen wie Protokollpuffern einfacher. Wenn Sie keine Protokollpuffer usw. verwendet haben, erhalten Sie ein Bild der folgenden Schemasprache.

Die Zeiten, in denen wir nur eine einzige Web-App schreiben konnten, die eine Verbindung zu einer einzelnen RDB herstellt, sind vorbei. Die Daten können hier und da in verschiedenen Speichertechnologien gespeichert werden, das Backend kann anstelle eines einzelnen Dienstes aufgeteilt werden, und die Clients können Web-, iOS- und Android-Versionen in jeweils einer anderen Sprache haben. Es ist in implementiert und die API muss auch externen Entwicklern zugänglich gemacht werden. Daher ist es notwendig, die Daten überall zu serialisieren und zu deserialisieren und sicherzustellen, dass es an beiden Enden der Kommunikation keine Inkonsistenzen bei der Interpretation gibt. Es ist jedoch schmerzhaft, zum Zweck des Abgleichs mit Menschen in natürlicher Sprache zu sprechen. Daher möchten wir mit maschinenverarbeitbarem Code sprechen. Daher möchte ich richtig definieren, welche Art von Daten im deklarativen DSL enthalten sein werden. Es ist also eine Schemasprache. (Ausstellung [Warum die Schemasprache wichtig ist](https://qiita.com/yugui/items/160737021d25d761b353#%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E % E8% A8% 80% E8% AA% 9E% E3% 81% AF% E3% 81% AA% E3% 81% 9C% E9% 87% 8D% E8% A6% 81% E3% 81% AA% E3 % 81% AE% E3% 81% 8B))

Um sich ein Bild vom Code zu machen, schauen wir uns das Hello World Grpc-Beispiel in Play2.7 Grpc an.

Hello World grpc Schema Definition durch Protokollpuffer:

//(Auszug)
package helloworld;

service GreeterService {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

Implementierungsbeispiel für Greeter Service von Play2.7.

GreeterServiceImpl.scala


/*
 * Copyright (C) 2018-2019 Lightbend Inc. <https://www.lightbend.com>
 */
package example.myapp.helloworld.grpc.helloworld

import akka.stream.Materializer
import javax.inject.Inject
import javax.inject.Singleton

import scala.concurrent.Future

/** User implementation, with support for dependency injection etc */
@Singleton
class GreeterServiceImpl @Inject()(implicit mat: Materializer) extends AbstractGreeterServiceRouter(mat) {
  //Erhalten Sie Hallo Anfrage und Zukunft[HelloReply]SayHello-Methode, die zurückgibt
  override def sayHello(in: HelloRequest): Future[HelloReply] =
    Future.successful(HelloReply(s"Hello, ${in.name}!")) 
}
// #service-impl

Wenn Sie akka noch nie verwendet haben, gibt es einige Begriffe, die Sie nicht sehen können. Schauen wir uns jedoch nur die sayHello-Methode an. Da die Antwort der Methode Future [Hello Reply] lautet, ist ersichtlich, dass die Dienste asynchron ausgetauscht werden. Dieses Beispiel basiert derzeit auf Scala, Java kann jedoch auch in Future-basiert geschrieben werden. Die obige sayHello-Methode scheint in Java so geschrieben werden zu können.

@Override
  public CompletionStage<HelloReply> sayHello(HelloRequest in) {
    String message = String.format("Hello, %s!", in.getName());
    HelloReply reply = HelloReply.newBuilder().setMessage(message).build();
    return CompletableFuture.completedFuture(reply);
  }

Beispielcode und Dokumentation für grpc werden unten entwickelt. https://developer.lightbend.com/docs/play-grpc https://github.com/playframework/play-grpc

Es wäre großartig, wenn der grpc von play2.7 der Auslöser dafür sein könnte, dass wichtige JVM-basierte Frameworks (Spring-based) über grpc miteinander verbunden werden. Wenn der Service wächst, ist es möglicherweise einfacher, die Teile, die von der Garbage Collection stark betroffen sind, durch C ++ oder Go zu ersetzen.

Koordiniertes Herunterfahren mit Akka

Es scheint, dass Akka Coordinated Shutdown, das aus Play 2.6 eingeführt wurde, in 2.7 in den Play-Lebenszyklus aufgenommen wurde. Dies ist eigentlich Play 2.7, und Sie werden es zu schätzen wissen, wenn Sie einen Dienst erstellen, der jederzeit nach oben und unten skaliert werden kann.

Neue Cache-Implementierung von Caffeine (Play Cache API)

Play Cache APIs basieren jetzt auf Java 8-basiertem Koffein. Koffein scheint in Spring Boot und so weiter verwendet zu werden. Diese PAI kann die Notwendigkeit verringern, Redis usw. extern zu starten und zwischenzuspeichern.

Unterstützung für "Erweiterte Richtlinien zur Inhaltssicherheit"

Ich kann keine Kommentare abgeben, da ich "Content Security Policy (https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)" nicht studiert habe, aber ich möchte diese Gelegenheit nutzen, um loszulegen.

Referenz Inhaltsrichtlinie (CSP)

Verbesserte Formular-API in Java und direkter Zugriff auf "Anforderungsdaten"

Dies scheint in Java nett zu sein. Senden Sie einfach Formulare, vereinfachen Sie den Code, wenn Sie zu HTTP-Anforderungen zurückkehren (damit Sie ohne HTTP.Context schreiben können) usw.

Auf der anderen Seite funktioniert der vorherige Schreibstil im Spiel oft nicht bei jedem Upgrade. Seien Sie also vorsichtig, wenn Sie den Schreibstil ändern. Die zweite Hälfte der Release-Highlights ist aufgelistet. https://www.playframework.com/documentation/2.7.x/Highlights27

Erneuerung der in der REST-API verwendeten HTTP-Fehlerbehandlungsroutinen

Sie werden es zu schätzen wissen, wenn Sie eine REST-API in Play 2.7 schreiben. Persönlich möchte ich, dass Play graphql aktiv unterstützt, das die asynchrone Basis nutzt.

Zukünftige Einführung: Entdecken Sie die Möglichkeiten von grpc + Play.

Ich möchte ein Beispiel für einen Mikrodienst schreiben, der grpc als Kleber (Konnektor) in Play 2.7 mit dem Ziel der Goldenen Woche verwendet.

Recommended Posts

Einführung in PlayFramework 2.7 ① Übersicht
Einführung in Ruby 2
Einführung in web3j
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in EHRbase 1-Übersicht und Umgebungswartung
Einführung in JAR-Dateien
Einführung in Ratpack (8) -Session
Einführung in die Bitarithmetik
Einführung in Ratpack (9) - Thymeleaf
Einführung in das Android-Layout
Einführung in Entwurfsmuster (Einführung)
Einführung in die praktische Programmierung
Einführung in den Befehl javadoc
Einführung in den Befehl jar
Einführung in Ratpack (2) -Architektur
Einführung in den Lambda-Stil
Einführung in den Java-Befehl
Einführung in die Keycloak-Entwicklung
Einführung in den Befehl javac
Einführung in Entwurfsmuster (Builder)
Einführung in die Android App-Entwicklung
Einführung in Ratpack (5) --Json & Registry
Einführung in Metabase ~ Umgebungskonstruktion ~
Einführung in Ratpack (7) - Guice & Spring
Einführung in Entwurfsmuster (Composite)
Einführung in Micronaut 2 ~ Unit Test ~
Einführung in JUnit (Studiennotiz)
Einführung in Spring Boot ~ ~ DI ~
Einführung in Designmuster (Fliegengewicht)
[Java] Einführung in den Lambda-Ausdruck
Einführung in Spring Boot ② ~ AOP ~
Einführung in Apache Beam (2) ~ ParDo ~
Einführung in die EHRbase 2-REST-API
Einführung in Entwurfsmuster Prototyp
[Java] Einführung in die Stream-API
Einführung in Entwurfsmuster (Iterator)
Einführung in Spring Boot Teil 1
Einführung in Ratpack (1) - Was ist Ratpack?
Einführung in Entwurfsmuster (Strategie)
[Einführung in Janken (ähnliche) Spiele] Java
[Einführung in Java] Über Lambda-Ausdrücke
Einführung in Algorithmen mit Java-kumulativer Summe
Einführung in die funktionale Programmierung (Java, Javascript)
Einführung in Algorithmen mit der Java-Shakutori-Methode
Einführung in Entwurfsmuster (Factory-Methode)
Einführung in Linux Container / Docker (Teil 2)
Einführung in Design Patterns (Abstract Factory)