Dubbo框架
2024-11-08 09:13:29 0 举报
Dubbo是一个流行的开源RPC(远程过程调用)框架,由阿里巴巴开发并贡献给Apache软件基金会。它提供了Java语言的高性能和透明化的RPC调用,以及服务注册与发现的功能。Dubbo的核心内容包括远程接口的定义与实现、服务消费者的发现与调用,以及服务提供者的注册与发现。Dubbo使用XML或注解来进行服务配置,支持多种协议,如Hessian、HTTP、Thrift等。Dubbo的文件类型主要包括服务接口定义文件、服务实现类文件、服务提供者配置文件和服务消费者配置文件。修饰语可以用于描述Dubbo框架的服务调用机制,例如"透明化"、"高性能"、"服务注册"和"服务发现"。
作者其他创作
大纲/内容
17
2
Thread Pool
业务代码实现
8
19
4
ProxyFactory
10
初始化服务实例
1.生成Invoker对象。根据Cluster实现不同,生成不同类型的ClusterInvoker对象,并通过Invoker方法启动调用流程。2.获取可调用的服务列表,通过Directory的List方法获取,有两类服务列表的获取方式: ·RegistryDirectory:动态Directory实现,自动从注册中心更新Invoker列表,配置信息,路由列表。 ·StaticDirectory:静态列表实现,将传入的Invoker列表封装成静态的Directory对象。3.Directory获取所有的Invoker列表后,会调用路由接口(Router),根据用户配置的不同策略对Invoker列表进行过滤,返回符合规则的Invoker。4.前面三步生成的Invoker需要调用最终服务,但服务分布在不同节点上,所以需要经过LoadBalance,负载均衡策略有四种: ·Random LoadBalance 随机,按照权重设置随机概率做负载均衡。 ·RoundRobin LoadBalance 轮询,按照公约后的权重设置轮询比例。 ·LeastActive LoadBalance 按照活跃数调用,活跃差的被调用次数多,活跃度相同的进行随机调用。 ·ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一个提供者5.最后进行RPC调用,如果出现异常,提供9种不同的容错策略: Failover、Failfast、Failsafe、Failback、Forking、Broadcast、Mock、Available、Mergable
服务消费者经过容错,Invoker列表,路由和负载均衡后,会对Invoker进行过滤,之后通过Client编码,序列化发送给服务提供者。 服务消费者调用提供者的前后,都会调用Filter。 Dubbo系统有自带的系统过滤器,提供者有11个,消费者有5个,用户可以自定义过滤器。 调用请求经过过滤以后,会以Invoker的形式对Client进行调用。Client会交由底层I/O线程池处理,其包括处理消息读写、序列化、反序列化等逻辑, 同时会对Dubbo协议进行编码和解码操作。 Dubbo协议基于TCP/IP协议,包括协议头和协议体 协议体包含传输的主要内容,由16字节长的报文组成,每个字节包含8个二进制位。 具体内容如下: · 0-7位,“魔法数”高位 · 8-15位,“魔法数”低位。“魔法数”用来区别两个不同请求,固定“0xdabb”表示。 · 16位,数据包的类型,0表示Response,1表示Request · 17位,调用方式,0表示单向,1表示双向 · 18位,时间标识,0表示请求/响应,1表示心跳包 · 19-23位,序列化器编号,序列化方式,例如:Hessian2Serialization · 24-31位,状态位。20表示ok,30表示客户端超时,31表示服务端超时等 · 32-95位,请求的唯一编号,RPC的唯一ID · 96-127位,消息体包括Dubbo版本号,服务接口名,版本,方法名,参数类型,参数值和请求额外参数。 消费者在调用之前会将上述消息体,根据Dubbo协议打包好,框架内部会调用DefaultFuture对象的get方法进行等待, 在准备发送请求时,才创建Request对象,这个对象会保存在一个静态的HashMap中,当提供者处理完Request后,将返回的Response放回到Futures的HashMap中 在HashMap中会找到对应的Request对象,并且返回给服务消费者。 协议打包好之后就需要给协议编码和序列化,用到Dubbo的编码器,过程是将信息转化成字节流。 Dubbo协议编码请求对象分为使用ExchangeCodec中的两个方法,encodeRequest负责编码协议头和encodeRequestData编码协议体, 同样通过encodeResponse 编码协议头,encodeResponseData 编码协议体。 消费者和提供者都通过decode和decodeBody两个方法进行解码,不同的是解码有可能在IO线程或者Dubbo线程池中完成。 当服务提供者收到请求协议包以后,先将其放到 ThreadPool 中,然后依次处理。 由于服务提供者在注册中心是通过 Exporter 的方式暴露服务的,服务消费者也是通过 Exporter 作为接口进行调用的。 Exporter 是将 Invoker 进行了包装,将拆开的 Invoker 进行 Filter 过滤链条进行过滤以后,再去调用服务实体。最后,将信息返回给服务消费者。
Dubbo分层: ·业务层 ·RPC层 ·Remoting层
网络传输的序列化和反序列化
11
5.调用Invoker
代理,生产者和消费者都会生成Proxy
服务注册与发现
Exporter
Cluster
Config
业务层
Invoker
4.调用select
Process RequestID:10
服务提供者(Provider)
2.调用List
Protocol
1.提供者暴露服务整体机制:
1
12
ReferenceConfig
监控调用次数和调用时间
Filter
Router
Directory
Monitor
Registry
Client
远程服务转化成Invoker
Transport
ResponseID:2
Dubbo调用工作流:
5
1.提供者读取配置将服务实例化,Proxy封装服务调用接口2.Proxy封装时,调用Protocol定义协议格式,如:Dubbo Protocol3.将Proxy封装成Invoker(真实服务调用的实例)4.Invoker封装到Exporter5.将Exporter注册到注册中心6.消费者服务实例化,从注册中心订阅提供者元数据(IP、端口以及调用方式)7.获取到Proxy,拿到Invoker实体,使用Invoker进行调用8.在Invoker调用之前,通过Directory获取提供者的Invoker列表9.通过路由规则知道服务需要从哪些节点获取10.Invoker调用过程中,通过Cluster进行容错11.调用过程中,通过LoadBalance来实现负载均衡12.在调用之前还需要经过Filter过滤链,用来处理上下文,限流和计数的工作13.生成过滤后的Invoker14.用Client进行数据传输15.Codec会根据Protocol定义的协议,进行协议构造16.构造完成的数据,通过序列化Serialization传输给服务提供者17.Request到达提供者,被分配到线程池中进行处理18.Server拿到请求后查找对应的Exporter19.Exporter通过Filter的层层解析获得Invoker20最后对服务提供者实体进行调用上述步骤中出现的Proxy、Invoker、Exporter、Filter时调用实体在不同阶段的不同表现形式,本质是一样的
LoadBalance
服务消费者(Consumer)
服务暴露实现原理 1.服务提供者初始化,注册到注册中心,暴露给其他服务调用 2.服务消费者初始化,注册到注册中心,消费其他服务
14
网络
Export
2.消费者消费服务整体机制:
远程调用
RequestID:10
3
网络传输层,封装网络传输接口以及扩展网络传输方式
ClusterInvoker
信息交换层,简历Request-Response模型,分装请求响应模式
21
18
Server
6
13
ResponseID:1
ServiceConfig
Codec
配置信息
Exchange
注册中心
Process RequestID:11
Proxy/Invoker
7
Serialize
暴露过程分为七个步骤:1.读取其他配置信息到map中,用来后面构造URL。2.读取全局配置信息。3.配置不是remote,也就十暴露本地服务。4.如果配置了监控地址,则服务调用信息会上报。5.通过Proxy转化成Invoker,RegistryURL存放的是注册中心的地址。6.暴露服务后,向注册中心注册服务信息。7.没有注册中心直接暴露服务。一旦服务注册到注册中心以后,注册中心会通过 RegistryProtocol 中的 Export 方法将服务暴露出去,并依次做以下操作:1.委托具体协议进行服务暴露,创建 NettyServer 监听端口,并保持服务实例。2.创建注册中心对象,创建对应的 TCP 连接。3.注册元数据到注册中心。4.订阅 Configurators 节点。5.如果需要销毁服务,需要关闭端口,注销服务信息。
RPC
集群容错
9
服务消费者先将持有远程服务实例生成的Invoker,然后把Invoker转换成用户接口的动态代理引用。消费者服务在调用服务提供者时,做了以下动作:·检查是否是同一个JVM内部引用。·如果是同一个JVM引用,直接使用injvm协议从内存中获取实例。·注册中心地址后,添加refer存储服务消费元数据信息。·单注册中心消费。·依次获取注册中心的服务,添加到Invokers列表中。·通过Cluster将多个Invoker转换成一个Invoker。·把Invoker转换成接口代理。
Proxy
Invoker转化成Exporter
1.生成
Ref
Invoker转化成本地接口代理
Consumer
Remoting
15
服务转化成Invoker
RequestID:11
远程调用层,封装调用具体过程
Service
Serialization
Futures
20
负载均衡策略以及路由策略
16
3.调用Router
0 条评论
回复 删除
下一页