открытие службы консула из приложения-монолита

У меня есть монолитное приложение A, которому необходимо вызвать микросервис B через обнаружение службы. Consul - это используемый сервер обнаружения служб. Микросервис B зарегистрирован на сервере Consul.

Из A я могу вызвать B, указав http://hostname:portname/endpoint

Как это сделать через обнаружение сервисов.

Я попытался добавить зависимость spring-cloud-dependencies в приложение Monolith Application A, чтобы я мог использовать org.springframework.cloud.client.discovery.DiscoveryClient для обнаружения службы, но эта весенняя зависимость приносит встроенную банку tomcat, которая конфликтует с моим jboss, поскольку оба работают на порте по умолчанию 8080. преобразование монолита A в приложение Springboot только для обнаружения сервисов не вариант.

Есть ли вариант без пружины для обнаружения служб из монолитного приложения на сервер Consul?


person Mohammed Rafeeq    schedule 24.11.2017    source источник
comment
Это именно то, что я ищу. Представьте, что на SparkJava уже написано 50 микросервисов, и я хочу интегрировать их с Consul для обнаружения сервисов, но есть ли какое-нибудь решение для этого?   -  person fuat    schedule 26.10.2020


Ответы (2)


Мне удалось найти сервер консула из монолитного приложения. Добавьте зависимость в свой pom.xml

    <!-- https://mvnrepository.com/artifact/com.orbitz.consul/consul-client -->
<dependency>
    <groupId>com.orbitz.consul</groupId>
    <artifactId>consul-client</artifactId>
    <version>0.17.0</version>
</dependency>

Приведенный ниже метод вернет имя хоста, порт, например http://hostname:port, на котором запущены службы и зарегистрированный на консуле.

public String serviceUrl(String serviceName) {
        String consulRegistryHost = System.getProperty("consul.registry.url");
        Consul consul = Consul.builder().withUrl(consulRegistryHost).build(); // connect to Consul on localhost by default , otherwise
        HealthClient healthClient = consul.healthClient();

        List<ServiceHealth> nodes = healthClient.getAllServiceInstances(serviceName).getResponse(); // discover only "passing" nodes
        if (nodes != null && nodes.size() > 0 ) {
            ServiceHealth node = nodes.get(0);
            return "http://"+node.getService().getAddress()+":"+node.getService().getPort();
        }
        return null;
    }
person Mohammed Rafeeq    schedule 27.11.2017
comment
это балансировка нагрузки на стороне клиента, вам придется постоянно отслеживать состояние экземпляров, придумывать алгоритм балансировки нагрузки (циклический перебор, ...) и обрабатывать ошибки. вы спрашивали о внешнем способе сделать это, пожалуйста, примите мой ответ - person Gal Ben-Haim; 04.03.2018

Вы можете использовать балансировщик нагрузки с поддержкой Consul, например https://traefik.io/ или https://github.com/fabiolb/fabio или решение для балансировки нагрузки на стороне клиента, такое как https://linkerd.io/

person Gal Ben-Haim    schedule 16.12.2017