常用的RPC框架:Dubbo、Thrift、Sofa、gRPC等。
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个连接。
Spring
-
Spring是一个框架,还是一个生态!整个生态系统的基石,提供完整的扩展能力。
-
IOC(控制反转):主要目的是为了解耦,防止出现对象里面new对象,再new对象...的层层耦合。
-
AOP(面向切面编程): 实现方式是动态代理(jdk/cglib)
-
Bean的生命周期:
- 反射创建Bean工厂;
- 属性注入;
- 初始化;
- 实例bean容器管理的对象;
- 销毁;
- 整个过程流程如下:
循环依赖
- 三个map结构!