Dubbo
- 是一款高性能、轻量级的开源Java RPC框架,提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。
序列化方式
支持多种序列化方式: JDK自带序列化、Hessian2、JSON、Kryo、FST、Protostuff、ProtoBuf等、默认是 Hessian2
- JDK自带序列化(不支持跨语言调用、性能差)
- JSON(性能差)
- Protostuff、ProtoBuf、Hessian2(跨语言的序列化方式)
- Kryo、FST(性能好、专门针对java语言)推荐使用 Kryo 序列化方式
dubbo原理
初始化的时候已经进行:
- Provider:提供者,将服务暴露(@DubboService),启动时将服务注册到Registry注册中心;
- Consumer:消费者,调用服务(@Reference),向Registry注册中心订阅服务,也可以直接通过Dubbo暴露提供者的地址。默认服务容错是Failover Cluster失败自动切换,配合设置重试次数使用retries;
- Registry:注册中心,用于发布和订阅服务的平台,用于替代SOA结构体系框架中的ESB服务总线。提供给消费者服务者提供的服务,如果有变更,会基于长连接推送变更数据给消费者;
使用:
- invoke:调用,消费者调用提供者提供的服务;
异步执行:
- Monitor:监控中心,将消费者,提供者在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册中心
- Zookeeper(支持分布式,有广泛的周边开源产品;但是依赖于Zookeeper的稳定性)
- Redis(支持基于客户端双写的集群方式、性能高;但是要求服务器时间同步,用于检查心跳过期脏数据)
- Multicast
- Simple
服务治理
Service服务下线怎么办?
- 心跳、健康检测
注册中心是可选的?
- 直接在配置文件里面写url、实现提供方和消费方直连
注册中心宕机了怎么办?
- 不会影响已经正常运行的提供者和消费者,因为消费者有本地缓存提供者的信息
Dubbo分层架构
总体分三层,Business(业务层)、RPC层、Remoting
细分有10层:
- Service 接口层:给服务提供者和消费者来实现
- Config 配置层:主要对Dubbo进行各种配置,以SeviceConfig、ReferenceConfig 为中心,可以直接初始化配置类,也可以通过Spring解析配置生成配置类
- Proxy 服务代理层:生成服务客户端Stub、服务端Skeleton,代理之间进行网络通信,做远程调用和返回结果(以ServiceProxy为中心,拓展接口为ProxyFactory)
- Registry 注册中心层:负责服务的注册与发现,(以服务URL为中心,拓展接口为RegistryFactory、Registry、RegistryService)
- Cluster 路由层:封装多个服务提供者的路由以及负载均衡,(以Invoker为中心,扩展接口为Cluster、Directory、Router、LoadBalance)
- Monitor 监控层:对RPC调用次数和调用时间监控
- Protocol 远程调用层:封装RPC的调用,(以Invocation、Result为中心,扩展接口为 Protocol、Invoker、Exporter)
- exchange 信息交换层:封装请求响应模式,同步转异步,(以Request、Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient、ExchangeServer)
- transport 网络传输层:抽象了网络传输的统一接口,可以使用mina或者 netty
- serialize 数据序列化层:数据序列化成二进制流,二进制流反序列化成数据