介绍:
RPC远程调用服务框架是一种用于实现分布式系统中不同节点之间进行通信和远程过程调用的技术框架。其允许程序在不同的地址空间(不同服务器)中调用远程函数或方法,就像在本地调用一样,而无需了解底层的网络细节和通信机制。
实现方式:
(1)HttpClient模拟实现(了解):
步骤为:
- 先进行相关HttpClient连接的建立
- 模拟请求路径,并如果有需要添加相关参数
- 模拟相关请求执行与发送
- 创建一个响应对象用于接收步骤3发送请求得到的结果
- 进行对响应结果处理,类似与日常转换json对象与设置其响应字符集
- 进行结果的判断与过滤等。
依据过程,写一个简单的伪代码:
//创建HttpClient连接
CloseableHttpClient httpClient = HttpClients.createDefault();
//模拟创建请求路径
URIBuilder uriBuilder = new URIBuilder("http://localhost:8080/deamo");
uriBuilder.addParameter("str","wjb");
//获取相关请求
HttpGet httpGet = new HttpGet(uriBuilder.build());
//创建响应对象,用于执行完毕相关请求后进行响应对象的返回定义
CloseableHttpResponse response = httpClient.execute(httpGet);
//将HttpEntity对象进行转化为String相关对象,并且设置相关字符响应集
String result = EntityUtils.toString(response.getEntity(),"UTF-8");
//输出结果查看是否为所需
System.out.println(result);
(2)RMI结合Zookeeper实现RPC远程调用(重点)
前置条件(可能存在的坑):在虚拟机服务器中配置相关zookeeper,且保证可以启动,其中zookeeper可能存在连接不上,注意可能是防火墙问题也可能是telnet未开问题。
相关使用:
其zookeeper与相关RMI结合其实就是二者代码结合
1.在服务器中注册:
主要任务就是创建相关服务端连接,并进行注册,与服务注册表绑定,后创建zookeeper连接,向zookeeper中发送信息,zookeeper进行缓存注册信息。
public static void main(String[] args) {
MyPersonService myPersonService;
{
try {
myPersonService = new MyPersonServiceImpl();
LocateRegistry.createRegistry(8088);
String url = "rmi://localhost:8088/MyPersonService";
Naming.bind(url,myPersonService);
System.out.println("RMI服务启动成功");
//创建zookeeper并且发送信息
ZooKeeper zooKeeper = new ZooKeeper("192.168.20.128:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("zookeeper连接成功");
}
});
String content = zooKeeper.create("/demo/RMI",url.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println("注册成功");
} catch (RemoteException e) {
throw new RuntimeException(e);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (AlreadyBoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (KeeperException e) {
throw new RuntimeException(e);
}
}
}
2.在客户端中发现:
主要任务是在相关ServiceImpl实现类中进行拉取发现服务器在zookeeper中所注册信息与服务接口地址(url),从而拉取对应跨项目方法进行使用。
ZooKeeper zooKeeper = new ZooKeeper("192.168.20.128:2181", 10000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("zookeeper连接成功");
}
});
byte[] result = zooKeeper.getData("/demo/RMI", false,null);
MyPersonService myPersonService = (MyPersonService) Naming.lookup(new String(result));
return myPersonService.findAll();