常用的RPC框架:Dubbo、Thrift、Sofa、gRPC等。

alt

RPC底层实现

  • 服务端:
    • 将某个服务类发布到某个端口;服务器处在运行状态,对该端口进行监听,收到客户端连接请求之后建立连接(TCP短链接);收到数据之后,处理并拿到数据进行反射调用
  • 客户端:
    • 使用动态代理,使得客户端在发起调用的时候,不需要关注底层逻辑(即实例化对象+对象方法调用,与本地方法使用无二);
    • 客户端所传输的数据也通过动态代理获取,并将其封装为一个RpcRequest类(与被代理的接口)一样,均由server-api提供;可以理解为是server服务端所规定的传输协议
    • RpcRequest类作为传输的数据,可以通过Java自带的序列化机制进行序列化与反序列化;
    • 通过Socket socket = new Socket(host, port)一个socket对象代表一个客户端的连接), 从客户端向服务器进行数据的传输与读取
  • 注意:上述基于socket的连接过程和基于IO流的读取都是BIO(阻塞IO),等待不到就会将对应的线程挂起;这会造成服务端的吞吐量极低,可以用线程池解决IO流BIO的问题;NIO(非阻塞IO) 的优势就体现出来了:NIO的多路复用,一个线程管理N个连接。 alt

Spring

  • Spring是一个框架,还是一个生态整个生态系统的基石,提供完整的扩展能力

  • IOC(控制反转):主要目的是为了解耦,防止出现对象里面new对象,再new对象...的层层耦合。 alt

  • AOP(面向切面编程): 实现方式是动态代理(jdk/cglib) alt

  • Bean的生命周期:

  1. 反射创建Bean工厂
  2. 属性注入
  3. 初始化
  4. 实例bean容器管理的对象
  5. 销毁

alt

  • 整个过程流程如下: alt

循环依赖

alt

alt

  • 三个map结构! alt

alt