Rpc与RMI服务,大厂Android高级面试题汇总解答

本文介绍了RPC框架的关键能力,如序列化/反序列化和跨平台/跨语言交互,重点讨论了Netty、bRPC、Dubbo、gRPC和RMI等Java开发中的常见RPC框架,以及RMI的基本使用和历史背景。
摘要由CSDN通过智能技术生成

序列化/反序列化能力

当数据从远程服务器上返回,由于远程网络传输的原因,在Java中必须使用序列化标准来实现数据的传输,不能像本地调用一样简单的将内存数据读取,所以RPC框架一定要有序列化支持的能力,可以将远程的数据序列化为字节流,接受完毕后反序列化成对应的内存对象

跨平台/夸语言交互能力

由于RPC远程交互传输数据,这个时候服务端的系统环境以及所交互的进程使用的语言等并不是固定的,所以RPC框架需要拥有一个稳定的可以跨平台的,跨语言环境的传输协议支持

常见的RPC框架

了解了RPC框架最基础的能力以后,我们来看看Java开发中那些常见的经典RPC框架吧:

1.Netty:netty框架严格意义上并不属于RPC,更多的是作为一种网络协议框架,能够快速的提供高性能的RPC或者HTTP等的远程通信能力基础

2.bRPC:bRPC是一个基于protobuf接口的PRC框架,看到命名就可以知道此框架来自著名的百度团队,此框架囊括了百度内部的所有RPC协议,并且支持多种第三方协议,由于基于protobuf算法,从性能来看几乎是同类RPC框架中的领跑者

3.dubbo:dubbo框架是业界著名的阿里巴巴团队早期开源的优秀的RPC框架,此框架发展较成熟,能独立作为商业化组件使用,且依托于Spring使用

4.gRPC:gRPC是谷歌团队基于Netty开发实现的底层网络库,而此框架还有Go语言的版本,基于Net库开发

5.RMI:rmi可以说是java中最早的RPC框架之一,且此rpc框架由sun团队开发,集成于JDK中,可以说完全可以实现开箱即用,不需要任何外部jar依赖,但由于早期的rpc实现,且设计上并不是为了解决互联网企业类的高并发问题,所以不建议现在互联网开发中作为rpc实现

RMI框架基本使用

RMI既然是java团队设计出来的rpc框架,虽然现在已经不适合企业级生产使用,但是其中的思想和规范值得学习,我们就来看看RMI框架如何使用吧:

RMI三大基本类

实现RMI所需要的API基本都在三大类中,如下:

java.rmi:提供客户端需要的类、接口和异常;

java.rmi.server:提供服务端需要的类、接口和异常;

java.rmi.registry:提供注册表的创建以及查找和命名远程对象的类、接口和异常 ;

构建RMI服务端

首先在RMI中服务端供客户端调用的实例称之为远程对象,而在RMI中实现了java.rmi.Remote接口的类或者继承了java.rmi.Remote接口的都是RMI的远程对象。那么我们来定义一个接口,继承java.rmi.Remote

/**
*用户处理器
**/
public interface UserHandler extends Remote {
String getUserName(int id) throws RemoteException;
String getUserPassWord() throws RemoteException;
User getUserByName(String name) throws RemoteException;
}

这里需要注意的一点是,继承了Remote接口的接口中定义的所有的方法必须抛出RemoteException异常,并且该接口的实现类必须直接或者间接继承java.rmi.server.UnicastRemoteObject类,该类中提供了很多支持RMI的方法,可以通过JRMP协议导出一个远程对象的引用,生成动态代理构建的Stub对象,实现代码如下:

public class UserHandlerImpl extends UnicastRemoteObject implements UserHandler {
//这里因为集继承了UnicastRemoteObject类,其构造器要抛出RemoteException,所以申明构造
public UserHandlerImpl() throws RemoteException {
super();
}

@Override
public String getUserName(int id) throws RemoteException {
return “pdc”;
}
@Override
public String getUserPassWord() throws RemoteException{
return 654321;
}
@Override
public User getUserByName(String name) throws RemoteException{
return new User(name, 654321);
}
}

这里我们构造了一个User实体,为了能实现远程传输,所以这里我们将其进行序列化:

public class User implements Serializable {
private static final long serialVersionUID = 42L;

private String name;
private String passWord;

public String getName(){
return this.name;
}

public String getPassWord(){
return this.passWord;
}

public void setName(String name){
this.name = name;
}

public void setPassWord(String passWord){
this.passWord = passWord;
}

public User(String name, String passWord) {
this.name = name;
this.passWord = passWord;
}
}

需要注意的一点是,如果jdk版本低于1.5,需要手动运行rmic命令生成实现类的Stub对象,而1.5开始使用动态代理技术,已经可以自动生成Stub对象了,做完这些就可以启动服务端了:

UserHandler userHandler = null;
try {
userHandler = new UserHandlerImpl();
Naming.rebind(“user”, userHandler);//将当前的实例与名称为user绑定,后面客户端调用查找对应的名称
System.out.println(" RMI 服务端启动成功");
} catch (Exception e) {
System.err.println(" RMI 服务端启动失败");
e.printStackTrace();
}

构建RMI注册表

其实所谓注册表就是保存了RMI服务端启动与绑定的名称的进程,由于jdk已经把RMI代码集成到了JDK中,RMI的注册表其实不需要写任何代码,在JDK的bin目录下已经存在一个叫rmiregistry.exe的程序,不过我们需要在当前的class类路径下启动注册表(所以需要注意JAVA_HOME环境变量一定要配置成功) ,来到class类路径下,输入命令:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。

自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值