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基于IO多路复用模型,如Java的NIO(Non-blocking IO)或epoll,通过selector监听多个通道,实现高效的并发处理。其核心组件包括Bootstrap(引导类)、Channel(通道)、Pipeline(处理链)等,这些组件协同工作...
该项目为基于Netty实现的Hessian RPC组件,专注于TCP传输层,源码包含31个文件,其中涵盖21个Java源文件、3个XML配置文件、1个Git忽略文件、1个项目文件以及1个Markdown文件。项目旨在提供一个高效、可靠的Java实现...
在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...
RPC允许在分布式系统中进行远程调用,仿佛调用本地方法一样,极大地简化了分布式服务的开发。Netty由于其高效的NIO模型和丰富的功能,成为构建RPC框架的理想选择。下面,我们将会讨论以下几个关键知识点: 1. **...
为了实现这一点,客户端需要一个代理对象,这个代理对象负责将本地的接口调用转化为远程调用。例如,Spring框架的`JDK Proxy`或`CGLIB`可以用来创建动态代理,使得客户端可以透明地调用远程服务。 2. **序列化与反...
Netty是一个基于Java的高性能、高可靠性的网络应用程序框架,广泛用于实现各种网络协议,尤其是在需要处理大量并发连接的场景下。RPC(Remote Procedure Call)即远程过程调用,它是一种计算机通信协议。该协议允许...
本项目是基于Netty 4.0实现的自定义RPC通信框架,旨在为Java开发者提供一种高效、灵活的远程服务调用解决方案。 首先,我们来深入理解Netty的基本概念。Netty的核心是其NIO(非阻塞I/O)模型,它使用了Reactor模式...
目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...
Dubbo是阿里巴巴开源的一款高性能的RPC框架,它专注于服务之间的远程调用,使得服务调用就像调用本地方法一样简单。Dubbo支持多种协议,如dubbo、http、hessian等,并且可以与Spring无缝集成,方便地管理服务的生命...
总结,srpc是一个基于Netty的Java RPC框架,旨在提供简单、快速且无痛苦的远程调用体验。通过深入研究srpc的源码,开发者不仅可以掌握RPC的基本概念和实现,还能进一步提升对Netty和Java分布式系统开发的理解。
Netty Rpc框架是一种基于Java的高性能网络通信库——Netty实现的远程过程调用(RPC)框架。Netty以其高效、稳定和灵活的设计在Java世界中广受赞誉,而Netty Rpc则是利用Netty的强大能力,构建了一种使得分布式系统间...
RPC的核心是将远程服务调用的过程透明化,使它看起来就像是本地方法调用一样。这涉及到序列化、网络通信和反序列化等关键步骤。在Netty中,我们可以利用它的ChannelHandler来处理这些过程。 1. **序列化与反序列化*...
Dubbo是一款基于Netty的高性能、轻量级的RPC框架,其主要功能包括:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现、依赖分析与降级。支持dubbo、rmi、hessian、http、webservice、thrift、...
1. 透明化的远程调用:开发者无需关注远程通信细节,只需要像调用本地方法一样调用远程服务。 2. 软负载均衡和容错机制:Dubbo内置了多种负载均衡策略,如随机、轮询等,能够在服务消费者端实现负载均衡,同时提供了...
b)服务间通过远程调用(RPC)方式通信,此时服务框架(如Dubbo)和分布式服务框架是核心。3.分布式服务架构a)随着业务发展,服务数量激增,为解决服务间的依赖问题,引入服务注册与发现机制,并对服务进行分组治理。...
RPC(Remote Procedure Call)是一种使程序能够执行远程计算机系统上的过程调用的技术。本实例将探讨如何使用Netty来实现自定义的RPC框架。 在RPC框架中,主要包括三个组件:服务提供者(RPC-Provider)、服务消费...
Dubbo是一个由阿里巴巴开源的高性能、分布式的RPC(远程调用协议)服务框架。它旨在简化服务之间的通信,提供服务的自动注册、自动发现等功能,从而实现服务治理。Dubbo能够与Spring框架无缝集成,使得开发者可以像...
2. **接口级别调用**:Dubbo支持基于接口的远程调用,这使得服务调用与远程通信解耦,提高了代码的可读性和可维护性。 3. **高性能通信**:Dubbo使用Netty作为默认的NIO通信框架,提供高效的异步传输和编解码能力。...
2. **高性能通信**:基于Netty网络库,SOFARPC实现了高效的异步非阻塞I/O模型,提高了并发处理能力。同时,它支持多种序列化协议,如FastJSON、Hessian2、Protobuf等,为数据传输提供了高速度和低内存占用。 3. **...