博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo框架——整体架构
阅读量:5256 次
发布时间:2019-06-14

本文共 1640 字,大约阅读时间需要 5 分钟。

转载至:https://blog.csdn.net/meilong_whpu/article/details/72156192

 

 

 

上图中,左边是serviceConsumer使用的接口和类;右边是serviceProvider使用的接口和类;中间是双方均要使用的接口和类。总体上将整个架构分成三大层,分别是Business层、RPC层、Remoting层。其中:

      Business层是应用层的接口和实现类,完成应用层的业务逻辑。对于消费端应用层则是利用config配置层的功能在实现类中调用Proxy层实现的代理类(即为远程服务的引用);对于服务端应用层则是实现业务逻辑然后通过Proxy层的Invoker封装之后,利用config配置层的功能将服务暴露给消费端使用。

     RPC层是Dubbo框架的核心,提供透明化的服务发布和服务引用,里面可以细分为如下六层:

       1)config配置层:使用这一层提供的@注解,xml配置等方法来暴露服务和为服务消费端生成远程服务代理类;主要是为了方便应用层的使用,提供了与Spring框架的融合功能。

       2)proxy服务代理层:服务接口透明代理,可以像调本地服务一样调远程服务。在服务暴露的过程中,为服务实现类创建Invoker的代理,在代理类中主要是根据接受到的类名、方法名、参数值等信息通过反射的方式完成对服务实现类的调用。在服务引用过程中,为远程服务引用Invoker对象(通过从注册中心获取服务地址并创建的Invoker对象)创建代理,在应用层调用该代理时,由代理类负责调用服务引用Invoker对象。

       3)registry注册中心层:完成服务地址的注册与发现。目前支持的注册协议有dubbo、multicast、zookeeper、redis。在服务暴露过程中,将服务地址发布到注册中心上。在服务引用过程中,对注册中心进行监听与订阅,发现注册中心上面的所有服务地址,并且在服务地址发生变动时能及时地通知服务消费端更新服务引用Invoker。

       4)cluster层:主要是将相同的服务封装成集群,在服务调用的过程中完成对服务的路由、负载均衡等逻辑处理,最终选择合适的服务提供者。该层主要是消费端使用,在服务引用过程中,将相同的服务封装成集群对象,当调用服务时,该集群对象负责进行路由选择和负载均衡策略逻辑处理,从服务引用Invoker列表中选择一个Invoker对象发起远程服务调用。

     5)monitor监控层:RPC调用次数和调用时间监控,发送数据到monitor监控中心。主要是在服务暴露和服务引用时,为Invoker添加过滤器链时将MonitorFilter过滤器放入过滤器链中,从而将服务名称、服务方法、调用耗时、并发数等信息记录下来,其中服务消费端记录服务提供者的信息,服务提供端记录服务消费者的信息。

    6)protocol远程调用层:封装RPC调用,抽象各种协议,目前支持的协议有dubbo、mock、injvm、rmi、hessian、thrift、memcached、redis、rest。在该层实现各种协议,主要是实现各协议创建服务容器、接受请求并将请求向上层传递以及发送响应消息等通信层面的业务逻辑。目前Dubbo框架为扩展协议的实现提供了接口及抽象类。

    Remoting层主要实现dubbo协议,若使用hessian或其他协议,就不会用到这一层;具体细分为三层:

     1)exchange信息交换层:封装请求响应模式,同步转异步,封装Request-Response语义。

     2)transport网络传输层:对Mina,Netty,Grizzly的抽象,socket TCP,UDP编程。

     3)serialize数据序列化层,将请求消息或响应消息进行序列化之后发送到通信线路上,对收到的消息进行反序列化之后提供给上层进行处理。

转载于:https://www.cnblogs.com/zlazm/p/9295956.html

你可能感兴趣的文章
三维变换概述
查看>>
第三次作业
查看>>
vue route 跳转
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>