`
dreamworker
  • 浏览: 3615 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Netty+Kryo实现高性能网络通信

阅读更多

netty 是 开源的基于java的网络通信框架,其中java对象的传输,netty使用的是java原生的序列化/反序列化实现的,而Kryo是性能更好的java序列化框架,能否让netty和kryo结合,实现高性能的数据通信呢?下面就是如何实现。

 

首先,模仿Netty自带的ObjectEncoder,写一个kryo序列化的ObjectEncoder:

import static org.jboss.netty.buffer.ChannelBuffers.dynamicBuffer;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferOutputStream;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Output;

public class ObjectKryoEncoder extends OneToOneEncoder {
	private static final byte[] LENGTH_PLACEHOLDER = new byte[4];
	
	@Override
	protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
        ChannelBufferOutputStream bout =
            new ChannelBufferOutputStream(dynamicBuffer(
                    4096, ctx.getChannel().getConfig().getBufferFactory()));
        bout.write(LENGTH_PLACEHOLDER);
        
        Kryo kryo = new Kryo();
        Output output = new Output(bout);
        kryo.writeClassAndObject(output, msg);
		output.flush();
		output.close();
		
        ChannelBuffer encoded = bout.buffer();
        encoded.setInt(0, encoded.writerIndex() - 4);
        return encoded;
	}
}

 

接下来,模仿Netty自带的ObjectDecoder,写一个kryo序列化的ObjectDecoder:

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferInputStream;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;

public class ObjectKryoDecoder extends LengthFieldBasedFrameDecoder {
    public ObjectKryoDecoder() {
        this(10485760);
    }

    public ObjectKryoDecoder(int maxObjectSize) {
    	super(maxObjectSize, 0, 4, 0, 4);
    }
    
    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
        ChannelBuffer frame = (ChannelBuffer) super.decode(ctx, channel, buffer);
        if (frame == null) {
            return null;
        }
        Kryo kryo = new Kryo();
		Input input = null;
		try {
			input = new Input(new ChannelBufferInputStream(frame));
			return kryo.readClassAndObject(input);
		} finally {
			input.close();
		}
    }
}

 以上的Encoder和Decoder都是kryo序列化的版本,将其注入ChannelPipelineFactory 中即可:

	ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
	bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
		public ChannelPipeline getPipeline() {
			ChannelPipeline pipeline = Channels.pipeline();
			pipeline.addLast("decoder", new ObjectKryoDecoder());
			pipeline.addLast("encoder", new ObjectKryoEncoder());
			pipeline.addLast("handler", new TimeClientHandler3());
			return pipeline;
		}
	});
......

 

分享到:
评论

相关推荐

    netty传输kryo序列化的对象基于socket传输

    Netty作为一个高性能、异步的网络应用框架,广泛应用于TCP/IP协议栈的实现,如HTTP、FTP、SMTP等。Kryo则是一种高效的Java对象序列化库,能够快速地序列化和反序列化对象,尤其适合于内存有限或者需要高速传输数据的...

    Netty 是如何支撑高性能网络通信的.docx

    Netty 是一个高性能的网络通信框架,其设计和实现的核心目标是提高系统在高并发环境下的吞吐量和响应速度,以满足各种大数据处理、互联网消息中间件、游戏和...这种设计使得Netty成为各种高性能网络应用的首选框架。

    基于Netty的高性能RPC框架 .zip

    高性能基于Netty的高性能网络通信。 多序列化支持支持Kryo、Hessian、Protostuff等多种序列化方式。 Spring集成通过Spring容器管理服务生命周期。 异步回调支持异步RPC调用,提升客户端并行吞吐量。 JMX监控...

    netty传输对象源码

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty传输对象源码”的主题中,我们将深入理解如何使用Netty来传输自定义的对象,同时结合Spring和...

    Netty服务端与客户端依靠Java序列化传输数据

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Java世界中,序列化是将对象转换为字节流以便在网络间或存储系统中传输的一种常见技术。Java序列化是Java...

    Netty面试题(2022最新版)

    综上所述,Netty凭借其高性能、灵活性和易用性等特点,在众多网络通信框架中脱颖而出,成为了很多大型分布式系统的首选通信组件。无论是从技术角度还是从实际应用场景来看,Netty都有着不可替代的地位。

    基于Netty框架的RPC远程调用系统.zip

    Kryo序列化使用Kryo库进行高效的序列化和反序列化,适用于高性能场景。 JSON序列化使用JSON格式进行序列化和反序列化,适用于需要跨语言交互的场景。 3. 负载均衡 随机负载均衡从服务实例列表中随机选择一个...

    guide-rpc-framework-master.zip

    1. **Netty**:Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在RPC框架中,Netty作为底层通信库,负责处理网络I/O,提供了高效的数据传输能力,支持TCP、...

    34_dubbo都支持哪些通信协议以及序列化协议?.zip

    " 暗示了我们即将探讨的是关于Dubbo框架在网络通信和数据序列化方面的内容。Dubbo是阿里巴巴开源的一个高性能、轻量级的Java服务治理框架,它为分布式应用提供了服务调用、注册与发现、监控等能力。在实现远程服务...

    memcached-session-manager tomcat7

    `netty`是一个高性能的异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。而`spymemcached`是Java实现的Memcached客户端,它基于Netty构建,提供了与Memcached服务器交互的功能。 `...

    memcached用到的包

    4. **其他辅助库**:可能还会有一些辅助性的库,如netty(用于网络通信)、slf4j(日志框架)或Guava(Google的工具集,包含各种实用工具类)。这些库可以增强客户端的功能并提供更好的日志记录或内存管理。 使用...

    深入解析Spark中的RPC

    1. **Netty基础**:Spark基于Netty4构建网络通信层,利用其高性能的NIO框架,实现低延迟、高吞吐的网络通信。 2. **序列化/反序列化**:Spark使用Kryo或Java序列化库进行数据交换,确保高效的数据转换。 3. **...

    史上最全40道Dubbo面试题!.zip

    Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要为企业级应用提供分布式服务调用、服务注册与发现、负载均衡、容错、监控等解决方案。本资料集合了史上最全的40道Dubbo面试题,涵盖了Dubbo的...

    dubbo升级版jar

    1. **网络通信优化**:dubbox对Netty网络库进行了深度定制,提高了网络通信的效率和稳定性。 2. **序列化优化**:dubbox支持多种序列化方式,如Hessian2、FastJson、Kryo等,并对这些方式进行性能调优,降低了数据...

    2023年1月最新dubbo面试题

    Dubbo 是一个高性能、轻量级的开源 Java RPC 框架,广泛应用于微服务架构中。本篇文章将深入解析2023年1月的最新 Dubbo 面试题,帮助你掌握 Dubbo 的核心概念和技术要点。 首先,我们需要理解 Dubbo 的工作原理。...

    tomcat-7.0.54配合使用的memcached-session-manager1.6.1的整套jar包

    而Memcached则是一种高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提升应用性能。当面对高并发、大量用户访问的情况时,传统的session管理方式可能会成为性能瓶颈。为了优化这个问题,我们可以使用`...

    异步复制与同步复制 以及ehcache的小tips和我的配置

    2. **网络通信**:Ehcache使用Netty作为默认的网络通信库,确保高效的数据传输。你需要配置节点间的通信参数,如端口、连接超时等。 3. **集群配置**:在分布式环境下,需要配置集群信息,包括节点列表、集群间的...

    某二本非计算机专业16年毕业,50万年薪大佬学习总结-尚硅谷大数据技术之Spark总结

    Spark的内部通信基于网络IO,早期采用AKKA,现在更多地使用Netty作为通信框架。通信方式包括阻塞式(BIO)、非阻塞式(NIO)和异步(AIO)。在Linux上,AIO的性能提升并不显著,因为其底层仍使用EPOLL,而Netty更倾向于在...

Global site tag (gtag.js) - Google Analytics