在上一篇博客文章中,我描述了Sidecar应用程序如何用于在Eureka中注册Cassandra节点,并且更普遍地可以用于在Eureka中注册任何非JVM应用程序。
在本文中,我将介绍应用程序如何查询Sidecar注册节点。
发现注册的节点–初始化后
如果在Bean初始化阶段不需要注册的节点,则沿着以下方向很容易发现节点:
@Component
public class SampleCommandLineRunner implements CommandLineRunner {
@Autowired
private DiscoveryClient discoveryClient;
@PostConstruct
public void postConstruct() {
// System.out.println("Printing from postConstruct");
// printDiscoveredNodes();
}
@Override
public void run(String... strings) throws Exception {
System.out.println("Printing from run method");
printDiscoveredNodes();
}
public void printDiscoveredNodes() {
System.out.println(" Printing Discovered Nodes ");
for (ServiceInstance instance: discoveryClient.getInstances("samplecassandra.vip")) {
System.out.println("Host: Port = " + instance.getHost() + ":" + instance.getPort());
}
}
}
这些将打印以“ samplecasssandra.vip” VIP名称注册的节点。
请注意,节点是通过run方法打印的,该方法在Spring容器的初始化之后被调用。 但是,如果尝试从某个生命周期阶段中列出节点,请说postConstruct方法,那么很有可能会引发异常(此行为在Spring Cloud的“ Angel.SR3”版本中可见,但在“ Brixton。*”版本)
发现注册节点–初始化期间
现在,如果应用程序需要在初始化期间发现节点,则流程会稍微复杂一些,有关潜在问题,请查看此工单 。
DiscoveryClient在Spring生命周期的很晚才初始化,并且如果在任何bean的后期处理活动中使用DiscoveryClient,则很可能会引发异常。
举例来说,假设应用程序现在使用Sidecar注册了Cassandra节点,以初始化Cassandra连接,一种方法是使用以下方式围绕Cassandra连接创建包装器:
import org.springframework.data.cassandra.core.CassandraTemplate;
public class CassandraTemplateWrapper extends CassandraTemplate {
@Override
public void afterPropertiesSet() {
}
}
这里,CassandraTemplate被重写,以防止在afterPropertiesSet方法中检查是否存在Cassandra会话,因为该会话将在启动周期的更晚时间建立。
可以将Cassandra会话懒惰地注入到实现SmartLifecyle的bean中的以下自定义CassandraTemplate中:
package mvctest.cassandra;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.SmartLifecycle;
import org.springframework.core.Ordered;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.stereotype.Component;
@Component("cassandraTemplate")
public class EurekaCassandraTemplateFactoryBean implements SmartLifecycle, FactoryBean<CassandraTemplate>, Ordered {
....
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void start() {
LOGGER.info("About to start Discovery client lookup of Cassandra Cluster!!!");
final Cluster cluster = this.eurekaClusterBuilder.build();
Session session = cluster.connect(this.cassandraProperties.getKeyspace());
this.cassandraTemplateWrapper.setSession(session);
LOGGER.info("Completed Discovery client lookup of Cassandra Cluster!!!");
running = true;
}
@Override
public boolean isRunning() {
return this.running;
}
@Override
public int getPhase() {
return Integer.MAX_VALUE;
}
@Override
public int getOrder() {
return 1;
}
}
这样,Cassandra会话可以在周期的后期创建。 有点粗糙,但是这种方法可行。
- 如果您有兴趣进一步探索此示例,请在以下位置获得此代码
我的github仓库在这里 。
翻译自: https://www.javacodegeeks.com/2015/09/spring-cloud-sidecar-initialization-of-nodes.html