Dubbo问题总结

Dubbo问题总结

1.如何注册

2.注册了什么东西

主要分为两个部分,第一部分spring如何加载生成dubbo对象,第二dubbo服务如何注册到注册中心

1.spring如何加载生成dubbo对象
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="demo-provider"/>
    
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
</beans>

spring配置读取,解析,再生成bean,放到spring上下文的过程。然后获取注册中心的地址-><dubbo:registry address=“zookeeper://127.0.0.1:2181” check=“false” subscribe=“false” register="">,使用了zookeeper作为注册中心.

在Class类上引入的注解为com.alibaba.dubob.config.anntation的service,而不是springramework包中的service,这样Service服务就被注册到dubbo中了。
使用注解方式在xml配置方面好像没有什么区别。
但是在class类上xxxController中依然引入springframework的@COntroller注解,但是在引入某service服务时候,不适用spring framworl提供的@autowired或@Resource注解,而采用com.alibaba.dubbo.xxx中的@Reference注入Service。
通过@Refernce注解,dubbo会在扫描的时候会自动帮我们代理接口,然后通过rpc调用远程服务。

3.zk如何存储?

Zookeeper采用树形的目录结构来储存信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRIpPOSf-1594891246099)(C:\Users\ZhouHu\AppData\Roaming\Typora\typora-user-images\image-20200707134235733.png)]

服务提供者启动时:向/dubbo/com.foo.BarService/providers目录写入自己的URL地址。
服务消费者启动时:订阅/dubbo/com.foo.BarService/providers目录下提供者URL地址。并         	                    向/dubbo/com.foo.BarService/consumers目录写下自己的URL地址。
监控中心启动时:订阅/dubbo/com.foo.BarService 目录下的所有提供者和消费者的URL地址。

6.如何选择调用机器

负载均衡:com.alibaba.dubbo.rpc.cluster.LoadBalance类

Random LoadBalance(默认使用)
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
看方法的细节就是首先便利每个提供服务的机器,获取每个服务的权重,然后累加权重值,判断每个服务的提供者权重是否相同,如果每个调用者的权重不相同,并且每个权重大于0,那么久会根据权重的总值生成一个随机数,再用这个随机数,根据调用者的数量每次建去调用者的权重,直到计算出当前的服务提供者随机数小于0,就选择那个提供者。例外,如果每个己其的权重都相同,那么权重久不会参与己算,直接选择随机算法生成某一个选择,完全随机。
轮询,按公约后的权重设置轮询比率。
存在慢的提供者类请求问题,比如:第二台机器很慢,但没挂,当请求调到第二胎时久卡在那,久而久之,所有请求都卡掉再第二台上。
轮询调用,轮询调用的过程主要是维护了局部变量的一个LinkedHashMap去储存调用者和权重值对应关系,然后遍历每个调用者,把调用者和当前大于0的权重值放进去,再累加权重值。还有一个全局变量map,找到第一个服务调用者,首先是找到每个服务的key值和method,这里可以理解为标识第一个调用者的唯一key,然后再给他对应的值保证全自行的+1(AtomicPositveInteger是原子的)再对这个值取模总权重,而没催对其权重值-1.轮询调用并不是简单的一个接着一个依次调用,它是根据权重的值进行循环的。
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动。

7.rpc调用方式

使用Dubbo进行远程调用实现服务交互,它支持多种协议。由于Dubbo将这些协议的实现进行了封装。无论是服务端还是客户端。都不关心协议的细节,只需要在配置中指定使用的协议即可,从而保证了服务提供方与服务消费之间的透明。。
例外,如果我们使用Dubbo的服务注册中心组件,这样服务提供方将服务发布到注册的中心,只是将服务的名称暴露给外部,而服务消费方只需要知道注册中心和服务提供方提供的服务名称,就能透明地调用服务,后面我们会看到具体提供服务和消费服务这些配置内容,使得双方之间交互的透明化。

8.监控流程

MonitorFilter主要对调用过程进行监控。
其核心代码是collect()方法,该方法会将监控的数据通过Monitor monitor进行收集,收集后存放再本地内存,每隔固定的时间(默认是60S)上传到监控节点上。
Monitor的默认是实现是 com.alibaba.dubbo.monitor.dubbo包下的DubboMonitor类。
DubboMonitor中会定义一个ConcurrentHashMap的对象用于保存监控信息。MonitorFilter的collect方法执行时会讲监控诗剧保存到该ConcuttentHashMap中;例外,DubboMonitor默认会开启一个监狱线程池的定时任务执行器ScheduledExecutorService,并且在构造函数中会启动一个周期性执行的任务讲ConcurrentHashMao中的数据发送到监控节点上,发送逻辑在send()方法中实现,发送周期是60000毫秒(1分钟)

ervice,并且在构造函数中会启动一个周期性执行的任务讲ConcurrentHashMao中的数据发送到监控节点上,发送逻辑在send()方法中实现,发送周期是60000毫秒(1分钟)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值