简单版
- 动态代理 —> 通过javassist来实现。也可以自定义SPI
- 网络传输,netty建立长连接 (
- 序列化 obj—>byte[]
- hessian,hessian2
- pb,使用 proto 编译器,自动进行序列化和反序列化,速度非常快。压缩效果好。
- fst
- Kryo,
- dubbo协议,TCP黏包等问题)
- 序列化 obj—>byte[]
进阶版(带集群能力):
- 服务发现(注册中心), 客户端,服务端启动后,注册到注册中心,dubbo使用zk。客户端会缓存一份,所以启动后注册中心挂了也没事。
- 选择具体服务,cluster层将多个invoker封装成1个invoker
- dicretory, list 获取全部服务提供者信息
- 路由策略,router,过滤。 tag,script,condition
- 负载均衡,选择一个合适的。 轮询,权重,一致性hash,权重随机
- 异常重试,容错机制
- failover,失败,自动重试到其它机器。(默认
- failfast,快速失败。一次调用失败就立即失败,常见于非幂等性的写操作
- failsafe,忽略异常,常用于不重要的接口调用,比如记录日志
- failback,失败了后台自动记录请求,然后定时重发
- forking, fork之后,调用多个
- broadcacst, 广播所有
- 优雅开/停机。
- skywalking链路追踪
服务治理
- 服务降级。HelloServiceMock
- 失败,超时重试。
源码解析
SPI