avro-遠程過程調用(RPC)

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);
	}
}

服務端輸入:

客戶端輸出:

相關文章
相關標籤/搜索