JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar
-
Upload
hujak-hrvatska-udruga-java-korisnika-croatian-java-user-association -
Category
Technology
-
view
1.396 -
download
2
description
Transcript of JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar
![Page 1: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/1.jpg)
![Page 2: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/2.jpg)
Using WildFly core to build high
performance web server
Tomaž Cerar, Red Hat
![Page 3: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/3.jpg)
Agenda
• Undertow
• WildFly core
• What are extensions
• Write simple extension• Write simple extension
• Undertow extension
• Demo
![Page 4: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/4.jpg)
WILDFLY CORE
![Page 5: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/5.jpg)
WildFly core
• Really small (< 15 mb)
• Consists of
– JBoss Modules
– Modular Service Controller (MSC)– Modular Service Controller (MSC)
– Domain management (CLI, rest)
– Deployment manager
– Logging
• Base for WildFly 8, EE7 certified app server
![Page 6: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/6.jpg)
JBoss Modules
• Modular class loader
• Concurrent class loader implementation
• Isolated class loader
• Each module consists of set of resources• Each module consists of set of resources
![Page 7: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/7.jpg)
Domain management
• Manages configuration
• Backbone for all extensions
• Accessible via
– Extensions– Extensions
– CLI
– Admin console
– DMR clients
– …
![Page 8: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/8.jpg)
Modular Service Controller
• Truly concurrent service container
• Handles service dependencies
• Handles lifecycle
• All “real” functionality should be in services• All “real” functionality should be in services
![Page 9: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/9.jpg)
DMR
• Detyped Model Representation
• JSON like
• Internal format for all operations
• Internal model (ModelNode)• Internal model (ModelNode)
• Resides in org.jboss.dmr package
• Really small
![Page 10: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/10.jpg)
UNDERTOW
![Page 11: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/11.jpg)
Undertow
• Highly concurrent web server
• Servlet 3.1 container
• HTTP / AJP / SSL Proxy server
• Supports Websocket implementation• Supports Websocket implementation
• Supports HTTP Upgrade
• Supports use of high performance non-blocking
handlers in servlet deployments
• Initial HTTP2 / Spdy support
![Page 12: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/12.jpg)
Why Another Webserver?
• A true non-blocking API (servlet is by itself
insufficient)
• Improved support for modern security standards
• Upgrade from HTTP to our native protocols• Upgrade from HTTP to our native protocols
• Allows WildFly to run in single port mode
• Support the latest network protocols naturally and
with minimal overhead
• Best possible performance and memory efficiency
• Handle complex routing use cases a la mod_rewrite
• Embeddable in standalone process / test environment
![Page 13: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/13.jpg)
What are extensions?
• Entry point for extending WildFly
• Can provide
– new deployment types
– new model– new model
– services
– resources
![Page 14: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/14.jpg)
Domain model definition
• Attributes
• Resources
• Resource tree
– PathElement– PathElement
– Single target (key=value)
– Multi target (key=*)
• Resolvers & multi language support
![Page 15: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/15.jpg)
Operation handlers
• Defines operations on resources
• Execution stage
– MODEL
– RUNTIME– RUNTIME
– VERIFY
– DOMAIN
– DONE
• Can be chained
![Page 16: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/16.jpg)
Resource handlers
• Every resource needs add & remove
• In MODEL phase
– validate and set model
• In RUNTIME phase• In RUNTIME phase
– Add services
– Add deployment processors
![Page 17: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/17.jpg)
Deployment manager
• Deployment repository
• Defines deployment phases
• Provides deployment processor infrastructure
• Can be used via• Can be used via
– Domain management
– Deployment scanner
![Page 18: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/18.jpg)
Deployment processor
• Hooks into deployment lifecycle
• Can modify deployment behavior
• Can define new deployment type
![Page 19: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/19.jpg)
Extension point
• Loaded via Service Loader
• Can define many subsystems
• Packaged as JBoss Module
• Referenced in configuration• Referenced in configuration
• Can provide any new functionality
![Page 20: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/20.jpg)
Extension loading
standalone.xml<extension module="org.wildfly.extension.sdd"/>
ServiceLoaderorg.jboss.as.controller.Extension
org.wildfly.extension.sdd.SDDExtension
![Page 21: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/21.jpg)
WRITING EXTENSIONS
![Page 22: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/22.jpg)
Building blocks
• Define Extension point
• Define Root Model
• Define Add handler
• Define XML parser • Define XML parser
• Define XML marshaller
![Page 23: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/23.jpg)
Extension class
public class UndertowExtension implements Extension {@Overridepublic void initializeParsers(ExtensionParsingContext context) {
}
@Override@Overridepublic void initialize(ExtensionContext context) {
}}
![Page 24: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/24.jpg)
Service Loader entry
• Point it to implementation class
– org.wildfly.extension.undertow.UndertowExtension
![Page 25: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/25.jpg)
Define root modelpublic class UndertowRootDefinition extends PersistentResourceDefinition {
protected static final SimpleAttributeDefinition STATISTICS_ENABLED =
new SimpleAttributeDefinitionBuilder("statistics-enabled", ModelType.BOOLEAN, true)
.setAllowExpression(true)
.setDefaultValue(new ModelNode(false))
.build();
static final UndertowRootDefinition INSTANCE = new UndertowRootDefinition ();static final UndertowRootDefinition INSTANCE = new UndertowRootDefinition ();
private SDDRootResource() {
super(UndertowExtension.SUBSYSTEM_PATH,
UndertowExtension.getResolver(),
UndertowSubsystemAdd.INSTANCE,
ReloadRequiredRemoveStepHandler.INSTANCE);
}
@Override
public Collection<AttributeDefinition> getAttributes() {
return Arrays.asList(ATTRIBUTES);
}
}
![Page 26: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/26.jpg)
Define root add handler
public class UndertowSubsystemAdd extends AbstractBoottimeAddStepHandler {
@Override
protected void populateModel(ModelNode operation, ModelNode model) throws OperationFailedException
{
for (AttributeDefinition def : UndertowRootDefinition. .INSTANCE.getAttributes()) {
def.validateAndSet(operation, model);
}}
}
![Page 27: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/27.jpg)
Define namespace
enum Namespace {
// must be first
UNKNOWN(null),
UNDERTOW_1_0("urn:jboss:domain:undertow:1.0");
/**
* The current namespace version.* The current namespace version.
*/
public static final Namespace CURRENT = UNDERTOW_1_1;
private final String name;
Namespace(final String name) {
this.name = name;
}
}
![Page 28: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/28.jpg)
Define XML model
<subsystem xmlns="urn:wildfly:domain:undertow:1.0“ statistics-enabled=“true”/>
![Page 29: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/29.jpg)
Define parserclass UndertowSubsystemParser_1_0 implements XMLStreamConstants,
XMLElementReader<List<ModelNode>> {
static final PersistentResourceXMLDescription xmlDescription =
builder(UndertowRootDefinition.INSTANCE).build();
@Override@Override
public void readElement(XMLExtendedStreamReader reader, List<ModelNode>
list) throws XMLStreamException {
xmlDescription.parse(reader, PathAddress.EMPTY_ADDRESS, list);
}
}
![Page 30: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/30.jpg)
Define marshaller
public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws
XMLStreamException {
xmlDescription.persist(writer, context.getModel(), Namespace.CURRENT.getUriString());
}
![Page 31: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/31.jpg)
Making it all work
@Override
public void initializeParsers(ExtensionParsingContext context) {
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, Namespace.UNDERTOW_1_0.getUriString(),
UndertowSubsystemParser_1_0.INSTANCE);
}
@Override
public void initialize(ExtensionContext context) {public void initialize(ExtensionContext context) {
final SubsystemRegistration subsystem =
context.registerSubsystem(SUBSYSTEM_NAME, 1, 0, 0);
final ManagementResourceRegistration registration =
subsystem.registerSubsystemModel(UnertowRootResource.INSTANCE);
subsystem.registerXMLElementWriter(UndertowSubsystemParser.INSTANCE);
}
![Page 32: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/32.jpg)
Module definition<module xmlns="urn:jboss:module:1.3" name="org.wildfly.extension.undertoworg.wildfly.extension.undertoworg.wildfly.extension.undertoworg.wildfly.extension.undertow">
<resources><artifact name="${org.wildfly:wildfly-undertow}"/>
</resources><dependencies><module name="io.undertow.core" services="import"/>
<module name="io.undertow.servlet" services="import"/><module name="io.undertow.jsp"/><module name="io.undertow.websocket"/><module name="javax.api"/><module name="javax.api"/><module name="javax.servlet.api"/><module name="javax.servlet.jsp.api"/><module name="javax.websocket.api"/><module name="org.jboss.jandex"/><module name="org.jboss.staxmapper"/><module name="org.jboss.as.controller"/><module name="org.jboss.as.server"/><module name="org.jboss.modules"/><module name="org.jboss.msc"/><module name="org.jboss.vfs"/><module name="org.jboss.logging"/>
</dependencies></module>
![Page 33: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/33.jpg)
![Page 34: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/34.jpg)
What does it do?
(almost) nothing!
![Page 35: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/35.jpg)
How to test it?
• Test harness enables you to test
– xml parser
– model consistency
– MSC services
– Compatibility (transformers)
– Localization resources
– …
![Page 36: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/36.jpg)
public class UndertowSubsystemTestCase extends AbstractSubsystemBaseTest {
public UndertowSubsystemTestCase() {super(“undertow”, new UndertowExtension());super(“undertow”, new UndertowExtension());
}
@Overrideprotected String getSubsystemXml() throws IOException {
return readResource(“undertow-1.0.xml");}
}
![Page 37: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/37.jpg)
Undertow extension
• Multiple servers & hosts per server support
• Each server can have multiple listeners
• Support AJP, HTTP, HTTPS listeners
• Servlet & WebSockets deployments support• Servlet & WebSockets deployments support
• SSO
• Session Management
• Proxy & LB mangament
• Filters & content handlers
• Predicates
• ….
![Page 38: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/38.jpg)
Demo
![Page 39: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/39.jpg)
• http://undertow.io/
• https://github.com/wildfly/wildfly
• http://www.wildfly.org/
![Page 40: JavaCro'14 - Using WildFly core to build high performance web server – Tomaž Cerar](https://reader034.fdocuments.net/reader034/viewer/2022042813/54b4ed794a79590a688b45ff/html5/thumbnails/40.jpg)
Questions?