Finished writing the chapter 2
This commit is contained in:
parent
5e00e14e17
commit
a579dabe25
@ -8,7 +8,7 @@
|
|||||||
<para>
|
<para>
|
||||||
In this chapter, we will examine what core functionalities are provided in
|
In this chapter, we will examine what core functionalities are provided in
|
||||||
Netty and how they constitute a complete network application development
|
Netty and how they constitute a complete network application development
|
||||||
stack.
|
stack on top of the core.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
@ -137,7 +137,7 @@
|
|||||||
It also allows you to implement your own event type without breaking the
|
It also allows you to implement your own event type without breaking the
|
||||||
existing code at all because each event type is distinguished from
|
existing code at all because each event type is distinguished from
|
||||||
each other by strict type hierarchy. This is another differentiator
|
each other by strict type hierarchy. This is another differentiator
|
||||||
against its competitors. Many NIO frameworks have no or very limited
|
against other frameworks. Many NIO frameworks have no or very limited
|
||||||
notion of event model; they often break the existing code when you try
|
notion of event model; they often break the existing code when you try
|
||||||
to add a new custom event type, or just do not allow extension.
|
to add a new custom event type, or just do not allow extension.
|
||||||
</para>
|
</para>
|
||||||
@ -174,7 +174,7 @@
|
|||||||
}
|
}
|
||||||
}</programlisting>
|
}</programlisting>
|
||||||
<para>
|
<para>
|
||||||
For more information about the event model of Netty, please refer to the
|
For more information about the event model, please refer to the
|
||||||
API documentation of &ChannelEvent; and &ChannelPipeline;.
|
API documentation of &ChannelEvent; and &ChannelPipeline;.
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
@ -193,9 +193,9 @@
|
|||||||
As demonstrated in <xref linkend="start.pojo"/>, it is always a good
|
As demonstrated in <xref linkend="start.pojo"/>, it is always a good
|
||||||
idea to separate a protocol codec from a business logic. However, there
|
idea to separate a protocol codec from a business logic. However, there
|
||||||
are some complications when implementing this idea from scratch. You
|
are some complications when implementing this idea from scratch. You
|
||||||
have to deal with the fragmentation of messages. Some protocols are a
|
have to deal with the fragmentation of messages. Some protocols are
|
||||||
multi-layered protocol built on top of other lower level protocol. Some
|
multi-layered (i.e. built on top of other lower level protocol). Some
|
||||||
are too complicated to be implemented as a single state machine.
|
are too complicated to be implemented in a single state machine.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Consequently, a good network application framework should provide an
|
Consequently, a good network application framework should provide an
|
||||||
@ -213,21 +213,86 @@
|
|||||||
<section>
|
<section>
|
||||||
<title>SSL / TLS Support</title>
|
<title>SSL / TLS Support</title>
|
||||||
<para>
|
<para>
|
||||||
|
Unlike old blocking I/O, it is a non-trivial task to support SSL in NIO.
|
||||||
|
You can't simply wrap a stream to encrypt or decrypt data but you have
|
||||||
|
to use <classname>javax.net.ssl.SSLEngine</classname>.
|
||||||
|
<classname>SSLEngine</classname> is a state machine which is as complex
|
||||||
|
as SSL is. You have to manage all possible states such as cipher suite
|
||||||
|
and encryption key negotiation (or re-negotiation), certificate
|
||||||
|
exchange and validation. Moreover, <classname>SSLEngine</classname> is
|
||||||
|
not even completely thread-safe unlike usual expectation.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In Netty, &SslHandler; takes care of all the gory details and pitfalls
|
||||||
|
of <classname>SSLEngine</classname>. All you need to do is to configure
|
||||||
|
and insert the &SslHandler; to your &ChannelPipeline;. It also allows
|
||||||
|
you to implement advanced features like
|
||||||
|
<ulink url="http://en.wikipedia.org/wiki/Starttls">StartTLS</ulink>
|
||||||
|
very easily.
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>HTTP Implementation</title>
|
<title>HTTP Implementation</title>
|
||||||
<para>
|
<para>
|
||||||
|
HTTP is definitely the most popular protocol in the Internet. There are
|
||||||
|
already a number of HTTP implementations such as a Servlet container.
|
||||||
|
Then why does Netty have HTTP on top of its core?
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Netty's HTTP support is very different from the existing HTTP libraries.
|
||||||
|
It gives you complete control over how HTTP messages are exchanged in a
|
||||||
|
low level. Because it is basically the combination of HTTP codec and
|
||||||
|
HTTP message classes, there is no restriction such as enforced thread
|
||||||
|
model. That is, you can write your own HTTP client or server that works
|
||||||
|
exactly the way you want. You have full control over thread model,
|
||||||
|
connection life cycle, chunked encoding, and as much as what HTTP
|
||||||
|
specification allows you to do.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Thanks to its highly customizable nature, you can write a very efficient
|
||||||
|
HTTP server such as:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Chat server that requires persistent connections and server push
|
||||||
|
technology (e.g. <ulink url="http://en.wikipedia.org/wiki/Comet_%28programming%29">Comet</ulink>)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Media streaming server that needs to keep the connection open
|
||||||
|
until the whole media is streamed (e.g. 2 hours of movie)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
File server that allows the upload of large files without memory
|
||||||
|
pressure (e.g. uploading 1GB per request)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Scalable mash-up client that connects to tens of thousand 3rd
|
||||||
|
party web services asynchronously
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<title>Google Protocol Buffer Integration</title>
|
<title>Google Protocol Buffer Integration</title>
|
||||||
<para>
|
<para>
|
||||||
|
<ulink url="http://code.google.com/apis/protocolbuffers/docs/overview.html">Google Protocol Buffers</ulink>
|
||||||
|
are an ideal solution for the rapid implementation of a highly efficient
|
||||||
|
binary protocol that evolves over time. With &ProtobufEncoder; and
|
||||||
|
&ProtobufDecoder;, you can turn the message classes generated by Google
|
||||||
|
Protocol Buffers Compiler (protoc) into Netty codec. Please take a look
|
||||||
|
into the <ulink url="&XRef;example/localtime/package-summary.html">'LocalTime' example</ulink>
|
||||||
|
that shows how easily you can create a high-performing binary protocol
|
||||||
|
client and server from the
|
||||||
|
<ulink url="http://anonsvn.jboss.org/repos/netty/trunk/src/main/java/org/jboss/netty/example/localtime/LocalTimeProtocol.proto">sample protocol definition</ulink>.
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
@ -235,7 +300,19 @@
|
|||||||
<section>
|
<section>
|
||||||
<title>Summary</title>
|
<title>Summary</title>
|
||||||
<para>
|
<para>
|
||||||
|
In this chapter, we reviewed the overall architecture of Netty from the
|
||||||
|
feature-wise standpoint. Netty has simple yet powerful architecture.
|
||||||
|
It is composed of three components - buffer, channel, and event model -
|
||||||
|
and all advanced features are built on top of the three core components.
|
||||||
|
Once you understood how these three work together, it should not be
|
||||||
|
difficult to understand more advanced features which were covered briefly
|
||||||
|
in this chapter.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You might still have an unanswered question about what the overall
|
||||||
|
architecture looks exactly like and how each feature work together.
|
||||||
|
If so, it is a good idea to <ulink url="&Community;">talk to us</ulink>
|
||||||
|
to improve this guide.
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user