3.1 StaticDirectory

StaticDirectory 即静态服务目录,顾名思义,它内部存放的 Invoker 是不会变动的。所以,理论上它和不可变 List 的功能很相似。下面我们来看一下这个类的实现。

  1. public class StaticDirectory<T> extends AbstractDirectory<T> {
  2. // Invoker 列表
  3. private final List<Invoker<T>> invokers;
  4. // 省略构造方法
  5. @Override
  6. public Class<T> getInterface() {
  7. // 获取接口类
  8. return invokers.get(0).getInterface();
  9. }
  10. // 检测服务目录是否可用
  11. @Override
  12. public boolean isAvailable() {
  13. if (isDestroyed()) {
  14. return false;
  15. }
  16. for (Invoker<T> invoker : invokers) {
  17. if (invoker.isAvailable()) {
  18. // 只要有一个 Invoker 是可用的,就认为当前目录是可用的
  19. return true;
  20. }
  21. }
  22. return false;
  23. }
  24. @Override
  25. public void destroy() {
  26. if (isDestroyed()) {
  27. return;
  28. }
  29. // 调用父类销毁逻辑
  30. super.destroy();
  31. // 遍历 Invoker 列表,并执行相应的销毁逻辑
  32. for (Invoker<T> invoker : invokers) {
  33. invoker.destroy();
  34. }
  35. invokers.clear();
  36. }
  37. @Override
  38. protected List<Invoker<T>> doList(Invocation invocation) throws RpcException {
  39. // 列举 Inovker,也就是直接返回 invokers 成员变量
  40. return invokers;
  41. }
  42. }

以上就是 StaticDirectory 的代码逻辑,很简单,就不多说了。下面来看看 RegistryDirectory,这个类的逻辑比较复杂。