首页 > 解决方案 > 我无法让 Spring Boot 和 Hazelcast 集群工作

问题描述

我正在尝试在 Spring Boot 集群应用程序中使用共享缓存。似乎一切正常,但是当我尝试从应用程序的第二个实例中检索缓存值时,它没有从缓存值中获取它。

似乎每个应用程序都在使用自己的缓存而不是共享它。

我按照此处找到的指南设置了一个简单的环境https://hazelcast.com/blog/spring-boot/

我的代码:

    Controller.java
    @Controller
    @RequestMapping("/public/testcache")
    public class TestCacheController {

        @Autowired
        BookService bookService;
        @GetMapping("/get/{isbn}")
        @ResponseBody
        public String getBookNameByIsbn(@PathVariable("isbn") String isbn) {
            return bookService.getBookNameByIsbn(isbn);
        }

        @GetMapping("/clear/cache")
        @ResponseBody
        public String clearCache() {
            bookService.deleteCache();
            return "done";
        }
    }


     BookService.java
     @Service
     public class BookService {
         @Cacheable("books")
         public String getBookNameByIsbn(String isbn) {
              return findBookInSlowSource(isbn);
         }

         private String findBookInSlowSource(String isbn) {
             // some long processing
             try {
                 Thread.sleep(3000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
             return "Sample Book "+isbn;
         }

         @CacheEvict(value = {"books"}, allEntries = true)
         public void deleteCache() {}
    }


    # hazelcast.yaml
    hazelcast:
        network:
          join:
            multicast:
              enabled: true

当我启动应用程序时,我总是得到正确的输出:

    Members {size:2, ver:2} [
        Member [192.168.178.107]:5702 - d53f2c3f-d66f-4ba3-bf8d-88d4935bde4e
        Member [192.168.178.107]:5701 - 69860793-c420-48d3-990c-d0c30a3a92d6 this
    ]

我试过了:

  1. 在不同的端口上运行两个 Spring Boot 应用程序

  2. 在不同的端口上运行两个 tomcat

  3. 用java配置替换yaml配置

     Java Based Configuration
     @Configuration
     @EnableCaching
     public class CacheConfigurator {
         @Bean
         public Config config() {
             Config config=new Config();
             config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);
             return config;
        }
     }
    

每次我得到相同的结果时,每个应用程序似乎都在自己缓存。

附加信息:

标签: javaspringspring-boothazelcast

解决方案


也许您的每个 Spring Boot 应用程序实际上都创建了两个单独的 Hazelcast 实例,并且它使用非集群的一个实例进行缓存。

请尝试遵循以下指南:


推荐阅读