java - 我无法让 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
]
我试过了:
在不同的端口上运行两个 Spring Boot 应用程序
在不同的端口上运行两个 tomcat
用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; } }
每次我得到相同的结果时,每个应用程序似乎都在自己缓存。
附加信息:
- 我尝试使用管理中心https://hazelcast.com/product-features/management-center/并且可以连接到集群成员,但我从未在“地图”下看到任何值
- 我想知道 hazelcast 的实例是否已启动但 Spring Boot 没有使用它,而是使用他自己的简单缓存
- 我的 application.properties 是空的
- Spring Boot 2.4.4 版本
解决方案
也许您的每个 Spring Boot 应用程序实际上都创建了两个单独的 Hazelcast 实例,并且它使用非集群的一个实例进行缓存。
请尝试遵循以下指南:
推荐阅读
- html - 如何使用绝对导航栏和相对图像修复 z-index?
- google-apps-script - 如何使用下拉菜单更改范围的单元格内容?
- c# - 如何将现有的pdf“拉”到应用程序中?
- php - 从 PHP 的 shell_exec() 函数执行 Golang 二进制文件
- mysql - MySQL中缺少动态变量名称,在存储过程中使用会话变量是否存在冲突风险?
- amazon-s3 - 具有无服务器框架的 s3 存储桶的 AWS Api Gateway 代理
- javascript - 如何使用 Javascript onclick 自动化 Excel 从 Internet Explorer 下载 PDF
- html - getElementsByTagName 没有找到带有 ID 的“Input”或“td”标签
- validation - Twilio Webhook 验证
- c++ - 我是否经常使用 std::move() ?