felix http - paving the road to the future

47
Felix HTTP Paving the road to the future and Jan Willem Janssen Marcel Offermans SSID: Felix Password: felixdemo Browse to: http://10.61.0.161:8080/

Upload: marcel-offermans

Post on 15-Jan-2015

1.245 views

Category:

Software


3 download

DESCRIPTION

Developing modular web-based applications is easy using the HTTP-service implementation of Apache Felix. It hides the complexity and boilerplate code needed to get your servlets and filters up and running in no-time. With the recent effort in aligning the HTTP-service with the latest servlet specifications, new functionality like asynchronous servlets and filters will be supported out-of-the-box. In this presentation we will not only talk about the new features provided by the Felix HTTP-service implementation, but also demonstrate how to use them in your project. In addition, we talk about upcoming improvements to the Felix HTTP-service, like native support for SPDY and WebSockets. Slide sources and example code: https://bitbucket.org/marrs/apachecon2014-felix-http/

TRANSCRIPT

Page 1: Felix HTTP - Paving the road to the future

Felix HTTPPaving the road to the future

 and Jan Willem Janssen Marcel Offermans

SSID: FelixPassword: felixdemo

Browse to: http://10.61.0.161:8080/

Page 2: Felix HTTP - Paving the road to the future

Jan WillemJanssen

Software architect at Luminis TechnologiesCurrently working on PulseOn and AmdatuCommitter and PMC member at Apache Felix and Apache ACE

Page 3: Felix HTTP - Paving the road to the future

MarcelOffermans

Director at Luminis Technologies, Fellow at LuminisCurrently working on AmdatuApache Member, Committer and PMC member at Apache ACE andApache Felix

Page 4: Felix HTTP - Paving the road to the future

AgendaModular Web ApplicationsCurrent StateAvailable ExtensionsThe New SpecificationNew extensionsFuture WorkWrap Up

Page 5: Felix HTTP - Paving the road to the future

Modular WebApplications

Page 6: Felix HTTP - Paving the road to the future

ModularArchitectures

High Cohesion, Low CouplingSeparation of ConcernsMaintainable CodeReusable, Composable

Page 7: Felix HTTP - Paving the road to the future

DeploymentsCompose modules into different deploymentsLow bandwidth by just sending changed modulesFast deployments by being able to update running applications

Page 8: Felix HTTP - Paving the road to the future

Current State

Page 9: Felix HTTP - Paving the road to the future

ExplicitRegistration

public interface HttpService { void registerServlet(String alias, Servlet servlet, Dictionary initParams, HttpContext httpContext);

void registerResources(String alias, String name, HttpContext httpContext);

void unregister(String alias);

HttpContext createDefaultHttpContext();}

Page 10: Felix HTTP - Paving the road to the future

Servlets httpService.registerServlet("/hello", new HttpServlet() { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) { resp.setContentType("text/plain"); resp.getWriter().write("Hello ApacheCon world!"); }}, null /* initParams */, null /* httpContext */);

invoke the /hello servlet

...

Page 11: Felix HTTP - Paving the road to the future

ResourceshttpService.registerResources("/site", "/resources", null /* httpContext */);

$ cat resources/helloHello ApacheCon world, I'm a static resource!

request a static resource called hello

...

Page 12: Felix HTTP - Paving the road to the future

HttpContextProvides secure access to servlets and resources.Layer of abstraction for resource loading.

public interface HttpContext { boolean handleSecurity(HttpServletRequest request, HttpServletResponse response); URL getResource(String name); String getMimeType(String name);}

Page 13: Felix HTTP - Paving the road to the future

Web ApplicationSpecificationPart of the OSGi Enterprise Specification, chapter 128.

Web Application Bundle (WAB) are extended Java EE WAR files.They have optional JSP support.Integration with OSGi BundleContext and service registry.

Page 14: Felix HTTP - Paving the road to the future

AvailableExtensions

Page 15: Felix HTTP - Paving the road to the future

Whiteboarddon't call us, we'll call you!

Register your Servlet in the service registry and add a property calledalias containing its endpoint.

For more information:http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf

Page 16: Felix HTTP - Paving the road to the future

FiltersJust like Servlets, these can be registered whiteboard styleor use explicit registration:

the ExtHttpService service from Felix HTTPthe WebContainer service from PAX Web

Page 17: Felix HTTP - Paving the road to the future

Amdatu WebResources

of the open source project (Apache Licensed).Part Amdatu.orgX-Web-Resource-Version: 1.1X-Web-Resource: /amdatu-resources;resourcesX-Web-Resource-Default-Page: index.html,/doc=javadoc.html

Include-Resource: resources=resources/basic

Page 18: Felix HTTP - Paving the road to the future

Demorequest a static resource called /amdatu‑resources

...

Page 19: Felix HTTP - Paving the road to the future

Amdatu WebREST

Extensive support for based on industry standards.REST endpointsJAX-RS based annotation support.Includes support for Jackson mappings.Self-documenting endpoints with Swagger.

Page 20: Felix HTTP - Paving the road to the future

Demo@Path("/rest")@Description("Provides a demo REST endpoint")public class DemoRestEndpoint { private String m_response = "Hello World!"; @GET @Produces(MediaType.TEXT_PLAIN) @Description("Gives a plain text response") public String getPlainResponse() { return m_response; } @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Description("Allows one to set the response to return") public void setResponse( @FormParam("response") @DefaultValue("Default response") String newResponse) { m_response = newResponse; }}

Page 21: Felix HTTP - Paving the road to the future

Self-documentingEndpoints

Swagger is a library that creates documentation for endpoints based onJAX-RS annotations plus some extras.

Go to Swagger documentation

Page 22: Felix HTTP - Paving the road to the future

The newspecification

Page 23: Felix HTTP - Paving the road to the future

WhiteboardNo longer an extensionNo explicit registrationSpecify HttpService to be used

Page 24: Felix HTTP - Paving the road to the future

ExampleDictionary props = new Hashtable();props.put("osgi.http.whiteboard.servlet.pattern", "/slidemgr");props.put("osgi.http.whiteboard.target", "(http.service=demo)");context.registerService(Servlet.class.getName(), new SlideManager(), props);

Page 25: Felix HTTP - Paving the road to the future

(A)synchronousServlets

Servlet 3.0 APISupport wildcard one or more patternsProcess work outside the servlet lifecycle

Page 26: Felix HTTP - Paving the road to the future

Example codeclass WorkerServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) { final AsyncContext asyncContext = req.startAsync(req, resp); asyncContext.start(new DeepThought(asyncContext)); }}//class DeepThought implements Runnable { private AsyncContext m_context = // ... public void run() { // ...do some hard work... TimeUnit.DAYS.sleep(356L * 7500000L);

HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse(); response.setStatus(SC_OK); response.getWriter().printf("42"); asyncContext.complete(); }}

Page 27: Felix HTTP - Paving the road to the future

Example registrationDictionary props = new Hashtable();props.put("osgi.http.whiteboard.servlet.pattern", "/worker/*");props.put("osgi.http.whiteboard.servlet.asyncSupported", "true");context.registerService(Servlet.class.getName(), new WorkerServlet(), props);

Page 28: Felix HTTP - Paving the road to the future

FiltersFull support

Page 29: Felix HTTP - Paving the road to the future

ExampleDictionary props = new Hashtable();props.put("osgi.http.whiteboard.filter.pattern", "/*");props.put("osgi.http.whiteboard.filter.dispatcher", new String[] {"REQUEST", "INCLUDE", "FORWARD"});context.registerService(Filter.class.getName(), new SecurityFilter(), props);

Page 30: Felix HTTP - Paving the road to the future

ListenersFull supportAll events

Page 31: Felix HTTP - Paving the road to the future

Examplefinal CountDownLatch latch = new CountDownLatch(1);ServletContextListener contextListener = new ServletContextListener() { public void contextDestroyed(ServletContextEvent event) {} public void contextInitialized(ServletContextEvent event) { latch.countDown(); } };Dictionary props = new Hashtable();props.put("osgi.http.whiteboard.context.select", "DEFAULT");context.registerService(ServletContextListener.class.getName(), contextListener, props);

assertTrue("HttpService not ready in time?!", latch.await(5, TimeUnit.SECONDS));// continue with your itest...

Page 32: Felix HTTP - Paving the road to the future

Custom ErrorPages

By error codeBy exception

Page 33: Felix HTTP - Paving the road to the future

ExampleDictionary props = new Hashtable();props.put("osgi.http.whiteboard.servlet.errorPage", new String[] {"500", "java.io.IOException"});context.registerService(Servlet.class.getName(), new MyErrorHandlingServlet(), props);

Page 34: Felix HTTP - Paving the road to the future

New extensions

Page 35: Felix HTTP - Paving the road to the future

WebSockets“Real-time”Binary or text-basedTwo-way communication

RFC 6455

Page 36: Felix HTTP - Paving the road to the future

Example// Client-sidevar wsConn = new WebSocket("ws://" + window.location.host + "/servlet", [ "my-protocol" ]);wsConn.onmessage = function(event) { var data = event.data; // do something with data}

// Server-side, registered at "/servlet"class MyWebSocketServlet extends WebSocketServlet { public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) { if ("my-protocol".equals(protocol)) { return new WebSocket.OnTextMessage() { public void onOpen(Connection conn) {} public void onClose(int code, String reason) {} public void onMessage(String data) {} }; } return null; }}

Page 37: Felix HTTP - Paving the road to the future

DemoMulti-user Etch A Sketch

Page 38: Felix HTTP - Paving the road to the future

SPDYLet's make the web faster

Session layer on top of SSLReduce bandwidth & lower latencyPush multiple resources in a requestBasis of HTTP 2.0

Page 39: Felix HTTP - Paving the road to the future

Application

Session

Presentation

Transport

How SPDY fits in the OSI layer model.

Page 40: Felix HTTP - Paving the road to the future

SPDY vs WebSocketsSPDY WebSockets

Goal optimize HTTP 2-way communicationUpgradeability transparent needs works

Secure? ✔ (mandatory) ✔ (if needed)Two-way? ✔ / ✘ ✔

Multiplexed ✔ ✘

Prioritized ✔ ✘

Page 41: Felix HTTP - Paving the road to the future

DemoHTTP vs SPDY

Page 42: Felix HTTP - Paving the road to the future

Future Work

Page 43: Felix HTTP - Paving the road to the future

Finalize support for new HttpService specificationUpgrade to Jetty 9Allow “new style” WebSockets (JSR 356) to be usedImproved support for SPDY

Page 44: Felix HTTP - Paving the road to the future

Wrap Up

Page 45: Felix HTTP - Paving the road to the future

New/updated specificationsNew features, functionality & improvementsAvailable extensionsBuild modular web applications

Page 46: Felix HTTP - Paving the road to the future

Questions?

Page 47: Felix HTTP - Paving the road to the future

Linksfelix.apache.orgluminis-technologies.combndtools.orgamdatu.orgbitbucket.org/marrs/apachecon2014-felix-http