Top Banner
© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Inside spring.io: a Production Spring Reference Application Brian Clozel - @brianclozel
69

Inside spring.io: a production Spring reference application

Jun 14, 2015

Download

Software

Spring IO

Speaker: Brian Clozel
Core Spring Track

Come take a look inside the newly open-sourced reference application that powers the http://spring.io site, including:

Idiomatic use of Spring Boot
Taking advantage of Spring Framework 4 features
A tour of our JavaScript frontend using cujoJS's curl, Bower and Gulp for a clean and modular design
Zero-downtime deployment to Cloud Foundry using blue/green deployments
And more, with plenty of time for Q&A
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Inside spring.io: a production Spring reference application

© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Inside spring.io: a Production Spring Reference Application

Brian Clozel - @brianclozel

Page 2: Inside spring.io: a production Spring reference application

Chris Beams at SpringOne 2013

Page 3: Inside spring.io: a production Spring reference application

Carl Sagan smiling at you

Page 4: Inside spring.io: a production Spring reference application

Now, seizing planets

Page 5: Inside spring.io: a production Spring reference application

And me!

Page 6: Inside spring.io: a production Spring reference application

…and, well, me.!

Brian Clozel !

• Spring Framework committer • Sagan developer • Bad at Photoshop

@brianclozel

Page 7: Inside spring.io: a production Spring reference application

The Plan!!

1. Open sourcing spring.io 2. Evolving spring.io 3. What’s next?

Page 8: Inside spring.io: a production Spring reference application

Open sourcing spring.io

Page 9: Inside spring.io: a production Spring reference application

Why did we open source Sagan?!!

• The Example/Sample App problem • The Reference App problem • We’re committed to Open Source

Page 10: Inside spring.io: a production Spring reference application

Enter Sagan application

Page 11: Inside spring.io: a production Spring reference application

Sagan: Blog

Page 12: Inside spring.io: a production Spring reference application

Sagan: Spring portfolio

Page 13: Inside spring.io: a production Spring reference application

Sagan: Spring guides

Page 14: Inside spring.io: a production Spring reference application

Sagan: search

Page 15: Inside spring.io: a production Spring reference application

Billions and billions of visitors

Page 16: Inside spring.io: a production Spring reference application

Available on GitHub!!• github.com/spring-io/sagan • BSD3-license • Master branch == running in production

Page 17: Inside spring.io: a production Spring reference application

Project Layout

Page 18: Inside spring.io: a production Spring reference application

Writing blog posts!!

• spring.io/blog • Project Sagan: open sourcing spring.io • Project Sagan: zero downtime deployments • Project Sagan: client side architecture • Project Sagan: upgrading to JDK 8

Page 19: Inside spring.io: a production Spring reference application

Embedded documentation

Page 20: Inside spring.io: a production Spring reference application

Partial/total rewrites!

• Getting started experience… • JDK8 features • Code architecture • Client side architecture

Page 21: Inside spring.io: a production Spring reference application

sagan-client

Page 22: Inside spring.io: a production Spring reference application

Build integration with Gradle 1/2

!// install NPM dependencies!task npmInstall(type:Exec) {!    inputs.files "package.json", "bower.json"!    outputs.dir "node_modules"!    commandLine 'npm', 'install'!}!// run the Gulp.js build!task npmBuild(dependsOn: npmInstall, type:Exec) {!    inputs.dir "src"!    inputs.file "gulpfile.js"!    outputs.dir "dist"!    commandLine 'npm', 'run', 'build'!}

Page 23: Inside spring.io: a production Spring reference application

Build integration with Gradle 2/2

apply plugin: 'java'!// create a webjar to be served by the sagan-site module!jar {!    from 'dist'!    eachFile { ! details -> details.path = ! details.path.startsWith('META-INF') ?: 'static/'+details.path!    }!}!!jar.dependsOn npmBuild

Page 24: Inside spring.io: a production Spring reference application

Modular JavaScript application

// using curl.js as a module loader!curl.config({!  packages: {!    app: { location: 'app'}!  },!  paths: {!   jquery: 'lib/jquery/jquery.min',!! gmaps: {location: 'lib/gmaps/gmaps', config:cjsConfig },            ! }!});!!// Promises-based API for executing callbacks!curl(['app', 'jquery']).then(start, fail);

Page 25: Inside spring.io: a production Spring reference application

Gulp, a streaming build system

Page 26: Inside spring.io: a production Spring reference application

Gulp, a streaming build system

// concatenate and minify CSS files!gulp.task('minify-css', function() {!    return gulp.src('src/css/*.css')!        .pipe(cssmin({root: 'src/css'}))!        .pipe(gulp.dest('./dist/css'));!});!!// tasks run in parallel!gulp.task('build', [‘minify-css', 'bower-files'], function(){ });

Page 27: Inside spring.io: a production Spring reference application

Gulp, a streaming build system

// using cram and uglify to concatenate and minify!gulp.task(‘build-modules', function() {!    return cram(paths.run, opts).into("run.js")!        .pipe(sourcemaps.init())!        .pipe(uglify())!        .pipe(sourcemaps.write("./"))!        .pipe(gulp.dest('./dist/'));!})!

Page 28: Inside spring.io: a production Spring reference application

Early feedback for Spring Framework!

• Changed our opinion on Resource Handling • Real client side experience

• « Project Sagan: client-side architecture » • « JavaScript modularity, without the buzzwords »

Resource Handling in Spring 4.1 • Rossen Stoyanchev & Brian Clozel • Tomorrow 8:30AM

Page 29: Inside spring.io: a production Spring reference application

Spring Boot, in production > 1 year

“Spring Boot lets you pair-program with the Spring team. Josh Long, @starbuxman

Page 30: Inside spring.io: a production Spring reference application

Evolving spring.io

Page 31: Inside spring.io: a production Spring reference application

Writing code: JDK8

!List<String> projectVersions = project.getProjectReleases().stream()!                .map(ProjectRelease::getVersion)!                .collect(Collectors.toList());

Page 32: Inside spring.io: a production Spring reference application

Writing code: autoconfiguration

!@EnableAutoConfiguration // <- THIS!!@Configuration!@ComponentScan!public class AppConfiguration {!!}

Page 33: Inside spring.io: a production Spring reference application

(indirect use of) @Conditional

!@Conditional(CustomCondition.class)!@Configuration!public class AppConfiguration {!!}

Page 34: Inside spring.io: a production Spring reference application

Boot Actuators

!curl spring.io/info!!curl spring.io/autoconfig!!curl spring.io/health!!curl spring.io/beans!!* some endpoints are protected!

Page 35: Inside spring.io: a production Spring reference application

Remote shell with CRaSH

Page 36: Inside spring.io: a production Spring reference application

Distributed team!

Page 37: Inside spring.io: a production Spring reference application

HipChat +3rd party integrations

Page 38: Inside spring.io: a production Spring reference application

Issues management: waffle.io

Page 39: Inside spring.io: a production Spring reference application

Embracing continuous deployment• From first deploy live, SpringOne2GX 2013 • 100+ deploys last 3 months

Page 40: Inside spring.io: a production Spring reference application

Green/Blue deployments

Sagan Blue

instances

CF Router

(golang)

Sagan Green

instances

Page 41: Inside spring.io: a production Spring reference application

Green/Blue: Session management?!

• PWS default: sticky sessions • CF java-buildpack: session replication with Redis • No Sessions :-)

Page 42: Inside spring.io: a production Spring reference application

Green/Blue: DB schema updates?!

• Sagan: FlywayDB • Divide and conquer (read-only flags) • DB Store that fits your needs

Page 43: Inside spring.io: a production Spring reference application

General Advice: 12factor.net!

• codebase • dependencies • config • concurrency • logs • …

Page 44: Inside spring.io: a production Spring reference application

What’s next?

Page 45: Inside spring.io: a production Spring reference application

Sagan - services architecture

45

sagan-site

hosted on

GET http://spring.io

search

- get raw guides - render blogsElephantSQL

Page 46: Inside spring.io: a production Spring reference application

Sagan guides…

Page 47: Inside spring.io: a production Spring reference application

…are asciidoctor documents

Page 48: Inside spring.io: a production Spring reference application

Marketplace services

Page 49: Inside spring.io: a production Spring reference application

New Relic Java Agent

Page 50: Inside spring.io: a production Spring reference application

New Relic dashboard

Page 51: Inside spring.io: a production Spring reference application

Monitoring / Map

Page 52: Inside spring.io: a production Spring reference application

Sagan error rate

Page 53: Inside spring.io: a production Spring reference application

Application errors

Page 54: Inside spring.io: a production Spring reference application

Top transactions

Page 55: Inside spring.io: a production Spring reference application

First fix: using our CDN

Page 56: Inside spring.io: a production Spring reference application

Profiling threads

Page 57: Inside spring.io: a production Spring reference application

Template engine cache… disabled

Page 58: Inside spring.io: a production Spring reference application

An easy fix!

Page 59: Inside spring.io: a production Spring reference application

Monitoring transactions

Page 60: Inside spring.io: a production Spring reference application

Search transactions

Page 61: Inside spring.io: a production Spring reference application

Checking external services

Page 62: Inside spring.io: a production Spring reference application

Spring guides transactions

Page 63: Inside spring.io: a production Spring reference application

Search improvement: change service

Page 64: Inside spring.io: a production Spring reference application

Guides improvement: shared cache

Page 65: Inside spring.io: a production Spring reference application

Guides improvement: cache strategy

Page 66: Inside spring.io: a production Spring reference application

What do you think?

Page 67: Inside spring.io: a production Spring reference application

What I’ve learned!

• With small or distributed teams: • time spent on managing issues is important • contributor/developer experience is a top priority

• Always learn with monitoring, profiling • In cloud environments:

• you can throw resources at problems • or use the marketplace (scale better, save money)

Page 68: Inside spring.io: a production Spring reference application

Sagan is!

• An reference app • An open source project • A space for discussion and experiments • A JDK8, Spring 4, Spring Boot, critical app in production

Page 69: Inside spring.io: a production Spring reference application

Thanks!

@brianclozel