Matteo Figus / @matteofigus
@matteofigus
Europe, North and South America, Asia
millions of requests per minute
more than 50 engineers make changes every day to www.opentable.com
<html>
<head>
<!-- css component -->
<!-- js head component -->
...
</head>
<body>
<!-- header component -->
...
<!-- footer component -->
<!-- js body component -->
...
</body>
</html>
$ curl http://components-789/header/1.X.X/?userType=Admin&metroId=72 -H Accept-Language:en-US
{
"href": "http://components-789/header/1.X.X?userType=Admin&metroId=72",aefaef
"html": "<div><img src=\"//srs.opentable.com/logo.jpg\" />...</div>"
}
Consistency
Coordination
Optimal front-end loading
Easy to spin-up new microsites
$ npm install -g oc
$ mkdir demo && cd demo
$ oc init test-component jade
$ echo 'div this is my component' > test-component/template.jade
$ oc dev . 3030
$ oc preview http://localhost:3030/test-component
$ oc registry add http://oc-registry.herokuapp.com
$ oc publish /test-component
$ oc preview http://oc-registry.herokuapp.com/test-component
// template.jade
img(src=staticPath+'img/img.jpg')
// server.js
module.exports.data = function(context, cb){
cb(null, {
staticPath: context.staticPath
});
};
$ curl http://oc-registry.com/hello-world
{
"href": "https://oc-registry.com/hello-world",
"version": "1.0.0",
"requestVersion": "",
"html": "<div>hello John Doe</div>",
"type": "oc-component",
"renderMode": "rendered"
}
<html>
<body>
...
<oc-component href="http://oc-registry.com/component/1.X.X/?a=b">
</oc-component>
...
<script src="http://oc-registry.com/oc-client/client.js">
</script>
</body>
</html>
$ curl http://oc-registry.com/hello-world
-H Accept:application/vnd.oc.unrendered+json
{
"href": "https://oc-registry.com/hello-world",
"version": "1.0.0",
"requestVersion": "",
"data": {
"name": "John doe"
},
"template": {
"src": "https://s3.amazonaws.com/your-s3-bucket/components/hello-world/1.0.0/template.js",
"type": "handlebars",
"key": "cad2a9671257d5033d2abfd739b1660993021d02"
},
"type": "oc-component",
"renderMode": "unrendered"
}
var Client = require('oc-client'),
client = new Client({
registries: ['http://oc-registry.com/'],
components: {'hello-world': '~1.0.0'}
});
client.renderComponent('hello-world', function(err, componentHtml){
console.log(componentHtml); // => rendered html
});
Enables people to create new components independently and publish them
Granular ownership
Performances
Robustness
Serve as framework for experimenting and A/B testing new ideas in the front-end
Microsites have control
SOA is not just about code
Test, test, test
Failure is a feature
Componentise all the web!
github.com/matteofigus/oc-components-examples
http://tech.opentable.co.uk/blog/2015/02/09/dismantling-the-monolith-microsites-at-opentable/
follow me on twitter - @matteofigus