Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Microservicios con Kotlin y MicroProfile

Microservicios con Kotlin y MicroProfile

En esta presentación exploramos el uso de Kotlin en el contexto de Java EE y MicroProfile, mezclando la estabilidad de estandares de 20 años ampliamente aceptados por la industria, con la innovación de un lenguaje JVM de popularidad reciente.

Víctor Orozco

May 30, 2019
Tweet

Other Decks in Technology

Transcript

  1. Ense˜ nando trucos de 20 a˜ nos a Kotlin V´

    ıctor Orozco 30 de mayo de 2019 @tuxtor 1
  2. Kotlin

  3. Kotlin • Tipado est´ atico y compilado • Java inter-op

    • OO + FP • Null safety • Extensions • Operator overloading • Data classes • One line methods 2
  4. Kotlin - Datos interesantes • Effective Java - Inmutabilidad, builder,

    singleton, override, final by default, variance by generics • Elvis - Groovy • Inferencia de tipos - Scala • Inmutabilidad - Scala • Declaraci´ on de variables - Scala • Manejo de Null - Groovy • Closures y funciones - Groovy • Google 3
  5. Java - Muriendo desde 1995 • Sistemas legados (IBM) •

    Retrocompatibilidad • Release cadence (6 meses) • Innovaci´ on constante en el ecosistema (Spring Boot, Micronaut, MicroProfile, GraalVM) • Raw performance (Beam, Spark, Hadoop) • Tooling - IDE, Maven, Drivers RDBMS • JVM - (Twitter, Alibaba) • OpenJDK 4
  6. Java - Muriendo desde 1995 5

  7. Java - Muriendo desde 1995 6

  8. ¿Microservicios?

  9. Reactive applications Aplicaciones reactivas Microservicios son una (de muchas) herramienta

    para creaci´ on de aplicaciones reactivas 7
  10. Microservicios Figura 1: Microservicios 8

  11. Microservicios - Java • DIY - Jooby, Javalin, Micronaut, Spark,

    Vert.x, Helidon SE • Enterprise - Spring Boot, Microprofile (implementaciones) 9
  12. Microservicios - Kotlin • DIY - Jooby, Javalin, Micronaut, Spark,

    Vert.x, Helidon SE, Ktor • Enterprise - Spring Boot, Microprofile (implementaciones) 10
  13. 11

  14. Jakarta EE 8

  15. Jakarta EE 8 12

  16. Jakarta EE 8 - Comunidad Java EE 13

  17. Eclipse MicroProfile

  18. Eclipse MicroProfile Figura 2: Credito: Reza Rahman 14

  19. Eclipse MicroProfile 15

  20. Eclipse MicroProfile 16

  21. Eclipse MicroProfile - Implementaciones Bibliotecas • SmallRye (Red Hat) •

    Hammock • Apache Geronimo • Fujitsu Launcher JEAS - Fat Jar, Uber Jar • Dropwizard • KumuluzEE • Helidon (Oracle) • Open Liberty (IBM) • Apache Meecrowave • Thorntail (Red Hat) • Quarkus (Red Hat) • Payara Micro 17
  22. Eclipse MicroProfile - Implementaciones Micro server - Thin War •

    Payara Micro • TomEE JAX-RS Full server • Payara Application Server • JBoss Application Server / Wildfly Application Server • WebSphere Liberty (IBM) https://wiki.eclipse.org/MicroProfile/Implementation 18
  23. Eclipse MicroProfile + Kotlin + Maven

  24. Eclipse MicroProfile en Payara 5 <dependency > <groupId >org.eclipse.microprofile </

    groupId > <artifactId >microprofile </ artifactId > <type >pom </type > <version >2.0.1 </ version > <scope >provided </scope > </dependency > 19
  25. Kotlin en Maven - Dependencias <dependency > <groupId >org.jetbrains.kotlin </groupId

    > <artifactId >kotlin -stdlib -jdk8 </artifactId > <version >${ kotlin.version}</version > </dependency > 20
  26. Kotlin en Maven - maven-compiler-plugin <execution > <id >default -compile

    </id > <phase >none </phase > </execution > <execution > <id >default -testCompile </id > <phase >none </phase > </execution > <execution > <id >java -compile </id > <phase >compile </phase > <goals > <goal >compile </goal > </goals > </execution > <execution > <id >java -test -compile </id > <phase >test -compile </phase > <goals > <goal >testCompile </goal > </goals > </execution > 21
  27. Kotlin en Maven - kotlin-maven-plugin <c o m p i

    l e r P l u g i n s> <plugin>a l l −open</plugin> </c o m p i l e r P l u g i n s> . . . <option>a l l −open : annotation=j av a x . ws . r s . Path</option> <option>a l l −open : annotation=j av a x . e n t e r p r i s e . context . RequestScoped</option> <option>a l l −open : annotation=j av a x . e n t e r p r i s e . context . SessionScoped </option> <option>a l l −open : annotation=j av a x . e n t e r p r i s e . context . ApplicationScoped </option> <option>a l l −open : annotation=j av a x . e n t e r p r i s e . context . Dependent</option> <option>a l l −open : annotation=j av a x . e j b . Singleton </option> <option>a l l −open : annotation=j av a x . e j b . S t a t e f u l </option> <option>a l l −open : annotation=j av a x . e j b . S t a t e l e s s </option> 22
  28. Demo

  29. Kotlin + Jakarta EE + MicroProfile - Demo • Kotlin

    1.3 • Bibliotecas externas - SL4J, Flyway, PostgreSQL • Jakarta EE 8 - EJB, JPA • MicroProfile - CDI, JAX-RS, MicroProfile config • Testing - Arquillian, JUnit, Payara Embedded https://dzone.com/articles/ the-state-of-kotlin-for-jakarta-eemicroprofile-tra https://github.com/tuxtor/integrum-ee 23
  30. Kotlin + Jakarta EE + MicroProfile - Demo 24

  31. Kotlin + Jakarta EE + MicroProfile - Demo 25

  32. Kotlin - Entidad JPA @Entity @Table(name = "adm_phrase") @TableGenerator (...)

    data class AdmPhrase( @Id @GeneratedValue (strategy = GenerationType .TABLE , generator = " admPhraseIdGenerator ") @Column(name = "phrase_id") var phraseId:Long? = null , var author:String = "", var phrase:String = "" ) Data Clases, Nullable Types 26
  33. Kotlin - Repositorio CDI @RequestScoped class AdmPhraseRepository { @Inject private

    lateinit var em:EntityManager ... } Lateinit (nullable type) 27
  34. Kotlin - Repositorio CDI fun create(admPhrase:AdmPhrase) = em.persist(admPhrase) fun update(admPhrase:AdmPhrase)

    = em.merge(admPhrase) fun findById(phraseId: Long) = em.find(AdmPhrase :: class.java , phraseId) fun delete(admPhrase: AdmPhrase) = em.remove(admPhrase) . . . Single expression functions (One line methods) 28
  35. Kotlin - Repositorio CDI fun listAll(author: String , phrase: String

    ): List <AdmPhrase > { val query = """SELECT p FROM AdmPhrase p where p.author LIKE :author and p.phrase LIKE :phrase """ return em.createQuery(query , AdmPhrase :: class.java) .setParameter("author", " %$author %") .setParameter("phrase", " %$phrase %") .resultList } Multiline String, mutable declaration 29
  36. Kotlin - Controlador JAX-RS @Path ( "/phrases" ) @Produces (

    MediaType . APPLICATION JSON) @Consumes ( MediaType . APPLICATION JSON) c l a s s AdmPhraseController { @Inject p r i v a t e l a t e i n i t var admPhraseRepository : AdmPhraseReposit @Inject p r i v a t e l a t e i n i t var l o g g e r : Logger . . . } 30
  37. Kotlin - Controlador JAX-RS @GET fun f i n d

    A l l ( @QueryParam ( "author" ) @DefaultValue ( " %" ) author : String , @QueryParam ( "phrase" ) @DefaultValue ( " %" ) phrase : S t r i n g ) = admPhraseRepository . l i s t A l l ( author , phrase ) @GET @Path ( "/{id :[0 -9][0 -9]*}" ) fun f i n d B y I d ( @PathParam ( "id" ) i d : Long ) = admPhraseRepository . f i n d B y I d ( i d ) @PUT fun c r e a t e ( phrase : AdmPhrase ) : Response { admPhraseRepository . c r e a t e ( phrase ) return Response . ok ( ) . b u i l d () } 31
  38. Kotlin - Controlador JAX-RS @POST @Path ( "/{id :[0 -9][0

    -9]*}" ) fun update ( @PathParam ( "id" ) i d : Long ? , phrase : AdmPhrase ) : Response { i f ( i d != phrase . p h r a s e I d ) return Response . s t a t u s ( Response . Status .NOT FOUND) . v a l updatedEntity = admPhraseRepository . update ( phrase ) return Response . ok ( updatedEntity ) . b u i l d ( ) } @DELETE @Path ( "/{id :[0 -9][0 -9]*}" ) fun d e l e t e ( @PathParam ( "id" ) i d : Long ) : Response { v a l updatedEntity = admPhraseRepository . f i n d B y I d ( i d ) ? : return Response . s t a t u s ( Response . Status .NOT FOUND) . b u i l d () admPhraseRepository . d e l e t e ( updatedEntity ) return Response . ok ( ) . b u i l d () } Elvis operator as expression 32
  39. 12 factores cloud native (Heroku) Microprofile • Config • Backing

    service • Disposability Cloud • Codebase (Git-Flow) • Dependencies (Maven) • Build, Release, Run • Processes (Pipelines) • Port binding • Concurrency (Docker - k8s) • Dev / Prod parity • Logs • Admin process 33
  40. Oracle Cloud <groupId>i o . f a b r i

    c 8</ groupId> <a r t i f a c t I d>docker−maven−p l u g i n</ a r t i f a c t I d> <version>0 . 3 0 . 0</version> . . . <image> <name>i a d . o c i r . i o / t u x t o r / m i c r o p r o f i l e / integrum−ee</name> <b u i l d> <d o c k e r F i l e>${ p r o j e c t . b a s e d i r }/ D o c k e r f i l e</ d o c k e r F </ b u i l d> </image> 34
  41. Oracle Cloud 35

  42. Oracle Cloud 36

  43. Oracle Cloud 37

  44. Oracle Cloud 38

  45. Kotlin Ventajas • C´ odigo m´ as conciso • Soporte

    real Java inter-op • Aprovechar a personal Android para backend • Un lenguaje para dominar todo Desventajas • IntelliJ IDEA Ultimate (monolitos) • Requiere mejores programadores (m´ as convenciones) • Tiempo de compilaci´ on • No es una buena idea utilizar corutinas en entornos con managed threads 39
  46. V´ ıctor Orozco • [email protected] • @tuxtor • http://www.nabenik.com This

    work is licensed under a Creative Commons Attribution-ShareAlike 3.0. 40