接下来分析Consumer的请求调用原理。以运行方式启动provider,以debug模式启动consumer。
我们在DemoConsumer类中打断点作为起点来跟踪具体的调用:
1 | public class DemoAction { |
在idea中断点状态下查看表达式的值,可以使用Alt+F8查看。
从demoService.sayHello()说起:
1 | demoService.sayHello("world" + i) |
集群容错的基本流程:
Directory目录服务
包含StaticDirectory和RegistryDirectory。
其中StaticDirectory是静态的,invoker是固定的;RegistryDirectory是注册目录服务,它的Invoker集合来自于ZK,实现了NotifyListener接口,实现了void notify(List
下面是读操作:
1 | -->directory.list//2.进入目录查找 从this.methodInvokerMap里面查找一个Invoker |
Router路由规则
Cluster
1 | FailoverCluster:(默认)失败转移,当出现失败,重试其它服务器,通常用于读操作,但重试会带来更长延迟。 |
LoadBalance
1 | RandomLoadBalance:随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 |
接着前面的调用流程继续分析,FailoverClusterInvoker#doInvoke(Invocation invocation, final List<Invoker
1 | -->Result result = invoker.invoke(invocation) |