Patrón de microservicios de Kotlin

No es ningún secreto para los desarrolladores que la creación de un nuevo servicio implica una gran cantidad de configuración de rutina: scripts de compilación, dependencias, pruebas, docker, descriptores k8s. Dado que estamos haciendo este trabajo, las plantillas IDE actuales no son suficientes. Bajo el corte, mis intentos de automatizar cada botón de "hacer bien" multiplataforma acompañado de código, ejemplos y el resultado final.





Si las perspectivas de crear servicios con un solo clic y la implementación automática posterior en Digital Ocean suenan tentadoras, este artículo es para usted.



Comencemos a crear nuestra plantilla y, en primer lugar, consideremos la organización del montaje. A pesar del amor de muchos por maven por su simplicidad y declaratividad, usaremos gradle, porque es más moderno y le permite escribir un script de compilación en el mismo idioma que el proyecto. Además del complemento de Kotlin en sí, necesitamos uno más:





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

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



De las dependencias, se eligió el marco "nativo" Kotlin Ktor como marco del servidor . Para las pruebas, se utiliza un montón de JUnit + Hamkrest con su expresivo DSL, que le permite escribir pruebas de esta manera:





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



Poniéndolo todo junto, centrándote en 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 , , .





Finalmente, todo lo que se describe en el artículo está documentado en detalle en el archivo README.md de la plantilla, de modo que después de crear el proyecto, la posterior construcción e implementación no causaría dificultades.



Puede usar la plantilla para obtener un repositorio listo para usar simplemente haciendo clic en el botón "Use this template"



en GitHub:

github.com/demidko/Projekt-portable



O, si necesita una opción de jar

autoejecutable sin un jvm portátil: github.com/demidko / Projekt-jar



Después de eso, solo queda escribir lógica :) Como cualquier enfoque, esta plantilla no está exenta de fallas, por lo que es interesante escuchar sugerencias, comentarios y críticas.








All Articles