随着互联网的发展,单一架构、垂直应用架构已经无法满足需求,分布式服务架构势在必行,但是分布式服务自身存在的问题要求有一个分布式治理系统来管理
需求
当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大,就需要一个服务注册中心来管理这些服务,推荐使用zookeeper
架构
服务如何调用
生产者启动之后将自己注册到注册中心,然后消费者去注册中心订阅服务,将服务列表缓存在本地缓存中,每次注册中心的服务更新时会通知消费者更新本地缓存,同时Monitor检测消费者和生产者的变化,消费者通过服务列表去调用生产者
Dubbo分层
总体是分层 Business、RPC、Remoting 三大层
Business
Service 业务层:业务代码的接口与实现。我们实际使用 Dubbo 的业务层级
RPC
config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 Spring 解析配置生成配置类。
proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 扩展接口为 ProxyFactory 。
registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactory, Registry, RegistryService 。cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster, Directory, Router, LoadBalance 。
monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService 。
Remoting
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支持哪些协议?各有什么特点?
1. dubbo协议
Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低
2. rmi协议
RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。
3. hessian协议
Hessian [1] 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
4.http协议
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现
5. thrift协议
当前 dubbo 支持 的 thrift 协议是对 thrift 原生协议 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。
6.WebService 协议
可以和原生 WebService 服务互操作,即:
提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,
或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 WebService 协议调用。
7. 基于 Redis实现的 RPC 协议
8. 基于 Memcached 实现的 RPC 协议
dubbo的负载均衡策略
Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀;
RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题;
LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求;
ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动;
dubbo的健壮性
1.监控中心宕掉不影响使用,只是丢失部分采样数据
2.数据库宕掉之后,注册中心仍能通过缓存提供服务列表查询,但是不能注册新服务
3.注册中心对等集群,任意一台宕掉之后,将自动切换到另一台
4.注册中心全部宕掉,服务提供者和服务消费者仍能通过本地缓存通讯
5.服务提供者无状态,任意一台宕掉后,不影响使用
6.服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。