刚才我们讲了SOA和RPC都是为了去讲解dubbo技术
Dubbo简介
给出dubbo的一个概念,一个分布式,高性能,透明化的RPC服务框架,他的优点是什么,分布式,高性能,透明化,他是什么东西,
RPC服务框架,后面还有一句话,提供服务自动注册,自动发现等高效服务治理方案,这是他的一个功能,或者叫作用,dubbo是
阿里发布的一个产品,但是这个产品有一个缺点就是,在2013年,就停止维护了,我们在https://mvnrepository.com/这里看一眼,
2012年
https://mvnrepository.com/artifact/com.alibaba/dubbo
如果我们看2.5.3的话是2012年,阿里在JAVA开源这方面真的做的比较好,唯一不好的就是这东西突然不开源了,大部分就是因为
他们的主负责人突然离职了,要不干点别的去了,但是虽然不进行维护了,依然是现在市场上用的比较多的RPC框架,他还是首选,
但是唯一需要注意的是,现在技术一直在发展,这么多年之后,比如说他在开发的时候,Spring才到2,我们现在Spring是4,
唯一给我们带来最闹心的是要解决4和2兼容性的问题,为什么要解决这个事情呢,我们看一下dubbo架构图,把这个图学明白了,
中文帮助文档,我们要的就是他的这个图
这个图一定要重点听,这个图特别重要,这也是dubbo的原理,也是运行过程,这个必须要明白,一定要看清楚,
dubbo分为两个角色,第一个角色,叫做provider,叫做提供者,什么意思,就是服务发布方,就是SOA中的哪个,
就是服务,服务的发布方,这叫provider提供者,这个名称给我记住,除了这个角色以外,还有一个大角色,
叫做consumer,他叫做消费者,他就是调用服务方,按照我们开始画的SOA架构图,就是ego-portal,ego-management,
这就叫消费者,consumer,provider和consumer这两个角色一定要弄清楚,provider和consumer两个配置是不一样的,
你要记住provider一定是进行数据访问的,然后其他去调用provider的,都称为consumer,有一个叫做container,
这是个什么东西呢,他是一个叫做dubbo容器,这个容器听清楚,我们以前是在哪里听过什么什么容器,是在Spring里面,
dubbo就是依赖于Spring容器的,也就是在我们Spring容器提供的时候,没有Spring的时候,dubbo没法用,必须有Spring,
因为他是依赖于Spring容器的,所以他和Spring是一个强耦合的关系,没有Spring dubbo用不了,这是我们刚刚为什么要说
要解决兼容性的问题,他当时出的是1.5.3,我们现在是4.1.6,差的太多了,以前2.5.3的时候,就一个jar包,是所有东西都写在
一个项目里的,从Spring3开始,把一个jar包拆分成我们现在看到的这么多的,所以这事情都是要解决的,这是唯一带来一个
不好的地方,其他都挺好,然后再往下,这个东西Registry,这是个什么东西呢,Registry他叫做注册中心,什么叫注册中心,
是在container启动时,什么意思,当容器启动时,它会把所有可以提供的服务列表上Registry注册中心中进行注册,看清楚,
它是在容器启动的时候,比如我这里面提供两个功能,查询全部,一个是新增的功能,那么我在容器启动的时候,我就会像注册
中心中注册,我服务方提供两个功能,一个是查询全部,一个是新增,你这么做完之后,我的消费者以后在取东西的时候,
就向注册中心中去取,我知道服务方给我提供了两个功能,这两个功能分别是查询全部,新增,那么我就可以调用这两个功能,
知道注册中心是干什么的吗,注册中心的作用是什么,作用是什么,就是可以告诉consumer,提供了什么服务和服务方在哪里,
有两个事情,前面这个是不是好理解,后面这个服务方在哪里这个事情什么意思,一会我们重点就在这个图上了,他这个
图是这样的,一会我们要去记一下,当我们容器去启动的时候,它会向注册中心注册,然后我们向consumer启动的时候,
我们会向注册中心中取列表,我知道有两个功能,然后取回来了,取回来完事之后,不是说只有注册中心就完事了,并不是,
consumer有个4invoke调用,他怎么都要去走一个调用的过程,它会真实的去调用一下服务方,提供者provider,必须要去
调用一下提供者,那这里就有一个问题了,我们讲到注册中心就必须要说一下他的运行原理
这里已经明确的给出一个顺序了,start这个步骤其实就是在启动容器,相当于在启动Dubbo的provider,
当我们去启动完容器之后,第一步这块,注册,启动后会去注册中心注册,注册可以提供的所有注册列表,看2,subscribe,
远程调用,在consumer启动后,会去注册中心Registry获取列表,注意他只能获取到服务列表和服务器Provider的服务地址,
3 notify这个单词有人认识吗,通知,这块他画的意思,当Provider有修改后,注册中心会把消息,subscribe这个单词有人认识吗,
这个叫订阅,notify叫做通知,注册中心会把消息推送给consumer,这块画的主要实际含义,第二步获取这些东西,进行订阅,
订阅完成之后,假设我的consumer已经起完了,在这放着呢,我服务方突然换了,变了,那我不可能重启consumer,他这中间的机制就是,
我container又重新启动了,provider变了,注册中心就会把消息推回来,就告诉你我变了,就是这个意思,然后你看第四步,invoke,
在这块,必须要知道一个,知道他这块是怎么实现的,有一种设计模式,这种设计模式又叫发布订阅模式,什么意思呢,这个东西说到
这儿就多说一句,发布订阅一定是有个主体,被观察者Registry,他可能有很多观察者,在观察着Registry,当被观察者Registry内容
一旦发生变化后,观察者就会发现他的内存有些变化,然后跟随变化进行一定的改变,这就叫观察者设计模式,你看我们这里是属于不,
是不是,是不是我的provider一动的时候,Registry就会把消息给推送过来,Registry变化是不是会通知consumer,这种设计模式就
叫观察者设计模式,所以以后如果位问dubbo中用了什么设计模式,那其中就有一种叫做观察者设计模式,是注册中心和consumer之间,
当注册中心发现Provider内容有改变时,会通知consumer,就这样的意思,好了继续,这是第三步,第四步会根据获取到的服务器地址
真实调用provider,获取到的provider地址,这里就有一个问题了,我们在这里是真实的去调用,一定要注意,假设我在provider里面
写了一个方法叫A方法,我在consumer里面写了一个方法叫B方法,我在B方法中底层是真实的去调用A方法,那我问一下,你如果真就
这么调,那a方法还是具体实现吗,就是这个方法是直接被调用的,被保护上了吗,没有,我们之前学过一种设计模式,可以保护我们
可调用方法对象,那个设计模式,就在我们的高级Spring中学的,代理设计模式,代理设计模式优点,保护真实对象,dubbo是个什么东西,
dubbo是什么,RPC服务框架,所谓的RPC是什么,不知道远程服务器的具体实现,我们得把Provider提供的功能保护起来,那所以
他中间这块,是使用了一种代理设计模式,那在我们这里做的时候,是这么做的,我们一会写代码就会发现,在consumer中有一个类
A类,在A类中我们要声明provider中的某一个类,B类对象,这个类的对象,你要是打断点的时候,你会发现proxy,代理对象,
那这样通过代理对象,我就保护了真实的provider,我们是通过代理对象,对代理对象调用它真实的功能,就是中间通过代理设计模式
把真实的这个给保护起来了,第四步根据获取到的Provider地址,真实调用Provider的功能,在Consumer方使用了代理设计模式,
创建一个Provider方一个功能,Provider方的一个代理对象,看清楚啊,Provider方的一个代理对象,然后通过代理对象,而且是
动态代理,通过代理对象获取Provider的真实功能,起到保护Provider的真实功能,他们写的东西为什么各大企业都在用,因为
里面的东西真的特别好,用完之后能够达到一个效果,所谓的RPC,其实就是怎么实现的,所谓的RPC框架在我们这里是怎么实现的,
就是使用了动态代理,把真实方法给保护起来了,就不能真实调用了,就是这么一回事,不用去背RPC强大的概念和强大的名词,
所给他迷惑了,上面这部分完事了,第五部分对我们开发来说,没什么太大影响,第五部分主要是给统计人员或者维护人员用的,
叫Monitor,Monitor他叫做监听器,他的一个作用,到第五步的话,这个监听器就在这放着,是什么呢,是consumer和Provider
每隔一分钟会向Monitor会发送统计信息,统计信息包含访问次数,频率等,什么意思,它是干什么的呢,就是统计一下,比如说,
consumer调用了provider,调用一下那次数就加1了,然后就推送给Monitor了,Monitor是一个统计功能,所以你开发的时候,
有没有Monitor行不行,没有Monitor行不行,行吧,他的作用就是干什么,就是统计一下,观察一下比如我们的Provider,有两个
Provider,A Provider,一个B Provider,然后发现,A Provider压力太大了,那我们就想办法再开发一个,把A进行拆分,
拆分成A1项目,A2项目,拆分成两,这样的话就减少他们两个负载了,就是观察的,所以我们不需要把重点放在Monitor这儿,
这就是我们关于Dubbo的运行原理,这5步你背也要给我背下来,以及上面的2,3点都是特别重要的,尤其这个原理图,
你在用dubbo的时候,这个原理图必须印在脑子中,我们发现这个图讲完没,看看有没有东西我没有说到的,上面已经告诉我们了,
看清楚,蓝色虚线,蓝色虚线叫初始化,什么意思呢,就是说,我们在做的时候,初始化都是在容器启动的时候做的事情,
蓝色虚线,我们先解释虚线和实现,虚线都是异步,实现都是同步访问的,虚线都是异步访问,什么叫同步什么叫异步,
我们假设这里有一个代码,这个是要同步访问的,前面有一个功能,叫A,下面有一个功能B,假设走到C的时候,他进行异步请求,
B是正常往下走,同步呢,A,C,B,如果C是同步,必须等他请求过去,并且回来,才能去走B,所以你会发现,同步这种请求,
它会消耗一定的时间,是不是,但是你会发现啊,我们在这里去做的时候,有没有同步,哪儿呢,consumer调用provider的,
dubbo这个框架,这个RPC框架,他最耗时的一个过程,就是第四部,因为他是同步的,第四步指的是,我们的consumer真实的
去调用provider的那个过程,就是真实去调用方法的过程,那有人说为什么不用异步呢,你要是异步了,A,C,B,我B这块能不能
知道C这块有没有执行成功,能知道吗,异步是不是向旁边来执行的,那我B根本不知道C有没有执行成功,那你每次调完之后,
不知道成没成功,所以这块没办法,只能设计成同步,一定是当我这块请求完成之后,获取到结果,我才往下执行,
举个例子,比如C做了一个事情,就是调用Provider中的新增方法,就如我在Provider中写个方法叫int,假如我使用异步的话,
正常调用返回int值,那Consumer这段是不是要有一个if判断,如果大于0就成功了,那你想想,如果异步的话这个东西有用吗,
没有用,但是如果同步呢,是不是我调用完之后,他就把int值返回回来,我下面就可以判断了,所以这块只能设计成同步,
即使性能有一定的影响,但是也必须设计成同步,异步的话那就没办法了,你根本不知道结果,蓝色虚线表示在启动时完成的
功能,然后红色虚线,红色的实现,都是程序运行过程中执行的功能,明白我在说什么吗,就是0start,1register,2subscribe,
比如当我们去启动provider的时候,做了0start和1register,consumer启动的时候做了几,做了2subscribe,当我们去真实的
运行项目,你点个按钮的时候,你走的是4invoke,比如当我们的provider内容改变了,consumer这块是不是有个3notify,
前提是consumer和provider都在跑着呢,一定注意,运行过程中,最后一个,所有的角色都是可以在一台单独的服务器上,
知道我在说什么吗,就是这是一个provider,他在一个服务器上,registry他可以在一个服务器上,consumer他在一个服务器上,
跨服务器了,跨服务器就必须走网,走网他就必须遵守协议,不是必须在HTTP协议,都可以单独放在服务上,所以必须遵守特定的
协议,具体Dubbo这块是什么协议,他单独的一个协议了