Best Practices für Java

Ihre Anwendungen immer auf dem neuesten Stand zu halten, ist wichtig und schwierig. Dieses Dokument enthält einige grundlegende Schritte für Java-Entwickler zum Einstieg in DevOps-Verfahren. Es handelt sich nicht um eine vollständige Liste. Die meisten dieser Ideen stammen aus den DORA DevOps-Forschungs- und -Bewertungsstudien, die einen umfassenden Überblick über Best Practices bieten. Andere Quellen:Accelerate: Science of Lean Software und DevOps: Building and Scaling High Performance Technology vonNicole Forsgren PhD, Jez Humble undGeni, und Softwareentwicklung bei Google Ausgewählt vonTitus-Winter , Tom Manshreck undHyrum Wright auf.

Bevor Sie diese Seite lesen, empfehlen wir Ihnen, den Artikel Java-Entwicklungsumgebung einrichten zu lesen.

Die Anforderungen jeder Entwicklungsorganisation sind einzigartig. Ein einfaches System kann jedoch mit einem der folgenden Softwarepakete aufgebaut werden:

Beispiel-Stack-Stack 1 Beispiel-Stack-Stack 2
  • Cloud Source Repositories, GitHub oder Bitbucket für Quellcode
  • Whitesource RenovateBot, um Artefakte und Bibliotheken auf dem neuesten Stand zu halten.
  • Cloud Build für Einheiten-/Vortesttests
  • Cloud Build für Integrationstests
  • Cloud Build für die Bereitstellung
  • GitHub für Quellcode
  • GitHub Dependabot, um Artefakte und Bibliotheken auf dem neuesten Stand zu halten.
  • GitHub-Aktionen für Vorabtests
  • GitHub-Aktionen für Integrationstests
  • GitHub-Aktionen für die Bereitstellung

Mit einem einfachen System, das mit diesen Komponenten erstellt wurde, können Sie die Qualität und die Lebensdauer verbessern. Außerdem können Sie Ihren Code mit den neuesten Fehlerkorrekturen und Sicherheitsupdates immer auf dem neuesten Stand halten.

Versionsverwaltung

Forschung (Seite 17 Seite 14 Seite 31 Seite 60 ) ermittelt hat, dassVersionsverwaltung für Quellcode zusammen mit Automatisierung und Tests prognostiziert eine höhere Qualität und viele weitere Vorteile.

GitHub, GitLab und Bitbucket eignen sich ebenfalls gut für Ihren Quellcode.

Automatisierte Tests

Kontinuierliche Tests können für die erfolgreiche Nutzung dieser Methoden entscheidend sein. Weitere Best Practices zum Testen von Best Practices finden Sie im SRE-Kapitel zum Testen von Reliability und im Google-Testblog.

Java-Entwickler sind hauptsächlich von automatisierten Einheitentests und Integrationstests betroffen. JUnit , Mit Frühling testen , Apache Maven Surefire undJava-Tests für Gradle sind nützliche Ressourcen für Java-Entwickler.

Kontinuierliche Integration und Bereitstellung automatisieren

Continuous Integration und Deployment-Automatisierung unterstützen moderne DevOps-Jobs. Erstellen, testen und bereitstellen.

  • Symbol: Cloud Build [Kurzanleitungen ] [Java-spezifisch ] [Bereitstellung ] [Trigger] bietet kostenlos (120 Build-Minuten / Tag) oder ein kostengünstiges, benutzerfreundliches Build-System, das sich einfach für die meisten Jobs anpassen lässt.
  • Tekton ist ein Open-Source-Projekt, mit dem Sie die Cloud Build-Ideen einfach an Ihre Systeme anpassen können.
  • Spinnaker ist eine Open-Source-Multi-Cloud-Plattform für Continuous Delivery, mit der Sie Softwareänderungen schnell und zuverlässig veröffentlichen können. Es hilft Ihnen, den Prozess der Freigabe und Rollback von komplexen Softwaresystemen zu vereinfachen.
  • GitHub von Actions ist eine Drittanbieterlösung, mit der Sie Tests einfach einrichten und auf GitHub ausführen können.
  • Es gibt noch viele weitere Lösungen wie GitLab, Circle CI und Travis CI.

Cloud-Clientbibliotheken

Es gibt viele Möglichkeiten, Google-Dienste zu nutzen. Wir empfehlen jedoch, der Anleitung auf der Seite Cloud-Clientbibliotheken zu folgen. Bei Java kann mithilfe von Libraries-BOM kompatible Versionen jedes Artefakts verwendet werden.

Wenn Sie Ihre eigenen Versionen von Clientbibliotheken auswählen, ist es möglich, dass ein inkompatibles Artefakt ausgewählt wird. Das wird als Diamond-Abhängigkeitsproblem bezeichnet. Falls Sie trotzdem einzelne Bibliotheken auswählen müssen, können Sie sie einzeln aktualisieren und testen, ob das Update einen Fehler verursacht hat. Die neuesten Versionen sind immer auf dieser Seite aufgeführt oder Sie können mit Maven-Central suchen.

Abhängigkeiten auf dem neuesten Stand halten

Zum Schutz vor böswilligen Nutzern ist es wichtig, dass Sie Ihre Abhängigkeiten auf dem neuesten Stand halten. Es gibt zahlreiche Drittanbieter-Tools, die Ihnen dabei helfen:

Mit diesen Tools können Sie bei Bedarf ihre Abhängigkeiten auf dem neuesten Stand halten. Wenn Sie automatisierte Tests und die Continuous Integration / Continuous Deployment kombinieren, wird der Ablauf folgendermaßen:

  • Die Abhängigkeit von der Abhängigkeit bietet eine Änderung der Versionsverwaltung.
  • Das kontinuierliche Build-System erstellt und testet die Änderung.
  • Ein Mitarbeiter überprüft das Angebot und akzeptiert die Änderung, wenn möglich, zusammen mit anderen Änderungen.
  • Nachdem Änderungen akzeptiert wurden, wird ein Angebot an das Continuous Delivery-System gesendet, um den Code für die Produktion freizugeben. (Ihr benutzerdefinierter Prozess folgt ebenfalls.)

Unterstützte Java-Laufzeitumgebung (JRE) verwenden

Die JRE, ein Teil des Java Development Kits, wird auf Ihrem Betriebssystem installiert und bietet die Software und Ressourcen, die für das Ausführen einer Java-Anwendung erforderlich sind. Die meisten Nutzer bevorzugen die neueste LTS-Version für die Produktion, damit sie Zugriff auf Updates, Sicherheits- und Fehlerkorrekturen haben. Es ist normalerweise möglich, auf eine spätere JRE zu aktualisieren, auch wenn Ihr Code auf ein früheres JDK kompiliert wurde.

Wenn Sie mit mehreren JDK-Versionen arbeiten, können Sie mit SDKMAN! verschiedene JDK-Versionen verwenden und verwalten.

Container verwenden (Google Kubernetes Engine, Cloud Run, Anthos-Cluster)

Wenn Sie Docker-Container mit RenovateBot oder DependaBot verwenden, schlägt der Bot regelmäßig Aktualisierungen für Ihre JRE und Ihr JDK vor. Sie sollten das JDK und die JRE auf derselben Version belassen.

Wir empfehlen die Verwendung von Jib, um Ihre Java-Anwendungen in den meisten Fällen zu containerisieren.

Wenn Sie Ihr Dockerfile manuell aktualisieren, ändern Sie einfach die JRE, um sie zu aktualisieren und neu zu erstellen.

Compute Engine verwenden

Das ist meist sehr anwendungsspezifisch. Wir empfehlen die Verwendung eines Startskripts. Aktualisieren Sie das Skript, um ein Upgrade durchzuführen.

Flexible App Engine-Umgebung

Unterstützt nur Java 8

App Engine Standard

Weitere Informationen finden Sie unter App Engine-Anwendungen von Java 8 zu Java 11 migrieren.

LTS-Version des Java Development Kits verwenden

Das JDK besteht aus einer Reihe von Tools zur Entwicklung von Java-Anwendungen. Neue Sprachfunktionen sind an ein bestimmtes JDK gebunden. Wir empfehlen Ihnen, Ihre Nutzung auf einem JDK mit langfristiger Unterstützung (LTS, langfristiger Support) anzupinnen und ein Upgrade auf die nächste LTS-Version durchzuführen, wenn dies für Ihre Anwendung geeignet ist. Wir empfehlen, die neueste Nebenversion des angepinnten großen LTS-Release zu verwenden.

Die meisten Nutzer möchten JDK und JRE synchronisieren. Manchmal ist dies nicht möglich, beispielsweise wenn das JDK nicht mehr unterstützt wird. Sie müssen dann mit einem späteren JDK kompilieren und auf einer früheren JRE ausführen.

Mit Maven:

Lege die Sprachebene fest, in der du codieren möchtest, und das Ziel-JRE. Aktualisieren Sie die Datei pom.xml so (für Java 8): xml <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>

Um ein Update auf Java 11 durchzuführen, ändern Sie es in:

    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

Wenn Sie Gradle verwenden, aktualisieren Sie die Datei build.gradle für Java 8 so:

compileJava {
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
}

Für Java 11:

compileJava {
  sourceCompatibility = 11
  targetCompatibility = 11
}

Beachten Sie, dass für Java 8 und frühere Versionen das Präfix 1. (1.7 für Java 7, 1.8 für Java 8) vorhanden war, das nach Java 8 verworfen wurde.