什么是RPC框架:
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
简单来说就是:
服务器A和服务器B同时都内部实现同一个抽象类,但是服务器B有对抽象类的具体实现的子类,而服务器A没有,但是服务器A使用动态代理来实现这个抽象类,果服务器A调用对象函数,这时代理会拦截函数调用,携带函数参数发送socket请求给服务器B,服务器B可以调用子类的具体实现的函数并且将函数返回值使用socket方式返回.
抽象类:
package com.sy.rpc.service;
public interface LoginServerInterface {
public static final long versionID = 1L;
String login(String username,String password);
}
服务器A代码:
package com.sy.rpc;
import com.sy.rpc.service.LoginServerInterface;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;
public class RpcClientScript {
public static void main(String[] args) throws IOException {
LoginServerInterface loginServer =RPC.getProxy(LoginServerInterface.class,
LoginServerInterface.versionID,
new InetSocketAddress("127.0.0.1",1300), new Configuration());
String str = loginServer.login("老王","123");
System.out.println(str);
}
}
服务器B代码:
package com.sy.rpc;
import com.sy.rpc.service.LoginServerInterface;
import com.sy.rpc.service.imp.LoginServerImp;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
public class RpcServerScript {
public static void main(String[] args) throws IOException {
RPC.Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("127.0.0.1");
builder.setPort(1300);
builder.setProtocol(LoginServerInterface.class);
builder.setInstance(new LoginServerImp());
RPC.Server server = builder.build();
server.start();
}
}
服务器B对抽象类具体实现:
package com.sy.rpc.service.imp;
import com.sy.rpc.service.LoginServerInterface;
public class LoginServerImp implements LoginServerInterface {
@Override
public String login(String username, String password) {
return username+" logged in successfully!";
}
}