使用Netty实现远程方法调用(RPC)

使用Netty实现远程方法调用(RPC)

很多情况下,我们可能需要用到调用远程方法的时候。比如,我们有统一的布隆过滤器,其它服务需要调用布隆过滤器进行判重;比如,我们需要调用统一的缓存数据;比如我们需要跨机器调用一些服务方法等等。这些时候都可以使用远程方法调用。

接下来,开始讲解使用Netty实现远程方法调用的步骤。

代码目录结构为:

nettynetty/client//RPC消息回调类netty/client/MessageCallBack.java//Rpc客户端管道初始化netty/client/MessageSendChannelInitializer.java//RPC客户端消息发送执行(动态代理)类netty/client/MessageSendExecutor.java//RPC客户端消息发送处理类netty/client/MessageSendHandler.java//Rpc客户端线程任务处理netty/client/MessageSendInitializeTask.java//Rpc客户端代理netty/client/MessageSendProxy.java//RPC客户端消息序列化协议框架netty/client/RpcSendSerializeFrame.java//rpc客户端服务器配置加载netty/client/RpcServerLoader.javanetty/interfnetty/interf.impl//接口实现类netty/interf/impl/CalculateImpl.java//接口netty/interf/Calculate.javanetty/serializenetty/serialize.kryo//Kryo RPC消息进行编码、解码类netty/serialize/kryo/KryoCodecUtil.java//Kryo ×××netty/serialize/kryo/KryoDecoder.java//Kryo 编码器netty/serialize/kryo/KryoEncoder.java//Kryo 工厂类netty/serialize/kryo/KryoPoolFactory.java//Kryo RPC序列化类netty/serialize/kryo/KryoSerialize.java//RPC消息进行编码、解码接口netty/serialize/MessageCodecUtil.java//消息×××netty/serialize/MessageDecoder.java//消息编码器netty/serialize/MessageEncoder.java//RPC消息序列化/反序列化接口定义netty/serialize/RpcSerialize.java//RPC消息序序列化协议选择器接口netty/serialize/RpcSerializeFrame.java//RPC消息序序列化协议类型netty/serialize/RpcSerializeProtocol.javanetty/server//服务端: 线程池异常策略netty/server/AbortPolicyWithReport.java//Rpc服务器执行模块netty/server/MessageRecvChannelInitializer.java//服务器执行模块netty/server/MessageRecvExecutor.java//Rpc服务器消息处理netty/server/MessageRecvHandler.java//Rpc服务器消息线程任务处理netty/server/MessageRecvInitializeTask.java//线程工厂:实际上就是对Runable进行一个包装,对线程设置一些信息和监控信息netty/server/NamedThreadFactory.java//RPC服务端消息序列化协议框架netty/server/RpcRecvSerializeFrame.java//自定义的线程池netty/server/RpcThreadPool.java//消息的请求体netty/MessageRequest.java//响应的请求体netty/MessageResponse.java//客户端netty/NettyClient.java//服务端netty/NettyServer.java

启动NettyServer服务端:

    public static void main(String[] args) {        MessageRecvExecutor executor = new MessageRecvExecutor("127.0.0.1:8686", RpcSerializeProtocol.KRYOSERIALIZE.name());        try {            executor.startServer();        } catch (Exception e) {            e.printStackTrace();        }    }

控制台打印:

RPC Server start success!ip:127.0.0.1port:8686protocol:RpcSerializeProtocol[serializeProtocol=kryo,name=KRYOSERIALIZE,ordinal=1]

启动NettyClient客户端,并远程调用Calculate接口中的add方法:

  1.    final static MessageSendExecutor executor = new MessageSendExecutor("127.0.0.1:8686",RpcSerializeProtocol.KRYOSERIALIZE.name());
  2.    final static Calculate cal = executor.execute(Calculate.class);
  3.    public static void main(String[] args) throws Exception {
  4.        for(int i = 1;i< 100000;i++)
  5.        ThreadExecuteUtil.submitTaskBlock(ThreadExecuteUtil.CLIENT, new Runnable() {
  6.            @Override
  7.            public void run() {
  8.                long start = System.currentTimeMillis();
  9.                int result = cal.add(10, 20);
  10.                System.out.println("result:"+result);
  11.                long end = System.currentTimeMillis();
  12.                System.out.println(end-start);
  13.            }
  14.        }, 1000);
  15.    }

原文地址:http://blog.51cto.com/13852301/2151320

时间: 2024-11-07 20:38:49

使用Netty实现远程方法调用(RPC)的相关文章

下载-深入浅出Netty源码剖析、Netty实战高性能分布式RPC、NIO+Netty5各种RPC架构实战演练三部曲视频教程

下载-深入浅出Netty源码剖析.Netty实战高性能分布式RPC.NIO+Netty5各种RPC架构实战演练三部曲视频教程 第一部分:入浅出Netty源码剖析 第二部分:Netty实战高性能分布式RPC 第三部分:NIO+Netty5各种RPC架构实战演练

Netty实战高性能分布式RPC

Netty实战高性能分布式RPC 课程观看地址:http://www.xuetuwuyou.com/course/171 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 netty4.1.6.Final Spring Tool Suite 3.8.2.RELEASE Maven3.1 Spring4 Zookeeper3.4.6 JDK1.8.0_111 二.课程目标 1.快速学习netty的使用 2.自己学会构建高性能服务器 3.熟练使用多线程之间交

浅谈如何使用Netty开发高性能的RPC服务器

如何使用Netty进行RPC服务器的开发,技术原理涉及如下:1.定义RPC请求消息.应答消息结构,里面要包括RPC的接口定义模块,如远程调用的类名.方法名.参数结构.参数值等信息. 2.服务端初始化的时候通过容器加载RPC接口定义和RPC接口实现类对象的映射关系,然后等待客户端发起调用请求. 3.客户端发起的RPC消息通过网络,以字节流的方式发送给RPC服务端,RPC服务端接收到字节流的请求之后,去对应的容器里面,查找客户端接口映射的具体实现对象. 4.RPC服务端找到实现对象的参数信息,通过反

Spark 1.6 RPC内幕解密:运行机制、源码详解、Netty与Akka等(DT大数据梦工厂)

内容: 1.Spark 1.6 RPC解析: 2.RPCEnv源码解析: 3.RPCEndpoint等源码解析: 以前和现在的RPC都是采用Akka,以前和现在的不同就在于RPCEnv,现在就是基于RPCEnv去做RPC通信的 ==========Spark 1.6 RPC解析============ 1.Spark 1.6推出了以RPCEnv.RPCEndpoint.RPCEndpointRef为核心的新型架构下的RPC通信方式,就目前的实现而言,其底层依旧是Akka: 2.Akka是基于Sc

第43课:Spark 1.6 RPC内幕解密:运行机制、源码详解、Netty与Akka等

Spark 是分布式计算框架,多台机器之间必然存在着通信.Spark在早期版本采用Akka实现.现在在Akka的上层抽象出了一个RpcEnv.RpcEnv负责管理机器之间的通信. RpcEnv包含了如下三大核心: RpcEndpoint 消息循环体,负责接收并处理消息.Spark中的Master.Worker都是RpcEndpoint . RpcEndpointRef :RpcEndpoint的引用,如果需要和RpcEndpoint通信,就必须获取它的RpcEndpointRef,通过RpcEn

Netty简单应用与线上服务器部署_netty视频

Netty简单应用与线上服务器部署 课程学习地址:http://www.xuetuwuyou.com/course/198 课程出自学途无忧网:http://www.xuetuwuyou.com 一.开发环境 4.1.11.Final   jdk1.8 maven 3.2 Spring 4.3.9 二.适合人群 ①想深入学习java ClassLoader ②想在线上linux服务器上运行netty或Springboot服务 三.课程目标 ①掌控ClassLoader ②学会编写shell脚本

轻量级分布式 RPC 框架

原文出处: 黄勇 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,

webservice restful rpc

webservice: 上世纪90年代流行的分布式技术,如DCOM,CORBA,RMI,范式是RPC,但各系统数据类型不一致,实现/调用机制不同,各系统间互通不可能.XML的出现,让数据类型一致了,SOAP的出现,让各系统可以相互调用了.Simple Object Access Protocol的原意是XML-RPC,但人们很快就发现方法调用太狭隘,而消息传递更加通用.WSDL即支持rpc/encoded也支持document/literal,但前者已成为历史遗留.webservices是soa

你应该知道的 RPC 原理

在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司,尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责.这时就会遇到两个问题: (1) 要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用? (2) 其它团队要使用我们的服务,我们的服务该怎么发布以便他人调用? 下文我们将对这两个问题展开探讨: p