dubbo 提供的启动类:Main.main();
容错策略(通过配置服务的cluster):
- 6种容错:
1.重试 :failover(默认) 重试3次= retries 2次+ 本身调用一次
2.快速失败:failfast
3.失败之后记录日志:failback
4.失败安全:failsafe
5.并行调用多个服务:forking
6.广播出去:任何一台报错就失败。(更新所有节点缓存)
服务降级(通过在客户端reference配置mock制定实现服务降级的类):
- 异常降级
- 限流降级
- 熔断降级
服务循环依赖:
- 全局配置dubbo.registry.check=false //启动时连接失败会发起重试
- reference 配置 check=false 服务启动时连接失败会在服务启动后在发起重试
主机绑定:
- 配置dubbo.registry.host 否则通过访问注册中心拿到本地的IP地址
元数据中心(减少url传输数据,建议存储在redis中):
- 配置dubbo.metadata-report.address=注册中心地址
- 配置dubbo.registry.simplied=true
@SPI:
@SPI(“xxxx”) 表示当前扩展的默认实现
Dubbo SPI(ExtensionLoader):
- 静态扩展点
需要指定扩展的类及配置文件中的key
- 自适应扩展点
- @Adptive
@Adptive加在类上
- 目的:针对具体的实现进行适配
@Adptive加在方法上
- 动态生成类(Protocol$Adaptive Implement Protocol)
- 激活扩展点
通过url 过滤参数, @Activate 通过value 设置激活条件(相当于condition)
服务发布:
Server端 Invoker的构建:
// 1.PROXY_FACTORY 通过自适应扩展点进行动态适配了StubProxyFactoryWrapper(JavassistProxyFactory())
// 相当于先调用了StubProxyFactoryWrapper.getInvoker() 然后调用了JavassistProxyFactory.getInvoker()
Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));
// 2. 使用 proxy.getClass()通过javassist 动态生成了目标方法,**如下图:**
final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
// 3.当客户端调用的时候直接从对应协议的类中获取缓存的Invoker 进行调用。
Server Invoker包装过程:
Sever 端接收请求:
Client端获取代理对象:
Client端连接注册中心:
见:Client端获取代理对象
Client Invoker:
见:Client端获取代理对象
Client端调用:
Directory: