Java基础知识——RPC,Dubbo

RPC

RPC实现:远程过程调用
调用远程计算机上的服务,就像调用本地一样

RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
通信框架:MINA 和 Netty。
在这里插入图片描述

在这里插入图片描述

客户端(Client):服务调用方。
客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
服务端(Server):服务的真正提供者。

RMI:远程方法调用(Remote Method Invocation)
在这里插入图片描述
客户对象——stub——skeleton——服务对象

RPC与RMI的区别:
1:方法调用方式不同:
RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。通过方法签名联系,事先实例化stub和skeleton并bind
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值。RPC服务器搜索与之相匹配的类和方法
2:适用语言范围不同:
RMI只用于Java;
RPC是网络服务协议,与操作系统和语言无关。
3:调用结果的返回形式不同:
RMI的调用结果可以是对象类型或者基本数据类型;
RPC的结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异

Dubbo技术架构:
参考资料
通常的短连接操作步骤是:
连接-》数据传输-》关闭连接;
而长连接通常就是:
连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;
长连接需要定时发送心跳维护连接

解决问题:
① 当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。
② 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
③ 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

在这里插入图片描述
节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

基本实现原理:
1:client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的
2:将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object
3:向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)
将ID和打包的方法调用信息封装成一对象connRequest,使用IoSession.write(connRequest)异步发送出去。此时会创建监听线程,至于如何找到服务器,是通过ZK
4:当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用synchronized获取回调对象callback的锁, 再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。
5:服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID),从而找到callback,将方法调用结果设置到callback对象里
6:监听线程接着使用synchronized获取回调对象callback的锁(因为前面调用过wait(),那个线程已释放callback的锁了),再notifyAll(),唤醒前面处于等待状态的线程继续执行(callback的get()方法继续执行就能拿到调用结果了),至此,整个过程结束。

实现机制:
服务器端:
1:maven引入dubbo模块
2:ymal配置注册服务的zookeeper

dubbo:
  application:
    name:  dubbo-consumer
  registry:
    address: 125.77.116.145:2182
    # 发布到IP为125.77.116.145:2182的Zookeeper上
    protocol: zookeeper
    check: false
   scan
   	base-packages=ticket.service
   	#扫描包下的@Service发布服务 

3:
创建服务类接口:TicketService

服务类接口的实现类:@Service表明这是我们发布的服务

@Service
public class TicketServiceImp{
	@Override
	public String getString(){
		return "11";
	}
}

客户端:
1:maven引入dubbo模块
2:ymal配置注册服务的zookeeper
3:在路径下创建一个和服务类接口全类名相同的接口,因为java
的服务以对象的形式存在,需要再本地创建一个接口回调对象
4:@Reference引用注册的服务
@Service
public class UserService{
@Reference
TicketService ticketService;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值