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); } }
服務端輸入:
客戶端輸出: