SlideShare a Scribd company logo
1 of 135
Download to read offline
Enabling Microservices

@ Orbitz
Steve Hoffman
Senior Principal Engineer
@bacoboy
Rick Fast
Principal Engineer
@tortiepoint
#GOTOChgo 2016
#GOTOChgo 2016
Agenda
• Brief Architecture Overview/History
• From Monolithic to Services to Microservices with Docker
• Automated Pipelines
• Questions
#GOTOChgo 2016
#GOTOChgo 2016
2000
#GOTOChgo 2016
2000
Web Layer
Business Layer
#GOTOChgo 2016
2000
#GOTOChgo 2016
2000
#GOTOChgo 2016
2000
Business Layer
#GOTOChgo 2016
2000
Business Layer
#GOTOChgo 2016
Business Layer
2000
#GOTOChgo 2016
Business Layer
2003
#GOTOChgo 2016
Business Layer
2003
#GOTOChgo 2016
Business Layer
2003
#GOTOChgo 2016
2003
#GOTOChgo 2016
2004
#GOTOChgo 2016
2004
#GOTOChgo 2016
2004
#GOTOChgo 2016
2012
#GOTOChgo 2016
2012
#GOTOChgo 2016
2012
• Multiple Brands
• Websites
• Webservices
• Multiple Backends
• 500+ apps / thousands of instances
• Deployments Daily (sometimes more)
#GOTOChgo 2016
2015
• Multiple Brands
• Websites
• Webservices
• Multiple Backends
• 500+ apps / thousands of instances
• Deployments Daily (sometimes more)
#GOTOChgo 2016
• Multiple Brands
• Websites
• Webservices
• Multiple Backends
• 500+ apps / thousands of instances
• Deployments Daily (sometimes more)
2015
#GOTOChgo 2016
2016
• Multiple Brands
• Websites
• Webservices
• Multiple Backends
• 500+ apps / thousands of instances
• Deployments Daily (sometimes more)
#GOTOChgo 2016
Process Overkill
#GOTOChgo 2016
Different Provisioning Tools
DEV OPS
#GOTOChgo 2016
Different Provisioning Tools
DEV OPS
Application Platform!=
#GOTOChgo 2016
A New Experiment
• Microservices?
• Decompose single “service” into the actual 40+ sub-services
• Any change to sub-service was a deployment of many
• Could it be a simple Spring Boot App in Docker (12 factor?)
• Backward compatible with existing service infrastructure.
• Code to Production w/o help from other Humans
#GOTOChgo 2016
The Docker Slave
aka “The Rickbot”
#GOTOChgo 2016
The Docker Slave
aka “The Rickbot”
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App Register & Lookup
#GOTOChgo 2016
10.10.10.10
10.10.10.10:31002
App
App
App Register & Lookup
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
10.10.10.10
App
App
App
#GOTOChgo 2016
10.10.10.10
10.10.10.10:51515
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
10.10.10.10
App
App
App
#GOTOChgo 2016
10.10.10.10
10.10.10.10:1337
App
App
App
#GOTOChgo 2016
Almost done…
App
App
App
#GOTOChgo 2016
Mesos Scheduler
http://mesos.apache.org/
#GOTOChgo 2016
Mesos Scheduler
Marathon
Scheduler Slave xNMaster x3
ZK x3
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
VIP
#GOTOChgo 2016
App
App
App
VIP
#GOTOChgo 2016
App
App
App
VIP
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
App
App
App
#GOTOChgo 2016
A Little More
Background…
#GOTOChgo 2016
#GOTOChgo 2016
Module
Module
Module Module
#GOTOChgo 2016
Editorial
Module
A Continuously Deployed
Microservice
www.orbitz.com
(scroll down)
#GOTOChgo 2016
Orbitz
Content
Orchestration
Service
Content
(Solr)
Editorial
Module
Search
Module
Hotel
Module
#GOTOChgo 2016
Orbitz
Content
Orchestration
Service
Content
(Solr)
Editorial
Module
Search
Module
Hotel
Module
Hotel Team Search Team Content Team
#GOTOChgo 2016
Orbitz
Content
Orchestration
Service
Content
(Solr)
Editorial
Module
Search
Module
Hotel
Module
#GOTOChgo 2016
Orbitz
Content
Orchestration
Service
Content
(Solr)
Editorial
Module
Search
Module
Hotel
Module
Hotel Team
Search Team
Content Team
#GOTOChgo 2016
Pre-Continuous Delivery
1.2-BETA-20150401-113002
Test Discard
Test Discard
1.2-BETA-20150402-093002
Build
Build
And so on…
#GOTOChgo 2016
Pre-Continuous Delivery
1.2-BETA-20150401-113002
Test Discard
Test Discard
1.2-BETA-20150402-093002
Build
Build
Test Deploy
1.2
Build
#GOTOChgo 2016
Continuous Delivery with
Jenkins, Docker, Ansible
and Marathon
#GOTOChgo 2016
Yo
rfast-mbp:git rfast$ yo microservice
_-----_
| | .--------------------------.
|--(o)--| | Welcome to the kickass |
`---------´ | Microservice |
( _´U`_ ) | generator! |
/___A___ '--------------------------'
| ~ |
__'.___.'__
´ ` |° ´ Y `
? Enter the name of your service. (E.G. "my-service")
#GOTOChgo 2016
Committer
Pull Request
#GOTOChgo 2016
Committer
Reviewer
Pull Request
#GOTOChgo 2016
Committer
Reviewer
Pull Request
#GOTOChgo 2016
Committer
Reviewer
Pull Request
#GOTOChgo 2016
Jenkins Pipeline
#GOTOChgo 2016
if(…) {
x ++;
}
Merge
#GOTOChgo 2016
Pipeline (Simplified)
build
unit test
publish
deploy
dev
acceptance
tests
deploy
qa
deploy
staging
open RFC
deploy
prod
close RFC
#GOTOChgo 2016
Build
if(…) {
x ++;
}
1.2
Merge
#GOTOChgo 2016
Build
if(…) {
x ++;
}
1.2
Merge
1.2.
editorial-module.jar
./gradlew build
{BUILD_NUMBER}
#GOTOChgo 2016
Build
1.2
Merge
editorial-module.jar
if(…) {
x ++;
}
171.2.
#GOTOChgo 2016
Build
1.2
Merge
editorial-module.jar
FROM orbitz/java-8
COPY build/editorial-module.jar /opt/orbitz
WORKDIR /opt/orbitz
ENTRYPOINT [“java”,”-jar”,”editorial-module.jar”]
if(…) {
x ++;
}
171.2.
#GOTOChgo 2016
Build
1.2
Merge
editorial-module.jar orbitz/editorial-module:1.2.17
if(…) {
x ++;
}
171.2.
#GOTOChgo 2016
Build
orbitz/editorial-module:1.2.17
#GOTOChgo 2016
Deploy
- hosts: dev
- tasks:
- name: find previous images
docker_facts: image=orbitz/{{application}}
register: previous
- name: deploy new image
docker: image=orbitz/{{application}}:{{version}} …
- name: wait for service
wait_for: port={{port}} …
- name: check health endpoint
uri: url="http://{{fqdn}}:{{port}}/health" …
- name: kill old image
docker: {{previous}}
git pull
playbook.yml (abridged)
#GOTOChgo 2016
- hosts: dev
host-001 host-002 host-003 host-004
#GOTOChgo 2016
- hosts: dev
host-001 host-002 host-003 host-004
#GOTOChgo 2016
- hosts: dev
host-001 host-002 host-003 host-004
#GOTOChgo 2016
Downsides
• How to handle failure with YAML files?
• What happens when a VM is moved (destroyed/created)?
• What if I need to add capacity?
#GOTOChgo 2016
Deploy (Second Attempt)
- hosts: dev
- tasks:
- name: find previous images
docker_facts: image=orbitz/{{application}}
register: previous
- name: deploy new image
docker: image=orbitz/{{application}}:{{version}} …
- name: wait for service
wait_for: port={{port}} …
- name: check health endpoint
uri: url="http://{{fqdn}}:{{port}}/health" …
- name: kill old image
docker: {{previous}}
git pull
playbook.yml (abridged)
#GOTOChgo 2016
Deploy (Second Attempt)
- hosts: dev
- tasks:
- name: find previous images
docker_facts: image=orbitz/{{application}}
register: previous
- name: deploy new image
docker: image=orbitz/{{application}}:{{version}} …
- name: wait for service
wait_for: port={{port}} …
- name: check health endpoint
uri: url="http://{{fqdn}}:{{port}}/health" …
- name: kill old image
git pull
playbook.yml (abridged)
- hosts: localhost
- tasks:
- name: marathon deploy
marathon: image=orbitz/{{application}}:{{version}}
instances=3
#GOTOChgo 2016
Deploy (Second Attempt)
git pull
playbook.yml (abridged)
- hosts: localhost
- tasks:
- name: marathon deploy
marathon: image=orbitz/{{application}}:{{version}}
instances=3
#GOTOChgo 2016
Deploy (Second Attempt)
New host setup
#GOTOChgo 2016
Deploy (Second Attempt)
Mesos Agent
New host setup
1.2.16
#GOTOChgo 2016
- tasks:
marathon: …
playbook.yml
1.2.16 1.2.16
1.2.16
#GOTOChgo 2016
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
#GOTOChgo 2016
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
#GOTOChgo 2016
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
PUT /apps/editorial-module
{
“image”: “orbitz/editorial-module:1.2.17” …
}
#GOTOChgo 2016
PUT /apps/editorial-module
{
“image”: “orbitz/editorial-module:1.2.17” …
}
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
app = GET /v2/apps/editorial-module
if not app then
deploy_id =
POST /v2/apps
{
“image”: “orbitz/editorial-module:1.2.17”,
“id”: “editorial-module”
}
else
deploy_id =
PUT /v2/apps/editorial-module
{ “image”: “orbitz/editorial-module:1.2.17” }
end if
while GET /v2/deployments contains deploy_id
// still deploying
end
// deploy complete
#GOTOChgo 2016
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
“env”: {
“SOME_DATABASE_URL”: “jdbc://whatever”,
“SOME_DATABASE_USER”: “rickfast”,
“SOME_OTHER_VALUE”: “whatever”
}
PUT /apps/editorial-module
{
“image”: “orbitz/editorial-module:1.2.17” …
}
#GOTOChgo 2016
- tasks:
marathon: …
PUT /apps/editorial-module
{
“image”: “orbitz/editorial-module:1.2.17” …
}
1.2.16 1.2.16
1.2.16
#GOTOChgo 2016
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
#GOTOChgo 2016
- tasks:
marathon: …
1.2.16 1.2.16
1.2.16
1.2.17 1.2.17
1.2.17
#GOTOChgo 2016
- tasks:
marathon: …
/health
1.2.16 1.2.16
1.2.16
1.2.17 1.2.17
1.2.17
#GOTOChgo 2016
- tasks:
marathon: …
/health
200 OK 200 OK
200 OK
1.2.16 1.2.16
1.2.16
1.2.17 1.2.17
1.2.17
#GOTOChgo 2016
- tasks:
marathon: …
1.2.17 1.2.17
1.2.17
#GOTOChgo 2016
And off to the next environment…
1.2.17 1.2.17
1.2.17
#GOTOChgo 2016
1.2.17 1.2.17
1.2.17
What if?
#GOTOChgo 2016
1.2.17 1.2.17
#GOTOChgo 2016
1.2.17 1.2.17
#GOTOChgo 2016
1.2.17 1.2.17 1.2.17
#GOTOChgo 2016
/health
200
OK
1.2.17 1.2.17 1.2.17
#GOTOChgo 2016
1.2.17 1.2.17 1.2.17
#GOTOChgo 2016
Smoke/Acceptance Testing
1.2.17
1.2.17
1.2.17
#GOTOChgo 2016
Paper Trail
create
tickets
commit(s)
#GOTOChgo 2016
Paper Trail
fail!
close/fail
#GOTOChgo 2016
Paper Trail
ok
close
#GOTOChgo 2016
Build
Unit Test
Deploy
Dev
Deploy
Prod
Deploy
Staging
Acceptance
Test
Code
Review &
Push
Production
Pre-Production
Open
RFC
Close
RFC
#GOTOChgo 2016
Pipeline as code!
node {
git ‘https://stash.orbitz.com/editorial-module.git‘
sh ‘./gradlew clean build’
def image =
docker.build “editorial-module:${env.BUILD_TAG}"
image()
}
#GOTOChgo 2016
Pipeline as code!
node {
git ‘http://stash.orbitz.com/deploy-playbook.git'
sh ‘./ansible-playbook … editorial-module:${env.BUILD_TAG} test’
}
node {
git ‘https://stash.orbitz.com/editorial-module.git‘
sh ‘./gradlew clean build’
def image =
docker.build “editorial-module:${env.BUILD_TAG}"
image.push()
}
#GOTOChgo 2016
Pipeline as code!
pipeline.json
{
“steps”: [
{
“type”: “gradle-build”
},
{
“type”: “marathon-deploy”,
“environment”: “test”
}
]
}
#GOTOChgo 2016
Pipeline as code!
def pipeline = new JsonSluper().parse(‘pipeline.json’)
pipeline.steps.each { step ->
if (step.type == ‘gradle-build’) {
node(‘java’) {
git ‘https://stash.orbitz.com/${service}.git’
sh ‘./gradlew clean build’
def image =
docker.build “${service}:${env.BUILD_TAG}”
image.push()
}
} …
}
#GOTOChgo 2016
Jenkins CI/CD - on Mesos?
• Existing Solution
• Dedicated Jenkins Slaves
• Hand created
• Snapshotted & Rolled Back to “Clean” state after each Job
• Hard to Manage Build Environment for 300+ apps across many
OSes, Java versions, Ruby versions, perl versions, python
versions, protocol buffer compiler versions, etc…
#GOTOChgo 2016
Master
Slave
Commit/Push or
Pull Request/Merge
Before
#GOTOChgo 2016
Master
Slave
Poll or Push
Trigger
Commit/Push or
Pull Request/Merge
Clone & Build Push Artifacts
Before
#GOTOChgo 2016
Master
Slave
Before
#GOTOChgo 2016
Jenkins mesos-plugin
#GOTOChgo 2016
Master
Master
Commit/Push or
Pull Request/Merge
After Slave
env:jenkins
#GOTOChgo 2016
Master
Master
Slave
Poll or Push
Trigger
Commit/Push or
Pull Request/Merge
Clone & Build Push Artifacts
After Slave
env:jenkins
#GOTOChgo 2016
Master
Master
After Slave
env:jenkins
#GOTOChgo 2016
Master
Master
Slave
Slave
env:jenkins
env:ci
#GOTOChgo 2016
Master
Master
Slave
Slave
Deploy
App
Clone & Run
Slave
env:jenkins
env:ci
docker

pull
#GOTOChgo 2016
Master
Master
Slave
App
Slave
env:jenkins
env:ci
#GOTOChgo 2016
Prod Network
Pre-Prod Network
env:ci env:qa env:staging
env:jenkins
Master
env:prod
#GOTOChgo 2016
DC: East
DC: West
env:ci

dc:west
env:qa

dc:west
env:staging

dc:west
env:jenkins

dc:west
Master
env:prod

dc:east
env:prod

dc:west
#GOTOChgo 2016
Learnings
• Create a shared platform for docker deployments using shared and app-specific “localhost”
helpers — this was ours, yours SHOULD look different — adapt to change, don’t fight it.
• Take people out of the release process
• Docker & Packer AMIs - repeatable applications/servers
• Chef - repeatable infrastructure & configuration — Environment aware
• Jenkins - repeatable releases
• Delineate configuration concerns:
• Known at Compile time — Bake into Docker image
• Known at Boot time — Pass from Playbook/Launcher/Jenkins - parameter to Docker run/AMI
• Changes Anytime — Externalize (consul K/V, etcd, zookeeper)
#GOTOChgo 2016

More Related Content

What's hot

What's hot (20)

Jedi Mind Tricks for Git
Jedi Mind Tricks for GitJedi Mind Tricks for Git
Jedi Mind Tricks for Git
 
Git Magic: Versioning Files like a Boss
Git Magic: Versioning Files like a BossGit Magic: Versioning Files like a Boss
Git Magic: Versioning Files like a Boss
 
Pseudo-versions, moving to Go1.13 and later versions
Pseudo-versions, moving to Go1.13 and later versionsPseudo-versions, moving to Go1.13 and later versions
Pseudo-versions, moving to Go1.13 and later versions
 
Introduction to Git (Greg Lonnon)
Introduction to Git (Greg Lonnon)Introduction to Git (Greg Lonnon)
Introduction to Git (Greg Lonnon)
 
Grooscript in Action SpringOne2gx 2015
Grooscript in Action SpringOne2gx 2015Grooscript in Action SpringOne2gx 2015
Grooscript in Action SpringOne2gx 2015
 
An introduction to_golang.avi
An introduction to_golang.aviAn introduction to_golang.avi
An introduction to_golang.avi
 
Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜
 
(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi
 
Grooscript and Grails 3
Grooscript and Grails 3Grooscript and Grails 3
Grooscript and Grails 3
 
Android is going to Go! Android and Golang
Android is going to Go! Android and GolangAndroid is going to Go! Android and Golang
Android is going to Go! Android and Golang
 
Grooscript gr8conf 2015
Grooscript gr8conf 2015Grooscript gr8conf 2015
Grooscript gr8conf 2015
 
⛳️ Votre API passe-t-elle le contrôle technique ?
⛳️ Votre API passe-t-elle le contrôle technique ?⛳️ Votre API passe-t-elle le contrôle technique ?
⛳️ Votre API passe-t-elle le contrôle technique ?
 
Grooscript greach
Grooscript greachGrooscript greach
Grooscript greach
 
Essential Git and Github commands
Essential Git and Github commandsEssential Git and Github commands
Essential Git and Github commands
 
Intro. to Git and Github
Intro. to Git and GithubIntro. to Git and Github
Intro. to Git and Github
 
Grooscript greach 2015
Grooscript greach 2015Grooscript greach 2015
Grooscript greach 2015
 
Understanding Pseudo-Versions Moving to Go 1.13 What is in Go 1.14+ for Modules
Understanding Pseudo-Versions Moving to Go 1.13 What is in Go 1.14+ for ModulesUnderstanding Pseudo-Versions Moving to Go 1.13 What is in Go 1.14+ for Modules
Understanding Pseudo-Versions Moving to Go 1.13 What is in Go 1.14+ for Modules
 
Development Principles & Philosophy
Development Principles & PhilosophyDevelopment Principles & Philosophy
Development Principles & Philosophy
 
GitGot: The Swiss Army Chainsaw of Git Repo Management
GitGot: The Swiss Army Chainsaw of Git Repo ManagementGitGot: The Swiss Army Chainsaw of Git Repo Management
GitGot: The Swiss Army Chainsaw of Git Repo Management
 
SCM for Android Developers Using Git
SCM for Android Developers Using GitSCM for Android Developers Using Git
SCM for Android Developers Using Git
 

Viewers also liked

Viewers also liked (6)

Enabling Microservices @Orbitz - DevOpsDays Chicago 2015
Enabling Microservices @Orbitz - DevOpsDays Chicago 2015Enabling Microservices @Orbitz - DevOpsDays Chicago 2015
Enabling Microservices @Orbitz - DevOpsDays Chicago 2015
 
TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...
TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...
TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...
 
Enabling Microservices @Orbitz - DockerCon 2015
Enabling Microservices @Orbitz - DockerCon 2015Enabling Microservices @Orbitz - DockerCon 2015
Enabling Microservices @Orbitz - DockerCon 2015
 
Enabling Microservices @Orbitz - Velocity Conf 2015
Enabling Microservices @Orbitz - Velocity Conf 2015Enabling Microservices @Orbitz - Velocity Conf 2015
Enabling Microservices @Orbitz - Velocity Conf 2015
 
Chicago Hadoop User Group (CHUG) Presentation on Apache Flume - April 9, 2014
Chicago Hadoop User Group (CHUG) Presentation on Apache Flume - April 9, 2014Chicago Hadoop User Group (CHUG) Presentation on Apache Flume - April 9, 2014
Chicago Hadoop User Group (CHUG) Presentation on Apache Flume - April 9, 2014
 
Enabling Hybrid Workflows with Docker/Mesos @Orbitz
Enabling Hybrid Workflows with Docker/Mesos @OrbitzEnabling Hybrid Workflows with Docker/Mesos @Orbitz
Enabling Hybrid Workflows with Docker/Mesos @Orbitz
 

Similar to Enabling Microservice @ Orbitz - GOTO Chicago 2016

Rapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformRapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 Platform
WSO2
 

Similar to Enabling Microservice @ Orbitz - GOTO Chicago 2016 (20)

Front End Development for Back End Developers - vJUG24 2017
Front End Development for Back End Developers - vJUG24 2017Front End Development for Back End Developers - vJUG24 2017
Front End Development for Back End Developers - vJUG24 2017
 
Myths of Angular 2: What Angular Really Is
Myths of Angular 2: What Angular Really IsMyths of Angular 2: What Angular Really Is
Myths of Angular 2: What Angular Really Is
 
Intro To Django
Intro To DjangoIntro To Django
Intro To Django
 
Managing your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIManaging your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CI
 
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
 
Обход проверки безопасности в магазинах мобильных приложений при помощи платф...
Обход проверки безопасности в магазинах мобильных приложений при помощи платф...Обход проверки безопасности в магазинах мобильных приложений при помощи платф...
Обход проверки безопасности в магазинах мобильных приложений при помощи платф...
 
Tutorial: Using GoBGP as an IXP connecting router
Tutorial: Using GoBGP as an IXP connecting routerTutorial: Using GoBGP as an IXP connecting router
Tutorial: Using GoBGP as an IXP connecting router
 
Front End Development for Back End Developers - UberConf 2017
Front End Development for Back End Developers - UberConf 2017Front End Development for Back End Developers - UberConf 2017
Front End Development for Back End Developers - UberConf 2017
 
Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!
 
Rapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformRapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 Platform
 
Angular2 & Native Script GDG DevFest 2016
Angular2 & Native Script GDG DevFest 2016Angular2 & Native Script GDG DevFest 2016
Angular2 & Native Script GDG DevFest 2016
 
Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016
 
Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020
 
When it all GOes right
When it all GOes rightWhen it all GOes right
When it all GOes right
 
Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018Hacking the browser with puppeteer sharp .NET conf AR 2018
Hacking the browser with puppeteer sharp .NET conf AR 2018
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Amped for AMP at Pubcon Las Vegas 2016
Amped for AMP at Pubcon Las Vegas 2016Amped for AMP at Pubcon Las Vegas 2016
Amped for AMP at Pubcon Las Vegas 2016
 
Building full-stack Node.js web apps with Visual Studio Code
Building full-stack Node.js web apps with Visual Studio CodeBuilding full-stack Node.js web apps with Visual Studio Code
Building full-stack Node.js web apps with Visual Studio Code
 
Continuous Delivery com Docker, OpenShift e Jenkins
Continuous Delivery com Docker, OpenShift e JenkinsContinuous Delivery com Docker, OpenShift e Jenkins
Continuous Delivery com Docker, OpenShift e Jenkins
 
Microservices, la risposta che (forse) cercavi!
Microservices, la risposta che (forse) cercavi!Microservices, la risposta che (forse) cercavi!
Microservices, la risposta che (forse) cercavi!
 

More from Steve Hoffman

More from Steve Hoffman (6)

Byte Sized Rust
Byte Sized RustByte Sized Rust
Byte Sized Rust
 
Nerd Out with Hadoop: A Not-So-Basic Introduction to the Platform
Nerd Out with Hadoop: A Not-So-Basic Introduction to the PlatformNerd Out with Hadoop: A Not-So-Basic Introduction to the Platform
Nerd Out with Hadoop: A Not-So-Basic Introduction to the Platform
 
Combating DNS Exfiltration in AWS - AWS Midwest Community Day 2018
Combating DNS Exfiltration in AWS - AWS Midwest Community Day 2018Combating DNS Exfiltration in AWS - AWS Midwest Community Day 2018
Combating DNS Exfiltration in AWS - AWS Midwest Community Day 2018
 
Combating DNS Exfiltration in AWS - BSidesChicago 2018
Combating DNS Exfiltration in AWS - BSidesChicago 2018Combating DNS Exfiltration in AWS - BSidesChicago 2018
Combating DNS Exfiltration in AWS - BSidesChicago 2018
 
How Open Source is Transforming the Internet. Again.
How Open Source is Transforming the Internet. Again.How Open Source is Transforming the Internet. Again.
How Open Source is Transforming the Internet. Again.
 
flAWS Walkthrough - AWS Chicago Meetup 8/8/2017
flAWS Walkthrough - AWS Chicago Meetup 8/8/2017flAWS Walkthrough - AWS Chicago Meetup 8/8/2017
flAWS Walkthrough - AWS Chicago Meetup 8/8/2017
 

Recently uploaded

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Enabling Microservice @ Orbitz - GOTO Chicago 2016