【问题标题】:Connection refused with two microservices in Docker连接被 Docker 中的两个微服务拒绝
【发布时间】:2018-06-12 05:28:11
【问题描述】:

我有两个微服务,我希望一个消耗另一个,但我得到了这个错误:

Servlet.service() 用于 servlet [dispatcherServlet] 在上下文中的路径 [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.web.client.ResourceAccessException:I/O 错误 “http://localhost:8080/testMicroservicio”的 GET 请求:连接 拒绝(连接被拒绝);嵌套异常是 java.net.ConnectException:连接被拒绝(连接被拒绝)] 有根本原因

java.net.ConnectException:连接被拒绝(连接被拒绝)

但是,如果我在浏览器中执行 url,它可以完美运行,但是如果一个微服务想要访问另一个微服务,我就会出现这个错误。

有人知道为什么吗?

我正在使用:RestTemplate

我放了一些代码:

@RestController
public class MicroServiceController {


    private final AddressService service;

    private static final String URL_API_INFO = "http://localhost:8080/testMicroservicio";

    private RestTemplate restTemplate = new RestTemplate();

    private final static Logger log = Logger.getLogger("com.bernanetwork.web.controller.MicroServiceController");

    @Autowired
    public MicroServiceController(AddressService service) {
        this.service = service;
    }

    @RequestMapping(value = "/micro-service-test")
    public String consumidor() throws Exception {

        log.info("----------------------------------------------------------------------------------------");
        log.info("-------------------------Iniciando método consumidor------------------------------------");
        log.info("----------------------------------------------------------------------------------------");

        ResponseEntity <PruebasMicroservicio[]> response = restTemplate.getForObject(URL_API_INFO, PruebasMicroservicio[].class);

        Arrays.asList(response.getBody()).forEach(info -> log.info("---"+info));

        return "ok";
    }

这些微服务在 Docker 中运行

非常感谢。

【问题讨论】:

标签: java docker spring-boot microservices


【解决方案1】:

问题是您尝试使用localhost 从一项服务连接到另一项服务。这不起作用,因为每个容器都有自己的 IP,而 localhost 只会指向请求的调用者。

连接容器的标准 Docker 方式是将它们连接到 Docker 网络。

docker network create mynet
docker run --network mynet --name container-1 ...
docker run --network mynet --name container-2 ...

现在 container1 可以使用 http://container-2:8080 与 container2 通信。

【讨论】:

  • 非常感谢,这正是我想要的。在运行这个命令“docker network ls”之后,我看到 Docker 的网络是 172.17.0.1,如果我输入这个“172.17.0.1:8080/testMicroservicio”,效果很好。在生产环境中,创建新网络还是使用默认网络“172.17.0.1”更好?
  • 在生产中最好使用 docker swarm docs.docker.com/engine/swarm。它有自己的管理微服务的机制。容器连接会在 docker swarm 中自动建立。
  • 谢谢你,它工作正常,我错误地使用网络名称调用服务器 url,像这样mynet:8080/someservice,然后我意识到应用程序的名称是其中的一部分网址container-1:8080/someservice.
猜你喜欢
  • 2022-01-02
  • 2016-11-28
  • 2021-06-20
  • 2020-06-10
  • 1970-01-01
  • 2022-01-11
  • 2020-02-03
  • 2011-02-02
  • 2019-06-01
相关资源
最近更新 更多