1

我有一个单体应用程序 A,它需要通过服务发现调用微服务 B。Consul 是使用的服务发现服务器。微服务 B 在 Consul 服务器上注册。

从 A 我可以通过给出调用 Bhttp://hostname:portname/endpoint

如何通过服务发现做到这一点。

我尝试spring-cloud-dependencies 在 Monolith Application A 中添加依赖项,以便我可以使用它org.springframework.cloud.client.discovery.DiscoveryClient 来进行服务发现,但是这个 spring 依赖项引入了与我的 jboss 冲突的嵌入式 tomcat jar,因为两者都在8080. 仅仅为了服务发现而将单体 A 转换为 springboot 应用程序不是一种选择。

是否有非 spring 选项可以从整体应用程序到 Consul 服务器进行服务发现?

4

2 回答 2

0

我设法从单体应用程序中查找领事服务器。在 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 服务正在运行的端口,以及在 consul 上注册的端口

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;
    }
于 2017-11-27T14:28:30.757 回答
0

您可以使用 Consul 感知负载均衡器,例如https://traefik.io/https://github.com/fabiolb/fabio或客户端负载均衡解决方案,例如https://linkerd.io/

于 2017-12-16T21:51:37.100 回答