Dubbo
- 什么是Dubbo
- Dubbo能做什么?
- Dubbo架构图如下?
-
- Dubbo 整体设计
- 配置说明
- config配置层: 对外配置接口,以ServiceConfig,ReferenceConfig为中心,可以直接配置初始化配置类,也可以通过spring解析配置生成配置类
- proxy服务代理层:服务接口透明代理,生成动态代理,扩展接口为ProxyFactory
- registry注册中心层:封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory,Registry,RegistryService
- cluster路由层:封装多个提供者的路由以及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster,Directory,Router,LoadBalance
- monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService
- protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter
- exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
- transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec
- serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
- 流程如下
- Dubbo核心SPI机制
什么是Dubbo
dubbo是一个分布式服务框架,致力于提供性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不用需要的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,说白了就是个远程服务调用的分布式框架
其核心部分包含了
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列 化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
总结:dubbo就是面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维
Dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务 提供者的IP地址,并且能够平滑添加或删除服务提供者。
4. Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载
peoxy:服务代理指的是我们在调用中,我们在调用,感觉是在调用本地接口方法,屏蔽远程客户端的复杂性。通过动态代理来实现的
Dubbo架构图如下?
流程说明:
1. Provider(提供者)绑定指定端口并启动服务
2. 提供者连接注册中心,并将本机IP,端口,应用信息和提供服务信息发送至注册中心存储
3. Consumer(消费者),连接注册中心,并发送应用信息,所求服务信息至注册中心
4. 注册中心根据,消费者所求服务信息匹配对应的提供者列表发送至Consumer应用缓存
5. Consumer在发起远程调用时基于缓存的消费者列表选择其一发起调用
6.Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer
设计的好处
1.Consumer 与Provider 解偶,双方都可以横向增减节点数。
2.注册中心对本身可做对等集群,可动态增减节点,并且任意一台宕掉后,将自动切换到另一台
3.去中心化,双方不直接依懒注册中心,即使注册中心全部宕机短时间内也不会影响服务的调用
4.服务提供者无状态,任意一台宕掉后,不影响使用
Dubbo 整体设计
配置说明
config配置层: 对外配置接口,以ServiceConfig,ReferenceConfig为中心,可以直接配置初始化配置类,也可以通过spring解析配置生成配置类
proxy服务代理层:服务接口透明代理,生成动态代理,扩展接口为ProxyFactory
registry注册中心层:封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory,Registry,RegistryService
cluster路由层:封装多个提供者的路由以及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster,Directory,Router,LoadBalance
monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService
protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter
exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec
serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
流程如下
Dubbo核心SPI机制
Dubbo 中的SPI机制
在了解Dubbo的spi之前 先来了解一下 JAVA自带的SPI
java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk提供服务实现查找的一个工具类java.util.ServiceLoader
1.创建一个接口
class JAVASPIInterface{
public void sayHello();
}
2.创建接口的实现类
class JAVASPIInterfaceImpl implements JAVASPIInterface{
public void sayHello(){
System.out.println("JAVA SPI");
}
}
3.在Resource目录下创建META-INF/services/这个两个目录,名字固定不能修改,在源码ServiceLoader写死(344行),然后在以接口的全限定名创建一个文件。文件里面放入接口实现的全路径(图如下)
4.测试如下
public class JAVASPIDemo {
public static void main(String[] args) {
ServiceLoader<JAVASPIInterface> load = ServiceLoader.load(JAVASPIInterface.class);
Iterator<JAVASPIInterface> iterator = load.iterator();
while (iterator.hasNext()){
JAVASPIInterface next = iterator.next();
next.sayHello();
}
}