春季领事服务都很健康,但在不同的主机上无法相互联系

问题描述 投票:0回答: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)下注册的。

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

spring docker amazon-ec2 consul spring-cloud-consul
1个回答
0
投票

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

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

  1. 如果您将端口暴露给docker主机(-p),请确保为每个服务实例注册了docker主机的ip(我不熟悉bootstrap.yml或spring cloud)
  2. 使用--net=host运行docker容器
  3. 以不同的方法在spring云的范围之外注册领事服务(API调用领事代理,服务定义文件,https://github.com/gliderlabs/registrator,......)
© www.soinside.com 2019 - 2024. All rights reserved.