RPC(Remote Procedure Call)叫作远程过程调用,它是利用网络从远程计算机上请求服务,可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后,利用远程计算机的系统资源执行这部分程序,最终返回远程计算机上的执行结果。
RPC的五个主要部分
服务调用方、调用方的本地存根及其一个RPC通信包的实例存在于调用者的机器上;而服务提供方、服务提供方的存根及另一个RPC通信包的实例存在于被调用的机器上。
服务方的代码启动后要能够接受调用方的网络请求(如Netty、Tomcat)
从一个简单的案例分析
从远程注册中心(如Redis)获取接口名对应的ip地址和端口(URL列表)
List<URL> urlList = RemoteRegister.get(interfaceClass.getName(), "1.0");
负载均衡(LoadBalance)提供很多种策略,这里实现随机策略
public class LoadBalance {
public static URL random(List<URL> urls){
Random random = new Random();
int randomIndex = random.nextInt(urls.size());
return urls.get(randomIndex);
}
}
在可能会出现异常的位置进行异常的友好处理,例如在网络连接失败时返回具体的信息
也可以在catch中调用自定义的实现类HelloServiceErrorCallback调用具体的错误回调方法
//服务调用:发送请求
String result = null;
try {
HttpClient client = new HttpClient();
result = client.send(url.getHostname(), url.getPort(), invocation);
}catch (Exception e){
return "服务调用失败!";
}
当某个服务调用失败后,可以尝试调用集群中的其他服务
若服务方的业务代码没有开发完,调用方需要一个返回结果,就可以用mock实现。
在代理对象的调用逻辑中判断是否有mock参数的信息,如果有直接返回mock中的信息
String mock = System.getProperty("mock");
if( mock != null && mock.startsWith("return:")){
String result = mock.replace("return:", "");
return result;
}
获取源码可以去看我的Github
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-coreartifactId>
<version>9.0.43version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-ioartifactId>
<version>1.3.2version>
dependency>
dependencies>