java分布式系统通信框架

1.Jboss Netty项目-优秀的NIO框架
下载 http://www.jboss.org/netty/downloads.html
简介 http://www.jboss.org/netty
Jboss的Netty项目旨在提供异步驱动的网络应用程序的框架和工具, 可以用于快速开发, 可方便维护的、高性能的、高扩展性的服务器/客户端之间的通迅协议。
Plurk是一个快速成长,并且已经成为互联网上最大的几个使用python语言的网站之之一,Plurk尝试了以下一些框架/web容器:
Python Twisted:太耗资源了
Jetty:iGoogle的web容器,可惜一万并发的时候用了2G的内存
Apache Tomcat:太吃内存了
Apache MINA:文档很糟糕,可扩展性很差
最后,Plurk发现Netty非常优秀, 在一台四核的服务器上,10万的并发只用了some GB的内存和20%左右的CPU
JBoss社区最近发布了Netty 3.1.0,为用户提供了编写客户/服务网络应用的另一选择。Netty自称是:

    一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。

关于Netty的分类,它与Apache Mina和Grizzly属于同一舞台。该最新版本包含了一系列功能和性能、API可用性的增强。其中包括:

    * 更简单的大数据流(例子)
    * 更多可靠的OutOfMemoryError预防机制
    * 新的传输
          o 基于OIO和NIO的UDP传输
          o VM内传输
          o HTTP隧道
    * 与Google Protocol Buffers集成
    * 与JBoss Microcontainer、OSGI、Guice和Spring集成

HTTP隧道功能满足了用户的迫切需求,在早期发布说明中总结到:

    HTTP隧道传输(位于org.jboss.netty.channel.socket.http)是一种套接字传输,支持任意已经存在的套接字应用在HTTP之上通过代理传输。这种传输在需要越过防火墙而不修改现存服务器应用时特别有用。工作原理如下:

    Http隧道客户端套接字通道 --> 对HTTP友好的防火墙 --> Servlet容器 (如Tomcat、Jetty) --> Http隧道Servlet --> 你的服务器应用

当然在选择一个框架用于开发网络应用时,性能和可扩展性是重要因素。Netty团队在他们的网站上提供了性能信息。你也可以在Apache Mina网站上找到它的性能数据。Nicholas Hagen发布了一系列博文,记录了他如何选择 Mina、Grizzly或者Netty。最终他决定选用Netty,不过指出:

    总的来说,在性能、内存和功能使用方面,我倾向于Netty,而不是Mina和Grizzly。请注意你需要通过自己的分析来决定哪种框架适合你的需求。

Netty下一版本3.2.0,目前正在开发过程中。

JBoss社区最近发布了Netty 3.1.0,为用户提供了编写客户/服务网络应用的另一选择。Netty自称是:

    一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。

关于Netty的分类,它与Apache Mina和Grizzly属于同一舞台。该最新版本包含了一系列功能和性能、API可用性的增强。其中包括:

    * 更简单的大数据流(例子)
    * 更多可靠的OutOfMemoryError预防机制
    * 新的传输
          o 基于OIO和NIO的UDP传输
          o VM内传输
          o HTTP隧道
    * 与Google Protocol Buffers集成
    * 与JBoss Microcontainer、OSGI、Guice和Spring集成

HTTP隧道功能满足了用户的迫切需求,在早期发布说明中总结到:

    HTTP隧道传输(位于org.jboss.netty.channel.socket.http)是一种套接字传输,支持任意已经存在的套接字应用在HTTP之上通过代理传输。这种传输在需要越过防火墙而不修改现存服务器应用时特别有用。工作原理如下:

    Http隧道客户端套接字通道 --> 对HTTP友好的防火墙 --> Servlet容器 (如Tomcat、Jetty) --> Http隧道Servlet --> 你的服务器应用

当然在选择一个框架用于开发网络应用时,性能和可扩展性是重要因素。Netty团队在他们的网站上提供了性能信息。你也可以在Apache Mina网站上找到它的性能数据。Nicholas Hagen发布了一系列博文,记录了他如何选择 Mina、Grizzly或者Netty。最终他决定选用Netty,不过指出:

    总的来说,在性能、内存和功能使用方面,我倾向于Netty,而不是Mina和Grizzly。请注意你需要通过自己的分析来决定哪种框架适合你的需求。

Netty下一版本3.2.0,目前正在开发过程中,路线图可以在这里查看。


此版本的主要更新:
处理大容量数据流更简单
处理协议编码和单元测试更简单
I/O超时和idle状态检测
应用程序的关闭更简单,更安全
更可靠的OutOfMemoryError预防
新的传输方式:
   1.基于OIO和NIO的UDP传输
  2.本地传输(又名 in-VM传输)
  3.HTTP通道,可绕过防火墙
新的编码器:
   1.HTTP客户端和服务器端
   2.用于实现各种专有协议的工具
与其他技术的整合:
   1.Google Protocol Buffers
   2.JBoss Microcontainer, OSGi, Guice以及Spring



Java代码   收藏代码
  1. package example.helloword.server;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.util.concurrent.Executors;  
  5.   
  6. import org.jboss.netty.bootstrap.ServerBootstrap;  
  7. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;  
  8.   
  9. import example.helloword.NetConstant;  
  10.   
  11. public class Server  
  12. {  
  13.     private static Server server = new Server();  
  14.       
  15.     private ServerBootstrap bootstrap;  
  16.       
  17.     private Server()  
  18.     {}  
  19.       
  20.     public static Server getInstance()  
  21.     {  
  22.         return server;  
  23.     }  
  24.       
  25.     public void start()  
  26.     {  
  27.         bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(  
  28.                 Executors.newCachedThreadPool(), Executors  
  29.                         .newCachedThreadPool()));  
  30.         bootstrap.setPipelineFactory(new ServerPipelineFactory());  
  31.         bootstrap.bind(new InetSocketAddress(NetConstant.server_port));  
  32.     }  
  33.       
  34.     public void stop()  
  35.     {  
  36.         bootstrap.releaseExternalResources();  
  37.     }  
  38.       
  39.     public static void main(String[] args)  
  40.     {  
  41.         Server server = Server.getInstance();  
  42.         server.start();  
  43.     }  
  44. }  
Java代码   收藏代码
  1. package example.helloword.server;  
  2.   
  3. import static org.jboss.netty.channel.Channels.pipeline;  
  4.   
  5. import org.jboss.netty.channel.ChannelPipeline;  
  6. import org.jboss.netty.channel.ChannelPipelineFactory;  
  7. import org.jboss.netty.handler.codec.string.StringDecoder;  
  8. import org.jboss.netty.handler.codec.string.StringEncoder;  
  9.   
  10. public class ServerPipelineFactory implements ChannelPipelineFactory  
  11. {  
  12.     public ChannelPipeline getPipeline() throws Exception  
  13.     {  
  14.         ChannelPipeline pipleline = pipeline();  
  15.         pipleline.addLast("encode"new StringEncoder());  
  16.         pipleline.addLast("decode"new StringDecoder());  
  17.         pipleline.addLast("handler"new ServerHandler());  
  18.         return pipleline;  
  19.     }  
  20. }  
Java代码   收藏代码
  1. package example.helloword.server;  
  2.   
  3. import org.jboss.netty.channel.ChannelHandlerContext;  
  4. import org.jboss.netty.channel.ExceptionEvent;  
  5. import org.jboss.netty.channel.MessageEvent;  
  6. import org.jboss.netty.channel.SimpleChannelUpstreamHandler;  
  7.   
  8. public class ServerHandler extends SimpleChannelUpstreamHandler  
  9. {  
  10.     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)  
  11.             throws Exception  
  12.     {  
  13.         System.out.println("recive message,message content:" + e.getMessage());  
  14.         e.getChannel().write("byte");  
  15.           
  16.     }  
  17.       
  18.     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)  
  19.             throws Exception  
  20.     {  
  21.         e.getChannel().close();  
  22.     }  
  23. }  
Java代码   收藏代码
  1. package example.helloword.client22;  
  2.   
  3. import static org.jboss.netty.channel.Channels.pipeline;  
  4.   
  5. import org.jboss.netty.channel.ChannelPipeline;  
  6. import org.jboss.netty.channel.ChannelPipelineFactory;  
  7. import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;  
  8. import org.jboss.netty.handler.codec.frame.LengthFieldPrepender;  
  9. import org.jboss.netty.handler.codec.string.StringDecoder;  
  10. import org.jboss.netty.handler.codec.string.StringEncoder;  
  11.   
  12. public class ClientPipelineFactory implements ChannelPipelineFactory  
  13. {  
  14.     public ChannelPipeline getPipeline() throws Exception  
  15.     {  
  16.         ChannelPipeline pipleline = pipeline();    
  17.         pipleline.addLast("frameDecoder"new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0404));    
  18.         pipleline.addLast("frameEncode"new LengthFieldPrepender(4false));  
  19.         pipleline.addLast("encode"new StringEncoder());    
  20.         pipleline.addLast("decode"new StringDecoder());    
  21.         pipleline.addLast("handler"new ClinetHandler());    
  22.         return pipleline;    
  23.     }  
  24. }  
Java代码   收藏代码
  1. package example.helloword.client22;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.util.concurrent.Executors;  
  5.   
  6. import org.jboss.netty.bootstrap.ClientBootstrap;  
  7. import org.jboss.netty.channel.ChannelFuture;  
  8. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;  
  9.   
  10. import example.helloword.NetConstant;  
  11. import example.helloword.client2.ClientPipelineFactory;  
  12.   
  13. public class ClientPool  
  14. {  
  15.     public static ClientPool clientPool = new ClientPool();  
  16.       
  17.     private ClientBootstrap bootstrap;  
  18.       
  19.     private ClientPool()  
  20.     {  
  21.         bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(  
  22.                 Executors.newCachedThreadPool(), Executors  
  23.                         .newCachedThreadPool()));  
  24.           
  25.         bootstrap.setPipelineFactory(new ClientPipelineFactory());  
  26.         bootstrap.setOption("tcpNoDelay"true);  
  27.         bootstrap.setOption("keepAlive"true);  
  28.     }  
  29.       
  30.     public static ClientPool getInstance()  
  31.     {  
  32.         return clientPool;  
  33.     }  
  34.       
  35.     public void getChannelFuture(String host, int port, String message)  
  36.     {  
  37.         ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,  
  38.                 NetConstant.server_port));  
  39.         future.awaitUninterruptibly();  
  40.         if (!future.isSuccess())  
  41.         {  
  42.             future.getCause().printStackTrace();  
  43.             future.getChannel().getCloseFuture().awaitUninterruptibly();   
  44.             return;  
  45.         }  
  46.         future.getChannel().write(message);  
  47.     }  
  48.       
  49.     public static void main(String[] args) throws InterruptedException  
  50.     {  
  51.         for (int i = 0; i < 1000; i++)  
  52.         {  
  53.             ClientPool.getInstance().getChannelFuture("127.0.0.1"0,  
  54.                     "test" + i);  
  55.             Thread.sleep(1000 * 3);  
  56.         }  
  57.     }  
  58. }  

2、apache mina
下载 http://mina.apache.org/downloads.html
Java代码   收藏代码
  1. public class Test {  
  2.     public static void main(String[] args) throws IOException {  
  3.         HttpServer httpServer;  
  4.         httpServer = HttpServer.create(new InetSocketAddress(81), 5);  
  5.         httpServer.createContext("/"new Handler());  
  6.         httpServer.start();  
  7.     }  
  8.   
  9.     static class Handler implements HttpHandler {  
  10.         public void handle(HttpExchange exchange) throws IOException {  
  11.             Headers requestHeaders = exchange.getRequestHeaders();  
  12.             Headers responseHeaders = exchange.getResponseHeaders();  
  13.             responseHeaders.set("Content-Type""text/plain");  
  14.             exchange.sendResponseHeaders(200, 0L);  
  15.             OutputStream responseBody = new BufferedOutputStream(exchange.getResponseBody(), 64*1024);  
  16.             responseBody.write("Hello!".getBytes());  
  17.             responseBody.close();  
  18.             exchange.close();  
  19.         }  
  20.     }  
  21. }  
Java代码   收藏代码
  1. import java.net.InetSocketAddress;  
  2.   
  3. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  4. import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;  
  5. import org.apache.mina.filter.ssl.SslFilter;  
  6. import org.apache.mina.transport.socket.SocketAcceptor;  
  7. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  8.   
  9. /** 
  10.  * (<b>Entry point</b>) Echo server 
  11.  * 
  12.  * @author The Apache MINA Project (dev@mina.apache.org) 
  13.  * @version $Rev: 677923 $, $Date: 2008-07-18 16:55:24 +0200 (Fri, 18 Jul 2008) $ 
  14.  */  
  15. public class Main {  
  16.     /** Choose your favorite port number. */  
  17.     private static final int PORT = 8080;  
  18.   
  19.     /** Set this to true if you want to make the server SSL */  
  20.     private static final boolean USE_SSL = false;  
  21.   
  22.     public static void main(String[] args) throws Exception {  
  23.         SocketAcceptor acceptor = new NioSocketAcceptor();  
  24.         DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
  25.           
  26.   
  27.         // Bind  
  28.         acceptor.setHandler(new EchoProtocolHandler());  
  29.         acceptor.bind(new InetSocketAddress(PORT));  
  30.   
  31.         System.out.println("Listening on port " + PORT);  
  32.           
  33.         for (;;) {  
  34.             System.out.println("R: " + acceptor.getStatistics().getReadBytesThroughput() +   
  35.                 ", W: " + acceptor.getStatistics().getWrittenBytesThroughput());  
  36.             Thread.sleep(3000);  
  37.         }  
  38.     }  
  39.   
  40.  }  
Java代码   收藏代码
  1. import org.apache.mina.core.buffer.IoBuffer;  
  2. import org.apache.mina.core.service.IoHandler;  
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IdleStatus;  
  5. import org.apache.mina.core.session.IoSession;  
  6. import org.apache.mina.filter.ssl.SslFilter;  
  7. import org.slf4j.Logger;  
  8. import org.slf4j.LoggerFactory;  
  9.   
  10. /** 
  11.  * {@link IoHandler} implementation for echo server. 
  12.  * 
  13.  * @author The Apache MINA Project (dev@mina.apache.org) 
  14.  * @version $Rev: 713957 $, $Date: 2008-11-14 10:27:16 +0100 (Fri, 14 Nov 2008) $, 
  15.  */  
  16. public class EchoProtocolHandler extends IoHandlerAdapter {  
  17.     private final Logger logger = LoggerFactory.getLogger(getClass());  
  18.       
  19.     @Override  
  20.     public void sessionCreated(IoSession session) {  
  21.         session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);  
  22.   
  23.         // We're going to use SSL negotiation notification.  
  24.         session.setAttribute(SslFilter.USE_NOTIFICATION);  
  25.     }  
  26.   
  27.     @Override  
  28.     public void sessionClosed(IoSession session) throws Exception {  
  29.         logger.info("CLOSED");  
  30.     }  
  31.   
  32.     @Override  
  33.     public void sessionOpened(IoSession session) throws Exception {  
  34.         logger.info("OPENED");  
  35.     }  
  36.   
  37.     @Override  
  38.     public void sessionIdle(IoSession session, IdleStatus status) {  
  39.         logger.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE) + " ***");  
  40.     }  
  41.   
  42.     @Override  
  43.     public void exceptionCaught(IoSession session, Throwable cause) {  
  44.         session.close(true);  
  45.     }  
  46.   
  47.     @Override  
  48.     public void messageReceived(IoSession session, Object message)  
  49.             throws Exception {  
  50.         // Write the received data back to remote peer  
  51.         session.write(((IoBuffer) message).duplicate());  
  52.     }  
  53. }  
Java代码   收藏代码
  1. public class Test {  
  2.     public static void main(String[] args) throws IOException {  
  3.         HttpServer httpServer;  
  4.         httpServer = HttpServer.create(new InetSocketAddress(81), 5);  
  5.         httpServer.createContext("/"new Handler());  
  6.         httpServer.start();  
  7.     }  
  8.   
  9.     static class Handler implements HttpHandler {  
  10.         public void handle(HttpExchange exchange) throws IOException {  
  11.             Headers requestHeaders = exchange.getRequestHeaders();  
  12.             Headers responseHeaders = exchange.getResponseHeaders();  
  13.             responseHeaders.set("Content-Type""text/plain");  
  14.             exchange.sendResponseHeaders(200, 0L);  
  15.             OutputStream responseBody = new BufferedOutputStream(exchange.getResponseBody(), 64*1024);  
  16.             responseBody.write("Hello!".getBytes());  
  17.             responseBody.close();  
  18.             exchange.close();  
  19.         }  
  20.     }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值