服务间通信 的方式
- 同步调用:
-
Dubbo RPC的方式
底层基于netty实现 基于TCP建立的长连接 BIO NIO只是一种网络通信方式
BIO 为每一个连接创建一个线程 会堵塞
NIO 一个线程服务多个连接 有弊端 当连接太多 性能会下降 Netty 封装了NIO 在他的基础上 添加了主从处理组 BossGroup WorkerGroup 编程模型 Reator 反应堆思想 NIO Netty是一种实现 -
RPC其他方式
httpClient
okHttp
SpringCloud restful http的形式 短连接 RestTemplate
Feign
性能:dubbo>springCloud
- 异步调用:MQ 无需等待执行方的结果
RPC、RMI的理解
RPC:在本地调用远程的函数,远程过程调用,可以跨语言实现 httpClient。
RMI:远程方法调用,java中用于实现RPC的一种机制,RPC的java版本,是J2EE的网络调用机制,跨JVM调用对象的方法,面向对象的思维方式。
直接或间接实现接口 java.rmi.Remote 成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。
远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”,而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信,而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。
如何理解RPC
远程过程调用
RPC要求在调用方中放置被调用的方法的接口。调用方只要调用了这些接口,就相当于调用了被调用方的实际方法,十分易用。于是,调用方可以像调用内部接口一样调用远程的方法,而不用封装参数名和参数值等操作。
包含
- 动态代理,封装调用细节。
- 序列化与反序列化,数据传输与接收。
- 通信,可以选择七层的http,四层的tcp/udp。
- 异常处理等。
首先,调用方调用的是接口,必须得为接口构造一个假的实现。显然,要使用动态代理。这样,调用方的调用就被动态代理接收到了。
第二,动态代理接收到调用后,应该想办法调用远程的实际实现。这包括下面几步:
- 识别具体要调用的远程方法的IP、端口
- 将调用方法的入参进行序列化
- 通过通信将请求发送到远程的方法中
这样,远程的服务就接收到了调用方的请求。它应该: - 反序列化各个调用参数
- 定位到实际要调用的方法,然后输入参数,执行方法
- 按照调用的路径返回调用的结果