Ⅰ 求系统架构设计师考试的学习资料
《架构师视频资料》网络网盘资源免费下载
链接:https://pan..com/s/1GbV_nl3PARKrVgMIpbnTTg
Ⅱ Java教程:bbo源码解析-网络通信
在之前的内容中,我们探讨了消费者端服务发现与提供者端服务暴露的相关内容,同时了解到消费者端通过内置的负载均衡算法获取合适的调用invoker进行远程调用。接下来,我们聚焦于远程调用过程,即网络通信的细节。
网络通信位于Remoting模块中,支持多种通信协议,包括但不限于:bbo协议、rmi协议、hessian协议、http协议、webservice协议、thrift协议、rest协议、grpc协议、memcached协议、redis协议等。每种协议具有独特的特点和应用场景。
其中,bbo协议采用单一长连接和 NIO 异步通讯方式,适用于小数据量大并发的服务调用场景,以及服务消费者机器数远大于服务提供者机器数的情况。它基于 mina1.1.7 和 hessian 3.2.1 的 tbremoting 交互实现。
rmi协议基于JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。Hessian协议用于集成Hessian的服务,底层采用Http通讯,通过Servlet暴露服务,Dubbo内置Jetty作为服务器实现。Hessian协议可以与原生Hessian服务互操作。
基于HTTP表单的远程调用协议(http协议)采用Spring的HttpInvoker实现,可以与原生HTTP服务互操作。基于WebService的远程调用协议(webservice协议)基于Apache CXF实现,同样可以与原生WebService服务互操作。
thrift协议当前支持的扩展了thrift原生协议,增加了额外的头信息,如serviceName、magic number等。rest协议基于标准的Java REST API实现,JAX-RS 2.0(Java API for RESTful Web Services的简写)用于支持REST调用。grpc协议自Dubbo 2.7.5版本开始支持,适合HTTP/2通信场景,利用gRPC带来的Stream、反压、Reactive编程能力。
memcached协议基于memcached实现的RPC协议,而redis协议基于Redis实现的RPC协议。
在序列化方面,序列化是将对象转成字节流以用于网络传输及将字节流转为对象的过程。序列化的优势包括安全性更好、跨平台等。Dubbo基于netty进行网络通讯,NettyClient.doOpen()方法中可以看到Netty的相关类。序列化接口包括但不限于:Serialization接口、Hessian2Serialization接口、Kryo接口、FST接口等。
序列化方式如Kryo和FST,性能往往优于hessian2,能够显着提高序列化性能。这些高效Java序列化方式的引入,可以优化Dubbo的序列化过程。
在配置Dubbo RPC时,引入Kryo和FST非常简单,只需在RPC的XML配置中添加相应的属性即可。
关于服务消费方发送请求,Dubbo框架定义了私有的RPC协议,消息头和消息体分别用于存储元信息和具体调用消息。消息头包括魔数、数据包类型、消息体长度等。消息体包含调用消息,如方法名称、参数列表等。请求编码和解码过程涉及编解码器的使用,编码过程包括消息头的写入、序列化数据的存储以及长度的写入。解码过程则涉及消息头的读取、序列化数据的解析以及调用方法名、参数等信息的提取。
提供方接收请求后,服务调用过程包含请求解码、调用服务以及返回结果。解码过程在NettyHandler中完成,通过ChannelEventRunnable和DecodeHandler进一步处理请求。服务调用完成后,通过Invoker的invoke方法调用服务逻辑。响应数据的编码与请求数据编码过程类似,涉及数据包的构造与发送。
服务消费方接收调用结果后,首先进行响应数据解码,获得Response对象,并传递给下一个处理器NettyHandler。处理后,响应数据被派发到线程池中,此过程与服务提供方接收请求的过程类似。
在异步通信场景中,Dubbo在通信层面为异步操作,通信线程不会等待结果返回。默认情况下,RPC调用被视为同步操作。Dubbo通过CompletableFuture实现了异步转同步操作,通过设置异步返回结果并使用CompletableFuture的get()方法等待完成。
对于异步多线程数据一致性问题,Dubbo使用编号将响应对象与Future对象关联,确保每个响应对象被正确传递到相应的Future对象。通过在创建Future时传入Request对象,可以获取调用编号并建立映射关系。线程池中的线程根据Response对象中的调用编号找到对应的Future对象,将响应结果设置到Future对象中,供用户线程获取。
为了检测Client端与Server端的连通性,Dubbo采用双向心跳机制。HeaderExchangeClient初始化时,开启两个定时任务:发送心跳请求和处理重连与断连。心跳检测定时任务HeartbeatTimerTask确保连接空闲时向对端发送心跳包,而ReconnectTimerTask则负责检测连接状态,当判定为超时后,客户端选择重连,服务端采取断开连接的措施。
Ⅲ Dubbo 源码浅析(一)—RPC 框架与 Dubbo | 京东云技术团队
RPC,远程过程调用,是一种在本地调用远程过程的技术,与之相对的是本地服务调用,即在程序内部进行的方法调用。RPC框架使得我们能像调用本地方法一样方便地调用远程服务,无需关心底层实现细节。它可以被认为是一种概念,实现方式可以是多种协议,如HTTP或自定义的TCP协议,例如Dubbo。
HTTP与RPC的关系并非直接包含,因为HTTP的调用方式并不直接调用远程方法,而是通过HTTP请求进行数据传输。而RPC框架如Dubbo,提供了一种本地调用远程方法的能力。因此,RPC并不局限于HTTP,还可以基于TCP协议实现。
思考RPC与HTTP的关系时,应当从定义出发,理解RPC实际上指的是远程过程调用,其中“Procere”更多指的是程序或过程,而非方法。在理解概念时,不应忽略这一基本定义。RPC框架,如Dubbo,是为了简化远程服务调用的过程,提供了一套调用接口,使得开发者无需关注底层通信细节。
总体而言,RPC框架是帮助开发者在本地调用远程服务时,如同调用本地服务一样便捷。Dubbo是阿里巴巴开源的RPC框架,通过配置和简单的调用,即可实现远程服务的调用。Dubbo架构主要包含服务提供者和消费者,两者通过注册中心进行服务的注册与订阅。服务提供者启动后向注册中心注册服务,消费者启动后从注册中心订阅所需服务。注册中心将服务信息推送给消费者,实现服务的调用。服务提供者与消费者会记录调用次数与时间,并定时发送统计数据至监控中心。
相比之下,Spring Cloud作为另一大微服务框架,与Dubbo在组件配置和功能上有所不同。Spring Cloud提供了更完善的配置功能和更强的特性,更像一台品牌机,易于上手和使用。而Dubbo则更像组装机,需要用户自行选择配置,提供核心计算能力,但需要用户自行完成其他组件的装配和调试。对于新手来说,Spring Cloud更友好,而对于熟悉架构的开发者,Dubbo的灵活性和自定义性更受欢迎。