`
lobin
  • 浏览: 425315 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hessian远程调用(基于Netty)

 
阅读更多

 

public class HessianMethodInvocation implements InvocationHandler, Serializable {

	private static final long serialVersionUID = 7304512179586775133L;
	
	private TestServiceImpl testService;
	private HessianSkeleton skeleton;
	
	private AbstractHessianInput input;
	private AbstractHessianOutput output;
	
	public HessianMethodInvocation(AbstractHessianInput input, AbstractHessianOutput output) {
		testService = new TestServiceImpl();
		skeleton = new HessianSkeleton(testService, TestService.class);
		
		this.input = input;
		this.output = output;
	}
	
	public void invoke() {
		try {
			skeleton.invoke(input, output);
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		return null;
	}

}

 

 

public class HessianDecoder extends ByteToMessageDecoder {

	private final ClassResolver classResolver;
	
	private static TestServiceImpl testService;
	
	private static HessianSkeleton skeleton;
	
	static {
		testService = new TestServiceImpl();
		
		skeleton = new HessianSkeleton(testService, TestService.class);
	}
	
	public HessianDecoder(ClassResolver classResolver) {
        this(1048576, classResolver);
    }
	
	public HessianDecoder(int maxObjectSize, ClassResolver classResolver) {
        super();
        this.classResolver = classResolver;
    }

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
		int length = in.readInt();
		
		ByteBuf frame = Unpooled.buffer(length);
		in.readBytes(frame);
        if (frame == null) {
            return;
        }
        
        ByteArrayInputStream is = new ByteArrayInputStream(frame.array());
		
		
		OutputStream osToUse = new ByteArrayOutputStream();
		
		AbstractHessianInput input = new HessianInput(is);
		AbstractHessianOutput output = new HessianOutput(osToUse);
		
		HessianMethodInvocation invocation = new HessianMethodInvocation(input, output);
        if (invocation != null) {
            out.add(invocation);
        }
	}
}

 

 

            public void initChannel(SocketChannel ch) throws Exception {
                ChannelPipeline p = ch.pipeline();
//                if (sslCtx != null) {
//                    p.addLast(sslCtx.newHandler(ch.alloc()));
//                }
//                p.addLast(new LoggingHandler(LogLevel.INFO));
                p.addLast(
                    new HessianDecoder(ClassResolvers.cacheDisabled(null)),
                    new HessianMethodInvocationHandler());
            }

 

 

class HessianMethodInvocationHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
    	System.out.println(msg.getClass().getName());
    	if (! (msg instanceof HessianMethodInvocation)) {
    		
    	}
    	HessianMethodInvocation invocation = (HessianMethodInvocation) msg;
    	invocation.invoke();
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}

 

 

public class HessianMethodInvocationProxy implements InvocationHandler, Serializable {

	private static final long serialVersionUID = 6587104138220238229L;
	
	private String method;
	private Object[] args;
	
	public HessianMethodInvocationProxy(String method, Object[] args) {
		this.method = method;
		this.args = args;
	}
	
	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public Object[] getArgs() {
		return args;
	}

	public void setArgs(Object[] args) {
		this.args = args;
	}

	public void invoke(ChannelHandlerContext ctx) {
		ctx.writeAndFlush(this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		return null;
	}

}

 

 

public class HessianEncoder extends MessageToByteEncoder<Serializable> {

	private static final byte[] LENGTH_PLACEHOLDER = new byte[4];
	
	@Override
	protected void encode(ChannelHandlerContext ctx, Serializable msg, ByteBuf out) throws Exception {
		if (! (msg instanceof HessianMethodInvocationProxy)) {
			
		}
		HessianMethodInvocationProxy proxy = (HessianMethodInvocationProxy) msg;
		int startIdx = out.writerIndex();

        ByteBufOutputStream bout = new ByteBufOutputStream(out);
//        ObjectOutputStream oout = null;
        try {
            bout.write(LENGTH_PLACEHOLDER);
            
            ByteArrayOutputStream osToUse = new ByteArrayOutputStream();
			AbstractHessianOutput output = new HessianOutput(osToUse);
			try {
				output.call(proxy.getMethod(), proxy.getArgs());
			} catch (Throwable e) {
				e.printStackTrace();
			}
			bout.write(osToUse.toByteArray());
        } finally {
                bout.close();
        }

        int endIdx = out.writerIndex();

        out.setInt(startIdx, endIdx - startIdx - 4);
	}

}

 

 

				public void initChannel(SocketChannel ch) throws Exception {
					ChannelPipeline p = ch.pipeline();
//					if (sslCtx != null) {
//						p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));
//					}
					p.addLast(new HessianEncoder());
					p.addLast(new HessianMethodInvocationHandlerProxy());
				}

 

 

class HessianMethodInvocationHandlerProxy extends ChannelInboundHandlerAdapter {

	/**
	 * Creates a client-side handler.
	 */
	public HessianMethodInvocationHandlerProxy() {
		//TODO
	}


	@Override
	public void channelActive(ChannelHandlerContext ctx) {
		HessianMethodInvocationProxy proxy = new HessianMethodInvocationProxy("test", new Object[] {"helloworld1234567"});
		proxy.invoke(ctx);
	}


	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) {
		System.out.println(msg);
	}


	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) {
		ctx.flush();
	}


	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		// Close the connection when an exception is raised.
		cause.printStackTrace();
		ctx.close();
	}
}

 

分享到:
评论

相关推荐

    基于Netty实现了dubbo rpc

    Netty基于IO多路复用模型,如Java的NIO(Non-blocking IO)或epoll,通过selector监听多个通道,实现高效的并发处理。其核心组件包括Bootstrap(引导类)、Channel(通道)、Pipeline(处理链)等,这些组件协同工作...

    基于Netty的TCP传输层的Java实现Hessian RPC组件设计源码

    该项目为基于Netty实现的Hessian RPC组件,专注于TCP传输层,源码包含31个文件,其中涵盖21个Java源文件、3个XML配置文件、1个Git忽略文件、1个项目文件以及1个Markdown文件。项目旨在提供一个高效、可靠的Java实现...

    基于netty的手写rpc框架

    在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...

    基于netty轻量的高性能分布式RPC服务框架.zip

    RPC允许在分布式系统中进行远程调用,仿佛调用本地方法一样,极大地简化了分布式服务的开发。Netty由于其高效的NIO模型和丰富的功能,成为构建RPC框架的理想选择。下面,我们将会讨论以下几个关键知识点: 1. **...

    rpc 远程调用

    为了实现这一点,客户端需要一个代理对象,这个代理对象负责将本地的接口调用转化为远程调用。例如,Spring框架的`JDK Proxy`或`CGLIB`可以用来创建动态代理,使得客户端可以透明地调用远程服务。 2. **序列化与反...

    如何用Netty写一个自己的RPC框架

    Netty是一个基于Java的高性能、高可靠性的网络应用程序框架,广泛用于实现各种网络协议,尤其是在需要处理大量并发连接的场景下。RPC(Remote Procedure Call)即远程过程调用,它是一种计算机通信协议。该协议允许...

    使用netty自定义rpc通信框架

    本项目是基于Netty 4.0实现的自定义RPC通信框架,旨在为Java开发者提供一种高效、灵活的远程服务调用解决方案。 首先,我们来深入理解Netty的基本概念。Netty的核心是其NIO(非阻塞I/O)模型,它使用了Reactor模式...

    Hprose 全名是高性能远程对象服务引擎.rar

    目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...

    netty springmvc dubbo 集成实例

    Dubbo是阿里巴巴开源的一款高性能的RPC框架,它专注于服务之间的远程调用,使得服务调用就像调用本地方法一样简单。Dubbo支持多种协议,如dubbo、http、hessian等,并且可以与Spring无缝集成,方便地管理服务的生命...

    srpc:一个基于netty的简单快速的rpc,没有痛苦

    总结,srpc是一个基于Netty的Java RPC框架,旨在提供简单、快速且无痛苦的远程调用体验。通过深入研究srpc的源码,开发者不仅可以掌握RPC的基本概念和实现,还能进一步提升对Netty和Java分布式系统开发的理解。

    Netty Rpc框架

    Netty Rpc框架是一种基于Java的高性能网络通信库——Netty实现的远程过程调用(RPC)框架。Netty以其高效、稳定和灵活的设计在Java世界中广受赞誉,而Netty Rpc则是利用Netty的强大能力,构建了一种使得分布式系统间...

    netty实现自定义rpc.zip

    RPC的核心是将远程服务调用的过程透明化,使它看起来就像是本地方法调用一样。这涉及到序列化、网络通信和反序列化等关键步骤。在Netty中,我们可以利用它的ChannelHandler来处理这些过程。 1. **序列化与反序列化*...

    dubbo-admin-0.2.0.jar

    Dubbo是一款基于Netty的高性能、轻量级的RPC框架,其主要功能包括:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现、依赖分析与降级。支持dubbo、rmi、hessian、http、webservice、thrift、...

    Dubbo 19道面试题及答案.docx

    1. 透明化的远程调用:开发者无需关注远程通信细节,只需要像调用本地方法一样调用远程服务。 2. 软负载均衡和容错机制:Dubbo内置了多种负载均衡策略,如随机、轮询等,能够在服务消费者端实现负载均衡,同时提供了...

    基于Dubbo的分布式框架研究.docx

    b)服务间通过远程调用(RPC)方式通信,此时服务框架(如Dubbo)和分布式服务框架是核心。3.分布式服务架构a)随着业务发展,服务数量激增,为解决服务间的依赖问题,引入服务注册与发现机制,并对服务进行分组治理。...

    netty实例与自定义实现RPC代码

    RPC(Remote Procedure Call)是一种使程序能够执行远程计算机系统上的过程调用的技术。本实例将探讨如何使用Netty来实现自定义的RPC框架。 在RPC框架中,主要包括三个组件:服务提供者(RPC-Provider)、服务消费...

    Dubbo面试28题答案详解:核心功能+服务治理+架构设计等.docx

    Dubbo是一个由阿里巴巴开源的高性能、分布式的RPC(远程调用协议)服务框架。它旨在简化服务之间的通信,提供服务的自动注册、自动发现等功能,从而实现服务治理。Dubbo能够与Spring框架无缝集成,使得开发者可以像...

    深入理解Dubbo框架:从基本原理到模拟实践的全面解析

    2. **接口级别调用**:Dubbo支持基于接口的远程调用,这使得服务调用与远程通信解耦,提高了代码的可读性和可维护性。 3. **高性能通信**:Dubbo使用Netty作为默认的NIO通信框架,提供高效的异步传输和编解码能力。...

    SOFARPC框架 v5.12.0.zip

    2. **高性能通信**:基于Netty网络库,SOFARPC实现了高效的异步非阻塞I/O模型,提高了并发处理能力。同时,它支持多种序列化协议,如FastJSON、Hessian2、Protobuf等,为数据传输提供了高速度和低内存占用。 3. **...

Global site tag (gtag.js) - Google Analytics