点击回车,进入dubbo控制台
ls
显示服务列表。
ls -l
显示服务详细信息列表。
ls XxxService
显示服务的方法列表。
ls -l XxxService
显示服务的方法详细信息列表。
ps
显示服务端口列表。
ps -l
显示服务地址列表。
ps 20880
显示端口上的连接信息。
ps -l 20880
显示端口上的连接详细信息。
trace XxxService
跟踪1次服务任意方法的调用情况。
trace XxxService 10
跟踪10次服务任意方法的调用情况。
trace XxxService xxxMethod
跟踪1次服务方法的调用情况
trace XxxService xxxMethod 10
跟踪10次服务方法的调用情况。
1、InvokerInvocationHandler jdk动态代理
5、RegistryDirector返回Invokers
Router分为:Script 脚本路由、Condition 条件路由
6、通过MockInvokersSelector的route方法(getNormalInvokers)拿到能正常执行的invokers
8、当回到AbstractClusterInvoker后,执行(默认FailoverClusterInvoker,根据配置的是,Failfast Cluster(快速失败) , Failsafe Cluster(失败安全) , Failback Cluster(失败自动恢复) , Forking Cluster(并行调用多个服务器,只要一个成功即返回) , Broadcast Cluster(广播调用所有提供者,逐个调用,任意一台报错则报错))doInvoker方法
9、FailoverClusterInvoker调用AbstractClusterInvoker的select方法
10、执行doSelect方法
11、调用AbstractLoadbalance的select方法
12、根据配置的负载均衡策略调用对应的(如RoundRobinLoadBalance)类的doSelect方法
13、返回invokers.get()方法
14、调用FailoverClusterInvoker的invoke方法
均继承自抽象类AbstractDirectory
Directory 获取 invoker 是从 methodInvokerMap 中获取的,主要都是读操作,那它的写操作是在什么时候写的呢?就是在回调方法 notify 的时候操作的,也就是注册中心有变化,则更新 methodInvokerMap 和 urlInvokerMap 的值
根据dubbo-admin配置的路由规则来过滤相关的invoker,当我们对路由规则点击启用,就会触发 RegistryDirectory 类的 notify 方法。
notify方法调用refreshInvoker方法。
route方法的实现类为ConditionRoute 根据条件进行过滤
1、调用mathThen方法
2、调用matchCondition方法
3、调用isMatch判断
4、调用isMatchGlobPattern方法
集群模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是Dubbo Cluster集群的作用。
通过cluster来指定集群容错方式
其实就是应对出错情况采取的策略
用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非提供者挂了,再连另一台,自动开启延迟链接,以减少长接数
启动时服务提供者将当前进程启动时间注册到ZK;服务消费者发现该节点后计算服务启动时间(相对当前时间),在默认预热时间的前20%时间内,该节点权重始终固定为2,这样客户端的负载均衡器只会分发极少的请求至节点。
在预热时间之后的80%时间内,该节点权重将随着时间的推移而线性增长;待预热时间到期后,权重自动恢复为默认值100;负载均衡器的内核是一个标准的WLC算法模块,即加权最少连接算法;
如果某个节点Hang住或宕机,其权重会迅速自动调节降低,避免持续性影响;当节点下线时,服务端提前触发权重调节,重载默认权重至1并发布到注册中心,服务消费者将迅速感知到该事件;
服务提供者优雅下线步骤(注意这套逻辑仅在服务端执行)在ok.htm?down=true对应的controller中加入下列逻辑,注意要判断down是否为true,因为正常来说false表示启动验证而不是关机
服务者消费者配置
dubbo服务支持参数动态调整,例如动态调整权重,但dubbo实现方式较为特殊,并不是常规思路。
ServiceConfig类拿到对外提供服务的实际类ref,然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转换(javassistProxyFacory、JdkProxyFactory),接着要做Invoker转换到Export的过程
服务发布:本地暴露、远程暴露
为什么会有 本地暴露 和 远程暴露 呢?不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是 Provider ,又是 Consumer ,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远,因此他是有 本地暴露 服务的这个设计.从这里我们就知道这个两者的区别
1、spring启动,解析配置文件
2、创建dubbo标签解析器
3、解析dubbo标签
4、ServiceBean解析
5、容器创建完成,触发ContextRefrestEvent
6、export暴露服务
7、duExportUrls
8、doExportUrlsFor1Protocol
9、getInvoker
10、protocol.export
11、开启服务器 openServer()如nettyServer
12、注册服务到注册中心 registerProvider
Filter 在服务暴露前,做拦截器初始化,在加载所有拦截器时会过滤支队provider生效的数据。
可以。zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成 properties 对象方便使用。建立线程池,定时检测并连接注册中心,失败了就重连。
注册服务到zk其实就是在zk上创建临时节点,当节点下线或者down掉时,即会删除临时节点,从而使服务从可用列表中剔除。
持久节点
临时节点
1、export的时候进行zk订阅
2、设置监听回调的地址,回调给FailbackRegistry的notify
3、创建持久节点
4、设置对该节点的监听
5、更新新的服务信息,服务启动和节点更新回调,都会调用到这里
6、更新缓存文件
7、对比新旧信息是否有变化,有则重新暴露服务
高并发大业务量情况下,暂时屏蔽边缘业务
MockClusterInvoker
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。
Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层解耦。
Dubbo在调用远程的服务的时候再本地有一个接口,就想调用本地方法一样去调用,底层实现好参数传输和远程服务运行结果传回之后的返回。
Dubbo的特点:
(1)它主要使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。
(2)采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问即可,不像使用WebService一样每个服务都得记录好接口调用方式。
(3)监控中心时实现服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。
(4)高可用,如果有服务挂了,注册中心就会从服务列表去掉该节点,客户端会像注册中心请求另一台可用的服务节点重新调用。同时注册中心也能实现高可用(ZooKeeper)。
(5)负载均衡,采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。
Dubbo需要四大基本组件:Rigistry,Monitor,Provider,Consumer。
1、监控中心的配置文件-dubbo.properties文件
(1)容器,监控中心是在jetty和spring环境下运行,依赖于注册中心,日志系统是log4j
dubbo.container = log4j,spring,registry,jetty
(2)监控服务的名称,监控系统对整个Dubbo服务系统来说也是一个服务
dubbo.application.name = simple-monitor
(3)服务的所有者,这是Dubbbo的服务的功能,可以指定服务的负责人
dubbo.application.owner = coselding
(4)注册中心的地址,配置后监控中心就能通过注册中心获取当前可用的服务列表及其状态,在页面向你汇报Dubbo中的服务运行情况。
dubbo.registr.address = multicast://{ip}:{port} //广播
dubbo.registr.address = zookeeper://{ip}:{port} //zookeper
dubbo.registr.address = redis://{ip}:{port} //redis
dubbo.registr.address = dubbo://{ip}:{port} //dubbo
(5)dubbo协议端口号
dubbo.protocol.port = 7070
(6)jetty工作端口号
dubbo.jetty.port = 8082
(7)工作目录,用于存放监控中心的数据
dubbo.jetty.directory = ${user.home}/monitor
(8)监控中心报表存放目录
dubbo.charts.directory=${dubbo.jetty.directory}/charts
(9)监控中心数据资料目录
dubbo.statistics.directory=${user.home}/monitor/statistics
(10)监控中心日志文件路径
dubbo.log4j.file=logs/dubbo-monitor-simple.log
(11)监控中心日志记录级别
dubbo.log4j.level=WARN
2、Dubbo提供负载均衡方式
(1)Random,随机,按权重配置随机概率,调用量越大分布越均匀,默认方式。
(2)RounRobin,轮询,按权重设置轮询比例,如果存在比较慢的机器容易在这台机器上请求阻塞较多。
(3)LeastActive,最少活跃调用数,不支持权重,只能根据自动识别的活跃数分配,不能灵活调配。
(4)ConsistenHash,一致性hash,对相同参数的请求路由到一个服务提供者上,如果有类似灰度发布需求可采用。
3、Dubbo过滤器
Dubbo初始化过程加载ClassPath下的META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/三个路径下的com.alibaba.dubbo.rpc.Filter文件。文件内容:
Name = FullClassName,这些类必须实现Filter接口。
自定义Filter类:
配置文件在配置过滤器,consumer.xml中:
Dubbo对过滤器的加载过程:
先加载三个路径下的com.alibaba.dubbo.rpc.Filter文件里面的键值对,key为过滤器名称,value为过滤器的类的全限定名(这个类必须实现Dubbo中的Filter接口)。
自定义的类中@Active注解是过滤器设定的全局基本属性。
Spring在加载consumer.xml文件时,通过 <dubbo:consumer filter="xxx" id = "xxx" retrries = "0">这个配置指定消费者端要加载的过滤器,通过filter属性指定过滤器名称。
@Activate注解-自动激活,group属性是表示匹配了对应的角色才被加载,value表示表明过滤条件,不写则表示所有条件都会被加载,写了则只有dubbo URL中包含该参数名且参数值不为空才被加载,这个参数会以dubbo协议的一个参数K-V对传到Provider。
4、Dubbo的Provider配置
5、Dubbo的Consumer配置
1、Dubbo是什么?
Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式框架。
2、为什么使用Dubbo?
很多公司都在使用,经过很多线上的考验,内部使用了Netty,Zookeeper,保证了高性能可用性。
使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可以提高业务复用灵活性扩展,使前端应用能快速的响应对边的市场需求。分布式架构可以承受更大规模的并发流量。
Dubbo的服务治理图:
3、Dubbo和Spring Cloud的区别
两个没有关联,但是非要说区别,有如下几点:
(1)通信方式不同,Dubbo使用RPC通信,Spring Cloud使用HTTP Restful方式
(2)组成部分不同
4、Dubbo支持的协议
dubbo:// (推荐);rmi:// ;hessian:// ;http:// ;webservice:// ;thrift:// ;memcached:// ;redis:// ;rest:// 。
5、Dubbo需要容器吗?
不需要,如果硬要容器的话,会增加复杂性,同时也浪费资源。
6、Dubbo内置的服务容器
Spring Container;Jetty Container;Log4j Container。
7、Dubbo中节点角色
Register,Monitor,Provider,Consumer,Container(服务运行的容器)。
8、Dubbo的服务注册和发现的流程图
9、Dubbo的注册中心
默认使用Zookeper作为注册中心,还有Redis,Multicast,dubbo注册中心。
10、Dubbo的配置方式
Spring配置方式和Java API配置方式
11、Dubbo的核心配置
(1)dubbo:service 服务配置
(2)dubbo:referece 引用配置
(3)dubbo:protocol 协议配置
(4)dubbo:application 应用配置
(5)dubbo:registry 注册中心配置
(6)dubbo:monitor 监控中心配置
(7)dubbo:provider 提供方配置
(8)dubbo:consumer 消费方配置
(9)dubbo:method 方法配置
(10)dubbo:argument 参数配置
12、在Provider 节点上可以配置Consumer端的属性有哪些?
(1)timeout:方法调用超时
(2)retries:失败重试次数,默认是2次
(3)loadbalance:负载均衡算法,默认随机
(4)actives消费者端,最大并发调用控制
13、Dubbo启动时如果依赖的服务不可用会怎样
Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。默认check ="true"。
14、Dubbo序列化框架
推荐使用Hessian序列化,还有Dubbo,FastJson,Java自带序列化。
15、Dubbo的通信框架
默认使用Netty框架,另外也提供了Mina,Grizzly。
16、Dubbo集群容错方案
(1)Failover Cluster,失败自动切换,自动重试其他服务器。
(2)Failfast Cluster,快速失败,立即报错,只发起一次调用。
(3)Failsafe Cluster,失败安全,出现异常时,直接忽略。
(4)Failback Cluster,失败自动恢复,记录失败请求,定时重发。
(5)Forking Cluster,并行调用多个服务器,只要一个返回成功即可。
(6)Broadcast Cluster,广播逐个调用所有提供者,任意一个报错则报错。
17、Dubbo的负载均衡策略
(1)Random LoadBalance,随机,按权重设置随机概率,默认。
(2)RoundRobin LoadBalace,轮询,按公约后的权重设置轮训比例。
(3)LeastActive LoadBalace,最少活跃调用数,相同活跃数的随机。
(4)ConsistenHash LoadBalance,一致性hash,相同参数的请求总是发到用一个服务器。
18、指定某一个服务
可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。
<dubbo:reference interface="com.weidian.dubbo.IMyDemo" version="1.0" id="myDemo" url="dubbo://127.0.0.1:20880/"></dubbo:reference>
19、Dubbo多协议
Dubbo允许配置多协议,在不同服务器上支持不同协议,或者同一服务支持多种协议。
20、当一个服务有多种实现时怎么做?
当一个接口有多种是现实,可以用group属性来分组,服务提供方和消费方都指定同一个group即可。
21、兼容旧版本
使用版本号过度,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。
22、Dubbo可以缓存吗?
Dubbo提供声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。
23、Dubbo服务之间的调用时阻塞的吗?
默认是同步等待结果阻塞的,支持异步调用。Dubbo是基于NIO的非阻塞实现并行调用的,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个Future对象。
24、Dubbo不支持分布式事务
25、Dubbo必须依赖的包
Dubbo必须依赖JDK,其他为可选。
26、Dubbo使用过程中的问题
Dubbo的设计目的是为了满足高并发小数据量的rpc请求,在大数据量下性能表现不是很好,建议使用rmi或http协议。
27、Dubbo的管理控制台的作用
路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡。
28、Spring boot整合Dubbo
(1)添加依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
(2)配置dubbo
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=org.spring.springboot.dubbo
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=org.spring.springboot.dubbo
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)