1. 认识RPC
RPC(Remote Procedure Call)是指远程过程调用,在微服务架构中,各个微服务之间的通信一般使用RPC,比如用户微服务和订单微服务,需求是在用户微服务中查询当前用户的订单,此时用户服务是RPC的请求端,订单微服务是RPC的服务端。
2. RPC原理
2.1 要实现RPC有3个难点问题:
①如何让客户端知道服务端提供的RPC接口以及方法?
方法一:客户端和服务端在pom文件中同时依赖定义了接口的依赖,服务端需要实现这些接口,提供服务
方法二:比如Spring Cloud Feign是将请求通过动态代理加工成HTTP请求,返回时再将Response反加工过程
②客户端和服务端如何通信?
方法一:Java可以通过NIO/BIO
③客户端如何将参数传递到服务端?
将数据序列化获得二进制数据进行传输 序列化的技术也很多java默认序列化/Json/XML/Protobuf/Hessian 序列化和反序列化效率对比
3. 手写RPC框架
3.1 RPC Client
main线程
public static void main( String[] args )
{
IOrderService orderService = null;
RpcProxyClient rpcProxyClient = new RpcProxyClient();
//代理类的实现
orderService = rpcProxyClient.clientProxy(IOrderService.class,"localhost",8080);
System.out.println(orderService.getOrderList());
}
代理类
public class RpcProxyClient {
public <T>T clientProxy(final Class<T> interfaceCls, String host, int port){
//为了更简洁,创建一个继承InvocationHandler的子类实现具体逻辑
return (T)Proxy.newProxyInstance(interfaceCls.getClassLoader(), new Class<?>[]{
interfaceCls}, new RpcInvocationHandler(host, port)