В последнем сообщении в блоге я описал, как приложение Sidecar можно использовать для регистрации узлов Cassandra в Eureka, а в более общем случае — для регистрации любого приложения, не являющегося JVM, в Eureka.
В этой статье я расскажу, как приложение может запрашивать зарегистрированные узлы Sidecar.
Обнаружение зарегистрированных узлов — постинициализация
Если зарегистрированные узлы не требуются во время фазы инициализации компонента, обнаружение узлов довольно просто по этим направлениям:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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()); } } } |
Они будут распечатывать узлы, зарегистрированные с именем VIP «samplecasssandra.vip».
Обратите внимание, что узлы печатаются из метода run, который вызывается после инициализации контейнера Spring. Однако если попытаться перечислить узлы на одном из этапов жизненного цикла, скажем, методом postConstruct, то, скорее всего, будет сгенерировано исключение (такое поведение наблюдается в выпуске Spring Cloud «Angel.SR3», но, похоже, работает корректно с « Brixton. * ”Версии)
Обнаружение зарегистрированных узлов — во время инициализации
Теперь, если приложению необходимо обнаружить узлы во время инициализации, процесс немного усложняется, для потенциальной проблемы посмотрите на этот тикет .
DiscoveryClient инициализируется очень поздно в жизненном цикле Spring, и если DiscoveryClient используется в какой-либо операции постобработки компонента, он, вероятно, выдаст исключение.
Например, скажем, что узлы Cassandra, зарегистрированные с использованием Sidecar, теперь используются приложением для инициализации подключения Cassandra, способ сделать это — создать оболочку для подключения Cassandra следующим образом:
01
02
03
04
05
06
07
08
09
10
|
import org.springframework.data.cassandra.core.CassandraTemplate; public class CassandraTemplateWrapper extends CassandraTemplate { @Override public void afterPropertiesSet() { } } |
Здесь CassandraTemplate переопределяется, чтобы предотвратить возвращение в методе afterPropertiesSet того, что сеанс Cassandra существует, так как сеанс будет установлен намного позже в цикле запуска.
Сеанс Cassandra может быть вставлен в этот пользовательский CassandraTemplate лениво в bean-компоненте, который реализует SmartLifecyle по следующим направлениям:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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 ; } } |
Таким образом, сеанс Кассандры может быть создан очень поздно в цикле. Несколько грубовато, но подход работает.
- Если вы заинтересованы в дальнейшем изучении этого образца, у меня есть этот код в
мой репозиторий Github здесь .
Ссылка: | Spring Cloud Sidecar — Инициализация узлов от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry. |