Dubbo
IT面试
668 ·
0 ·
2023-02-08 16:44:51
最新编辑原因:

注册中心挂了可以继续通信吗?

可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信。

dubbo 工作原理

  • 第一层:service 层,接口层,给服务提供者和消费者来实现的

  • 第二层:config 层,配置层,主要是对 dubbo 进行各种配置的

  • 第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信

  • 第四层:registry 层,服务注册层,负责服务的注册与发现

  • 第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务

  • 第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控

  • 第七层:protocal 层,远程调用层,封装 rpc 调用

  • 第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步

  • 第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口

  • 第十层:serialize 层,数据序列化层

工作流程

  • 第一步:provider 向注册中心去注册

  • 第二步:consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务

  • 第三步:consumer 调用 provider

  • 第四步:consumer 和 provider 都异步通知监控中心

RPC的实现基础

  1. 需要有非常高效的网络通信,比如一般选择Netty作为网络通信框架;

  2. 需要有比较高效的序列化框架,比如谷歌的Protobuf序列化框架;

  3. 可靠的寻址方式(主要是提供服务的发现),比如可以使用Zookeeper来注册服务等等;

  4. 如果是带会话(状态)的RPC调用,还需要有会话和状态保持的功能;

RPC使用了哪些关键技术

  1. 动态代理
    生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候需要用到Java动态代理技术,可以使用JDK提供的原生的动态代理机制,也可以使用开源的:CGLib代理,Javassist字节码生成技术。

  2. 序列化和反序列化

    • 在网络中,所有的数据都将会被转化为字节进行传送,所以为了能够使参数对象在网络中进行传输,需要对这些参数进行序列化和反序列化操作。

    • 序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。

    • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。 目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。

  3. NIO通信
    出于并发性能的考虑,传统的阻塞式IO显然不太合适,因此我们需要异步的IO,即NIO。Java提供了NIO的解决方案,Java 7 也提供了更优秀的NIO.2支持。可以选择Netty或者MINA来解决NIO数据传输的问题。

  4. 服务注册中心
    可选:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。

Dubbo和Spring Cloud的区别

  1. dubbo 采用的是传输层 tcp 协议,是二进制传输的,占用带宽较少,序列化采用的是 jdk 自带的序列化协议。springcloud 是应用层 http 协议,占用带宽比较多,同时 springcloud 采用的是 json 报文传输,消耗会比较大。

  2. dubbo 调用使用的是长链接,适合传输数据量小的包,而对于 springcloud 是短连接,适合传输大数据量的信息,比如图片、文本之类的。

  3. dubbo 开发需要依赖 jar 包,对依赖的管理比较复杂。springcloud 的接口协议比较松散,约束性不强。

enter image description here


本作品系原创,采用《署名-非商业性使用-禁止演绎4.0 国际》许可协议.转载请说明出处
本文链接:https://www.upupor.com/u/KY9dlKm 复制

无内容

推荐阅读