我正在使用 infinispan 缓存来通信 K8 中部署的多个服务。我希望这些缓存是
下面是我正在使用的缓存配置,此配置在使用公共库的所有服务中共享。
@PostConstruct
public void init(){
if(defaultCacheManager==null){
defaultCacheManager = cacheManager();
}
for(String cacheName:cacheNames){
createCache(defaultCacheManager,cacheName);
}
}
public Cache<String, String> createCache(DefaultCacheManager cacheManager, String cacheName) {
return this.buildCache(cacheName, cacheManager, cacheExpiringEvictingConfig(cacheManager));
}
private Configuration cacheExpiringEvictingConfig(DefaultCacheManager cacheManager) {
ConfigurationBuilder confBuilder = new ConfigurationBuilder();
confBuilder.expiration().lifespan(200, TimeUnit.HOURS);
confBuilder.memory().maxCount(1000000).whenFull(EvictionStrategy.REMOVE);
confBuilder.clustering().cacheMode(CacheMode.DIST_ASYNC);
return confBuilder.build();
}
private <K, V> Cache<K, V> buildCache(String cacheName, DefaultCacheManager cacheManager, Configuration configuration) {
cacheManager.defineConfiguration(cacheName, configuration);
Cache<K, V> cache = cacheManager.getCache(cacheName);
return cache;
}
如果有人可以完成此操作并为我提供更好的配置,该配置可以提供最佳性能(更快的读/写),因为我的服务严重依赖缓存。我还可以看到分布式在我的本地机器上使用单个 jvm 运行良好,但是当部署在 k8 中时。缓存未同步。
为了使多个 Infinispan 实例相互连接,您需要在 DefaultCacheManager 的 GlobalConfiguration 中配置传输。
要配置在 Kubernetes 中工作的传输,您可以利用 Infinispan 附带的
jgroups-kubernetes.xml
堆栈。您可以按如下方式配置:
GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
.transport()
.defaultTransport()
.addProperty("configurationFile", "default-configs/default-jgroups-kubernetes.xml")
.build();
DefaultCacheManager cacheManager = new DefaultCacheManager(globalConfig)
此配置将利用 JGroups DNS_PING 协议基于 k8s 服务建立集群成员资格。您需要创建一个引用所有包含 Infinispan 的应用程序 pod 的无头 k8s 服务,然后通过设置 java 属性
-Djgroups.dns.query=$SERVICE_NAME.$NAMESPACE.svc.cluster.local
来配置 DNS_PING 协议。
有关工作示例,请参阅我们的 Kubernetes 简单教程。