通过“定时刷盘、恢复”机制保证服务的可用性,相应逻辑封装在FailoverReactor中。

    1. /**
    2. * FailoverReactor
    3. *
    4. */
    5. public void init() {
    6. // 故障转移
    7. executorService.scheduleWithFixedDelay(new SwitchRefresher(), 0L, 5000L, TimeUnit.MILLISECONDS);
    8. // 定时刷盘
    9. executorService.scheduleWithFixedDelay(new DiskFileWriter(), 30, DAY_PERIOD_MINUTES, TimeUnit.MINUTES);
    10. // backup file on startup if failover directory is empty.
    11. executorService.schedule(new Runnable() {
    12. @Override
    13. public void run() {
    14. try {
    15. File cacheDir = new File(failoverDir);
    16. if (!cacheDir.exists() && !cacheDir.mkdirs()) {
    17. throw new IllegalStateException("failed to create cache dir: " + failoverDir);
    18. }
    19. File[] files = cacheDir.listFiles();
    20. if (files == null || files.length <= 0) {
    21. new DiskFileWriter().run();
    22. }
    23. } catch (Throwable e) {
    24. NAMING_LOGGER.error("[NA] failed to backup file on startup.", e);
    25. }
    26. }
    27. }, 10000L, TimeUnit.MILLISECONDS);
    28. }

    1、DiskFileWriter
    定时将 Nacos Server端的信息写入容灾缓存目录下的文件中。

    2、SwitchRefresher
    从容灾目录下读取Nacos Server 信息,并进行恢复。
    It’s a switch file which need user create. It will be used when there are some problem between client and server. Users can create this file and set value = 1 to open client failover feature.
    It’s a old logic, maybe need to discuss how to optimize it.