1

运行 Consul 和 spring-cloud-consul 我有五个微服务都已注册并显示为健康。这些服务中的每一个都在不同的 EC2 实例上运行。

使用在领事中注册的微服务的名称,我无法使用RestTemplate

如果服务 A 要使用以下代码调用服务 B

private final static String SERVICE = "http://instance-service";

@LoadBalanced
@Autowired
private RestTemplate restTemplate;

@GetMapping("/instances")
public ResponseEntity<String> instances() {
    ParameterizedTypeReference<String> reference = new ParameterizedTypeReference<String>() {
    };

    return restTemplate.exchange(SERVICE, HttpMethod.GET, null, reference);
}

服务 A 抛出

2017-12-19 17:30:36.000 ERROR 1 --- [nio-8443-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://instance-service": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)] with root cause

即使将调试设置为,TRACE我也看不到服务 B 上没有任何内容。

但是,如果我采用相同的设置并在单个 EC2 实例上运行它,一切都会按预期工作。

所有服务都在 docker 中运行,但 consul 代理运行在每个 EC2 实例的主机上。

每个微服务都有以下bootstrap.yml集合

spring:
  cloud:
    consul:
      config:
        enabled: true
      discovery:
        instance-id: ${spring.application.name}
        prefer-ip-address: true

如果我给RestTemplate它返回一个随机端点,Unknown host以便它知道微服务在那里,它只是在它到达代码库之前被阻塞在某个地方。

如何进一步调试以找出服务在不同主机上运行时被拒绝的真正原因?

我尝试打开安全配置上的所有端口只是为了排除这种情况,但这没有任何区别。

编辑:查看 Consul UI - 我看到我的服务是在私有 IP (172.18.0.2) 下注册的。

这应该是一个面向公众的地址吗?

4

1 回答 1

0

172.18.0.2 是 docker 桥接网络中的一个 ip,您肯定希望使用服务发现的客户端可以访问在 consul 中注册的 ip 地址。

我不知道您的网络设置或需求,但您可以(有些想法,有很多)-

  1. 如果将端口暴露给 docker 主机(-p),请确保为每个服务实例注册了 docker 主机的 ip(我不熟悉 bootstrap.yml 或 spring cloud)
  2. 使用 - 运行 docker 容器-net=host
  3. 在 consul 中以不同的方法和 Spring Cloud 范围之外注册服务(对 consul 代理的 API 调用、服务定义文件、https://github.com/gliderlabs/registrator,...)
于 2017-12-22T19:14:00.513 回答