Kotlin Microservices-Muster

Für Entwickler ist es kein Geheimnis, dass das Erstellen eines neuen Dienstes eine Menge Routinekonfiguration erfordert: Erstellen von Skripten, Abhängigkeiten, Tests, Docker, k8s-Deskriptoren. Da wir diese Arbeit machen, reichen die aktuellen IDE-Vorlagen nicht aus. Unter dem Strich meine Versuche, jede einzelne plattformübergreifende Schaltfläche "Gut machen" zu automatisieren, begleitet von Code, Beispielen und dem Endergebnis.





Wenn die Aussichten, Dienste mit einem Klick und anschließender automatischer Bereitstellung in Digital Ocean zu erstellen, verlockend sind, ist dieser Artikel genau das Richtige für Sie.



Beginnen wir mit der Erstellung unserer Vorlage und betrachten zunächst die Montageorganisation. Trotz der Liebe vieler zu Maven wegen seiner Einfachheit und Aussagekraft werden wir gradle verwenden, da es moderner ist und es Ihnen ermöglicht, ein Build-Skript in derselben Sprache wie das Projekt zu schreiben. Zusätzlich zum Kotlin-Plugin selbst benötigen wir noch eines:





plugins {
  kotlin("jvm") version "1.4.30"

  //     jvm
  id("org.beryx.runtime") version "1.12.1"
}
      
      



Von den Abhängigkeiten wurde das "native" Kotlin Ktor- Framework als Server-Framework ausgewählt . Zum Testen wird eine Reihe von JUnit + Hamkrest mit seinem ausdrucksstarken DSL verwendet, mit dem Sie Tests auf folgende Weise schreiben können:





assertThat("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
      
      



Alles zusammen, mit Schwerpunkt auf Java 15+





dependencies {
  implementation("com.github.ajalt.clikt:clikt:3.1.0")
  implementation("io.ktor:ktor-server-netty:1.5.1")
  testImplementation("org.junit.jupiter:junit-jupiter:5.8.0-M1")
  testImplementation("com.natpryce:hamkrest:1.8.0.1")
  testImplementation("io.mockk:mockk:1.10.6")
}

application {
  mainClass.set("AppKt")
}

tasks {
  test {
    useJUnitPlatform()
  }
  compileKotlin {
    kotlinOptions.jvmTarget = "15"
  }
}
      
      



entry-point , , ( Hamkrest).





, Kotlin codestyle - .editorsconfig:





[*.{kt, kts, java, xml, html, js}]
max_line_length = 120
indent_size = 2
continuation_indent_size = 2
      
      



, , , , , .







gradle clean test runtime
      
      



( build/image) , build/image/bin



Dockerfile, . :





# syntax = docker/dockerfile:experimental
FROM gradle:jdk15 as builder
WORKDIR /app
COPY src ./src
COPY build.gradle.kts ./build.gradle.kts
RUN --mount=type=cache,target=./.gradle gradle clean test install

FROM openjdk:15 as backend
WORKDIR /root
COPY --from=builder /app/build/install/app ./
      
      



jdk ( jvm) c jstack/jmap jdk.



Docker Compose:





version: "3.9"

services:
  backend:
    build: .
    command: bin/app
    ports:
      - "80:80"
      
      



, jdk/gradle,





docker-compose up
      
      



? Digital Ocean - . , Apps Platform ... ! Docker , , , , , . 5$ :





master , , .





Schließlich wird alles, was im Artikel beschrieben wird, in der Datei README.md der Vorlage ausführlich dokumentiert, sodass die nachfolgende Erstellung und Bereitstellung nach dem Erstellen des Projekts keine Schwierigkeiten verursachen würde.



Sie können die Vorlage verwenden, um ein vorgefertigtes Repository zu erhalten, indem Sie einfach auf die Schaltfläche "Use this template"



auf GitHub klicken :

github.com/demidko/Projekt-portable



Oder wenn Sie eine selbstausführbare JAR-Option ohne tragbares JVM benötigen:

github.com/demidko / Projekt-jar



Danach bleibt es nur noch Schreiblogik :) Wie bei jedem Ansatz ist diese Vorlage nicht ohne Mängel, daher ist es interessant, Vorschläge, Kommentare und Kritik zu hören.








All Articles