Ratpack: the core for your microservices for jdk.io 2016

Preview:

Citation preview

01

About me02

Andrey AdamovichJava/Groovy developer

DevOps guy, automation junkie

Co­author of Groovy 2 Cookbook

Co­organizer of @latcraft and @devternity

••••

03

Contact detailsE­mail: andrey@aestasit.com

Linkedin: http://www.linkedin.com/in/andreyadamovich

Lanyrd: http://lanyrd.com/profile/andrey­adamovich

GitHub: https://github.com/aadamovich

SO: http://stackoverflow.com/users/162792/andrey­adamovich

Twitter: @codingandrey, @aestasit

••••••

04

Let's start!05

MicroservicesIn short, the microservice architectural style is an approach to

developing a single application as a suite of small services, each

running in its own process and communicating with lightweight

mechanisms, often an HTTP resource API.

James Lewis & Martin Fowler

“06

Quick Start!07

0. PrerequisitesInstall Java 8+

Install Groovy 2.4+

(Optionally) install Gradle 2+ (or just use Gradle Wrapper)

•••

08

1. Type in...@Grab("io.ratpack:ratpack‐groovy:1.4.1")

@Grab('org.slf4j:slf4j‐simple:1.7.21')

import static ratpack.groovy.Groovy.ratpack

01.

02.

03.

09

1. Continue...ratpack {

  handlers {

    get {

      response.send "Time on jdk.io is " + 

         new Date().toString() 

    }

  }

}

01.

02.

03.

04.

05.

06.

07.

08.

10

2. Save as...ratpack.groovy01.

11

3. Start!groovy ratpack.groovy 01.

12

4. Enable some more loggingJAVA_OPTS=‐Dgroovy.grape.report.downloads=true01.

13

Ratpack facts

14

Ratpack factsRatpack is a toolset that combines several Java libraries that allows

efficiently developing performant and testable HTTP applications.

15

Ratpack factsInspired by Sinatra framework

Requires Java 8

Does not require a EE container

Does not implement Servlet API

Goes under Apache 2.0 License

•••••

16

Ratpack factsCore is very minimal and is only based on few abstractions (Handler,

Registry, Service)

Many additional modules exist and it's easily to develop new ones

Modules are injected through DI (there is no specialized plugin

system)

Out­of­the­box integration with Guice and Spring

••

17

Stack

18

It's alive andvery active!19

Release history0.5.2 ­ Jul 21, 2012

0.6.1 ­ Nov 29, 2012

0.9.0 ­ Jan 02, 2014

0.9.1 ­ Feb 01, 2014

0.9.2 ­ Mar 01, 2014

0.9.3 ­ Apr 01, 2014

0.9.4 ­ May 01, 2014

0.9.5 ­ Jun 01, 2014

0.9.6 ­ Jul 01, 2014

••••••••• 20

Release history0.9.7 ­ Aug 01, 2014

0.9.8 ­ Sep 01, 2014

0.9.9 ­ Oct 01, 2014

0.9.10 ­ Nov 02, 2014

0.9.11 ­ Dec 01, 2014

0.9.12 ­ Jan 01, 2014

0.9.13 ­ Feb 01, 2015

0.9.14 ­ Mar 01, 2015

••••••••

21

Release history0.9.15 ­ Apr 01, 2015

0.9.16 ­ May 02, 2015

0.9.17 ­ June 02, 2015

0.9.18 ­ July 02, 2015

0.9.19 ­ Aug 02, 2015

1.0.0 ­ Sep 15, 2015

1.1.1 ­ Oct 21, 2015

1.2.0 ­ Feb 17, 2016

••••••••

22

Release history1.3.0 ­ Apr 20, 2016

1.3.1 ­ Apr 23, 2016

1.3.2 ­ Apr 27, 2016

1.3.3 ­ Apr 28, 2016

1.4.0 ­ Aug 09, 2016

1.4.1 ­ Aug 23, 2016

••••••

23

Commit history

24

Statistics

25

Team

26

Top contributor

27

Modules ICommon: config, session

Reactive: rx, remote

Authentication: pac4j

Build/Packaging: gradle

Database: h2, hikari

•••••

28

Modules IIDependency Injection: guice, spring­boot

JSON: jackson

Language support: groovy, kotlin

Reliability: hystrix, dropwizard­metrics, newrelic

Templates: handlebars, thymeleaf, groovy

Testing: test, groovy­test

••••••

29

Java + Groovy = ?Has similar performance to Java when using  invokeDynamic

Supports static compilation and compile­time type checking

Useful for defining rich DSLs with type checking via  Closure

parameters and  @DelegatesTo  annotations

•••

30

IDE supportIntelliJ IDEA recommended

Eclipse has poor support for Groovy, @DelegatesTo and functional

interfaces

NetBeans ­ haven't even tried

••

31

Diving deeper32

HandlersAll request processing is done via composition of  Handler s.

Each  Handler  in the  Chain  is asked to respond to a  Request  until

one actually does.

••

33

A handler canSend a  Response  based on the  Request .

Delegate to the next  Handler  in the  Chain .

Insert  Handler s into the  Chain  and immediately delegate to them.

Change  Context , which represents the current state of the

Request  processing.

••••

34

Flow

35

Let's writesome code!36

Demo: Dateserver

37

Paths and parametersprefix('api') {

  get('user/:id') {

    render getUser(pathTokens.id)

  }

  get('friends') {

    render getFriendList()

  }

}

01.

02.

03.

04.

05.

06.

07.

08.

38

Verbspath('user') {

  byMethod {

    get { ... }

    post { ... }

    put { ... }

    delete { ... }

  }

}

01.

02.

03.

04.

05.

06.

07.

08.

39

Content typespath('user') {

  byContent {

    json { ... }

    xml { ... }

    type("application/vnd.app.org+json;v=1") {

      ...

    }

  }

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 40

Static contentfiles { 

  dir "public" 

  file "index.html"

}

01.

02.

03.

04.

41

Templates (ala JSP/GSP)Handler code:

get ("admin") {

  render groovyTemplate('admin.html', result: "")

}

01.

02.

03.

42

Templates (ala JSP/GSP)admin.html :

<% if (model?.result) { %>

  <% model.result.each { %>

    <li>${it}</li>

  <% } %>

<% } %>

01.

02.

03.

04.

05.

43

Templates (Groovy­way)Handler code:

render groovyMarkupTemplate(

  "update.gtpl", 

  "title: "Update Book",

  ...

  "price": book.price

)

01.

02.

03.

04.

05.

06.

44

Templates (Groovy­way)update.gtpl :

layout 'layout.gtpl',

title: title,

msg: msg,

bodyContents: contents {

  h1('Update Book')

  includeGroovy '_book_form.gtpl'

}

01.

02.

03.

04.

05.

06.

07.

45

TestingTest handler implementations with  RequestFixture

Functional testing with  ApplicationUnderTest  and

TestHttpClient

Nobody canceled testing with Geb (Selenium)!

••

46

Demo: GebTest

47

Let's buildservices!

48

Service setup

49

Quick startlazybones create ratpack <project>

gradlew idea

gradlew run ‐‐continuous

•••

50

Demo:Lazybones +

IDEA51

Demo:Services

52

Operational aspectsCan't even make WAR! Very peaceful!

Publish JAR/TAR/ZIP in to artifact repository

Or use os­package plugin to create DEB/RPM package

Integrate with provisioning/configuration management tools

Consider monitoring/metrics

•••••

53

Puppet: defined typedefine service::booking(

  $deployment_port,

  $deployment_host,

  $enabled                = true,

  $development_mode       = false,

  $revision               = latest,

) {

  ...

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 54

Puppet: fetchfile { "/services/booking/environments/${name}":

  ensure      => directory

}  

vcsrepo { "/services/booking/environments/${name}":

  ensure      => $revision,

  provider    => git,

  source      => 'https://github.com/jdk.io/booking.git',

  notify      => Exec["build booking ${name} api"]

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 55

Puppet: auto­buildexec { "build garagetravel ${name} api":

  cwd         => "/services/booking/environments/${name}",

  refreshonly => true,

  command     => 

    "/services/booking/../${name}/gradlew installApp",

  notify      => Service["booking_${name}"]

}

01.

02.

03.

04.

05.

06.

07.

56

Puppet: servicefile { "booking ${name} service":

  path    => "/etc/init/booking_${name}.conf",

  content => template('booking/service.conf.erb'),

  notify  => Service["booking_${name}"]

}  

01.

02.

03.

04.

05.

57

Puppet: serviceservice { "booking_${name}":

  ensure   => $enabled ? 

    { true => "running", 

      default => "stopped" },

  enable   => $enabled,

  provider => upstart,

}

01.

02.

03.

04.

05.

06.

07.

58

Combining optionsChef/Ansible

Etcd/Consul/Eureka

Docker

•••

59

MonitoringHystrix

Dropwizard Metrics••

60

What's next?

61

Going further

62

Demo:ExamplesBooks

63

Summary64

Take­awaysRatpack can be used to quickly prototype web APIs and applications.

Learning curve is really small, you can start in seconds.

It can be used to create high performance web applications due to

non­blocking architecture.

Ratpack does not lock you in the way you implement data access,

session handling, logging, etc.

Ratpack has vibrant community and actively evolving code base.

•••

65

Reading materialhttp://ratpack.io

http://www.slideshare.net/search/slideshow?q=ratpack

https://github.com/ratpack

http://alvarosanchez.github.io/ratpack­101/

••••

66

Book

67

Contribute!68

Questions?69

Thank you!70

Devternity1­2 of December, 2016, Riga

Software Excellence Conference

4 tracks, 30+ speakers, 6 workshops

http://devternity.com

••••

71

Recommended