RPC-远程过程调用,即本地调用网络另外一端机器上对象的方法,之前接触过经过httpclient,jsonpon等方式调用远程服务,这两种方式都须要一个应用服务器容器,好比tomcat来运行远程的服务。RPC调用就像调用本地方法同样,不须要容器来帮忙。java
RPCapache
HTTPjson
AVRO-RPC是基于NIO的NETTY网络通讯框架实现的,使用步骤:tomcat
编写avdl文件服务器
@namespace("com.jv.avro") protocol AddService{ import schema "user.avsc"; int add(int x , int y); void parseUser(com.jv.avro.User user); }
namespace:命名空间网络
protocol:声明AddService为一个协议框架
import:导入模式文件,还能够导入avpr,avdl文件ide
int add(int x,int y):定义的方法测试
服务端jsonp
package com.jv.test; import java.net.InetSocketAddress; import org.apache.avro.AvroRemoteException; import org.apache.avro.ipc.NettyServer; import org.apache.avro.ipc.specific.SpecificResponder; import com.jv.avro.AddService; import com.jv.avro.User; public class TestRPCServer { public static void main(String[] args) { NettyServer ns = new NettyServer( new SpecificResponder(AddService.class,new ServerImpl()), new InetSocketAddress(9999) ); //ns.start(); System.out.println("服务端已启动"); } } class ServerImpl implements AddService{ @Override public int add(int x, int y) throws AvroRemoteException { return x+y; } @Override public Void parseUser(User user) throws AvroRemoteException { System.out.println(user); return null; } }
客户端
package com.jv.test; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.avro.ipc.NettyTransceiver; import org.apache.avro.ipc.specific.SpecificRequestor; import com.jv.avro.AddService; import com.jv.avro.User; public class TestRPCClient { public static void main(String[] args) throws IOException { NettyTransceiver client = new NettyTransceiver(new InetSocketAddress("127.0.0.1",9999)); AddService proxy = SpecificRequestor.getClient(AddService.class, client); int result = proxy.add(2, 3); System.out.println("客户端接收到结果:" + result); User user = new User("Messi",30,"巴塞罗那"); proxy.parseUser(user); } }
服务端输入:
客户端输出: