Статьи

Spring Cloud Sidecar — Инициализация узлов

В последнем сообщении в блоге я описал, как приложение 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;
    }
}

Таким образом, сеанс Кассандры может быть создан очень поздно в цикле. Несколько грубовато, но подход работает.

Ссылка: Spring Cloud Sidecar — Инициализация узлов от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.