个人对于Dubbo以及基本深入讲解

个人理解总结

一.Dubbo是做什么的

dubbo是基于J2EE规范的一种软负载均衡管理,将view层和service分离的一个中间件。

实质:java下面的一套RPC框架(远程过程调用),作用就是统一管理配置

原理: A系统调用B系统接口服务, 后面就是怎么把这个流程,动态化(zookeeper通知)、权限化、配置化、低耦合化、自动化

二.Dubbo的运行流程

 个人对于Dubbo以及基本深入讲解

图解说明:

1.provider暴露服务的提供方。

2.Consumer调用远程服务的消费方

3.registry:服务注册与发现的注册中心

4.Monitor:统计服务的调用次数,和调用时间的监控中心

注意:monitor其实也可以管理服务方,比如黑白名单的设置,可以让哪些消费者(ip)不能调用哪些服务

5. container服务运行容器

6. async异步加载,sync是同步

理解调用关系

1. 服务容器(container)负责启动加载,运行服务提供者(provide)

2. 服务提供者在启动(init)的时候向注册(register)中心提供自己的服务

3. 服务消费者在启动的时候(init)向注册中心订阅自己需要的服务

4. 注册中心返回服务提供者地址列表给消费者,如果有变更

解释:这里的变更是指服务方启动之后,也就是服务方将所有的服务地址交给了注册中心,此时注册中心若发现本次从服务方拿到的所有服务地址与上次注册中心缓存的服务方地址有不一致(如:上次服务方向注册中心注册的地址有A,B,C,本次服务方向注册中心注册的地址有A,B,C,D)

那么注册中心将基于长连接推送变更数据给消费者

长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包(心跳包

)

5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选择另外一台调用

软负载均衡算法:轮询算法,一致性Hash算法

简单解释一下轮询算法

原理:把每一次来自服务消费者用户的请求轮流分配给内部的服务器,比如:从1开始,一直到N,N是内部服务器(也就是服务提供者的接口所在的服务器上,不是所谓的一个服务器上仅仅有几个接口,而是所有的接口都以分布式的形式存放在多个服务器上)的总个数

但是简单的轮询算法根本不满足与实际的生产环境,因为使用轮询算法的前提是所有的服务器处理业务的能力以及性能(软硬件)不一致,这就导致一种现象,轮询算法在不考虑服务器的性能的前提下,只会将业务轮流的分配到服务器上。

//解决方案

使用权重轮询算法调度,顾名思义,将处理业务能力强的服务器设置权重,给它较高的权重,这样每次消费者来的时候会根据权重轮询算法首先将任务交给权重值较高的服务器由它去处理,当这台权重值较高的服务器负载达到性能最优的时候,再将任务分配给其他权重较低的服务器

 

6. 服务消费者和提供者,在内存中累计的调用次数和调用时间,则定时每分钟发送一次统计数据到监控中心(Monitor)

拓展点:a在搭建好Monitor之后,可以通过ip地址+端口跳转到监控中心管理页面,其中有一项黑白名单的应用比较无脑,但是面试官爱问。。。论坛上有NB的人用代码实现黑白名单管理。表示呵呵