吉林高端网站建设,网站建设的文字用什么字体较好,宜宾网站设计,义乌市住房和城乡建设局网站RPC架构
一、RPC概述
RPC#xff08;Remote Procedure Call#xff09;叫作远程过程调用#xff0c;它是利用网络从远程计算机上请求服务#xff0c;可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后#xff0c;利用远程计…RPC架构
一、RPC概述
RPCRemote Procedure Call叫作远程过程调用它是利用网络从远程计算机上请求服务可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后利用远程计算机的系统资源执行这部分程序最终返回远程计算机上的执行结果。
RPC的五个主要部分
user服务调用方user-stub调用方的本地存根RPCRuntimeRPC通信者server-stub服务端的本地存根server服务端
服务调用方、调用方的本地存根及其一个RPC通信包的实例存在于调用者的机器上而服务提供方、服务提供方的存根及另一个RPC通信包的实例存在于被调用的机器上。
服务方的代码启动后要能够接受调用方的网络请求如Netty、Tomcat
从一个简单的案例分析
Provider模块为服务方提供服务接口的实现接收调用方的调用网络请求并返回执行结果Consumer模块为调用方发送请求给服务方并接受执行结果Common模块为公共模块提供服务接口的定义。供Provider和Consumer使用RPC模块为RPC架构的实现框架 提供网络服务的启动HttpServer提供网络请求的处理HttpServerHandler提供接口名和实现类的映射便于快速找到网络请求调用方法对应的实现类LocalRegister这里使用本地注册提供网络请求中接口名方法名参数类型数组参数数组的封装Invocation需要实现序列化接口提供代理工厂类用于Consumer创建代理对象通过代理对象直接调用服务中的方法ProxyFactory通过JDK中的动态代理类Proxy实现
二、RPC框架的开发要点
服务发现
从远程注册中心如Redis获取接口名对应的ip地址和端口URL列表
ListURL urlList RemoteRegister.get(interfaceClass.getName(), 1.0);负载均衡
负载均衡LoadBalance提供很多种策略这里实现随机策略
public class LoadBalance {public static URL random(ListURL 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参数的信息如果有直接返回mock中的信息
String mock System.getProperty(mock);
if( mock ! null mock.startsWith(return:)){String result mock.replace(return:, );return result;
}三、案例代码实现
获取源码可以去看我的Github
RPC模块中需要的依赖
dependenciesdependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-core/artifactIdversion9.0.43/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-io/artifactIdversion1.3.2/version/dependency
/dependencies