`
dreamworker
  • 浏览: 3643 次
  • 性别: 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+Zookeeper的Java RPC框架设计源码及教程

    本项目通过Netty的高效网络通信,Kryo的快速序列化,以及Zookeeper的稳定协调,构建了一个高效、稳定且易于扩展的RPC框架。开发者可以通过这个项目的学习,提升自己在分布式系统设计和开发方面的专业技能,为构建高...

    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通信框架和Kryo序列化协议的Spring集成Nexus RPC框架设计源码

    Netty作为一个高性能的网络应用框架,它基于Java NIO(New Input/Output)库,提供了异步事件驱动的网络应用程序框架和工具,适用于处理高并发场景。使用Netty作为底层通信机制,可以极大地提高RPC调用的响应速度和...

    Netty面试题(2024最新版).docx

    Netty是一个高性能的...总体来说,Netty作为一个高效的网络编程框架,在网络通信、高性能处理、异步事件驱动模型等方面展示了其优势,适应了分布式系统和高并发场景的需求,是Java开发者在网络编程中的重要工具之一。

    netty传输对象源码

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

    基于Java实现的轻量级高性能RPC框架设计源码

    为了达到高性能,该RPC框架可能采取了多种策略,比如使用Netty这样的高效网络通信框架来处理底层的I/O操作,利用高性能的序列化工具如Kryo来减少数据在网络中的传输量,以及采用异步通信机制来提升系统的吞吐量。...

    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的工具集,包含各种实用工具类)。这些库可以增强客户端的功能并提供更好的日志记录或内存管理。 使用...

    Nexus-spiNexus-spi

    这些技术通常与Nexus集成,以实现高性能的网络通信、依赖注入和对象序列化等功能。尽管这些技术与Nexus的spi机制不是直接相关,但它们对于理解Nexus整个系统架构和扩展插件的开发环境是十分重要的。 在标签"spi"中...

    深入解析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等,并对这些方式进行性能调优,降低了数据...

Global site tag (gtag.js) - Google Analytics