我有两个Java Spring Boot应用程序: 在端口8080上:

@SpringBootApplication
@RestController
public class LogonPageApplication {
    private static final String PROCESS_STRING_URL = "http://localhost:8081/processString";

    public static void main(String[] args) {
        SpringApplication.run(LogonPageApplication.class, args);
    }

    @GetMapping("/send")
    public String test() {

        String responseBody = "";
        try {
            RestTemplate restTemplate = new RestTemplate();

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);

            String requestBody = "{testttgfvrdf}";
            HttpEntity<String> httpEntity = new HttpEntity<>(requestBody, headers);

            ResponseEntity<String> response = restTemplate.exchange(PROCESS_STRING_URL, HttpMethod.POST, httpEntity, String.class);

            responseBody = response.getBody();
        } catch (Exception e) {
            return e.getMessage();
        }

        return "Main Page\n" + "Response from /processString: " + responseBody;
    }

}


在端口8081上:

@SpringBootApplication
@RestController
public class AcceptMessageApplication {

    public static void main(String[] args) {
        SpringApplication.run(AcceptMessageApplication.class, args);
    }

    @PostMapping("/processString")
    public String processString(@RequestBody String inputString) {
        return "Processed string: " + inputString;
    }

}

我有两个Docker文件:

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/AcceptMessage-0.0.1-SNAPSHOT.jar /app/AcceptMessage-0.0.1-SNAPSHOT.jar
EXPOSE 8080
CMD ["java", "-jar", "AcceptMessage-0.0.1-SNAPSHOT.jar"]

唯一不同的是文件名

和一个由docker组成的文件:

version: '3'
services:
  appacc:
    build:
      context: AcceptMessage
      dockerfile: Dockerfile
    ports:
      - "8081:8080"
    networks:
      - my-network
  applog:
    build:
      context: LogonPage
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    networks:
      - my-network
networks:
  my-network:

# docker-compose build
# docker-compose up

当我从控制台运行这个应用程序时,它可以正常工作,当我通过postman 发送请求时,端点也可以工作,但是我无法让他们交换消息,因为每当我进入http://localhost:8080/send时,它都会停靠,从而导致:

I/O error on POST request for "http://localhost:8081/processString": Connection refused.

推荐答案

您需要了解将本地计算机的端口8081映射到容器的端口8080的8081:8080种方法.然后从其他容器try 访问localhost:8081,这意味着它正在try 访问第二个容器的网络,而不是您的本地/主机计算机的网络.容器不能通过本地主机访问您计算机的网络.

有两种方法可以做到这一点

  1. Not the best way:使用host.docker.internal:8081表示使用主机网络.
  2. The best approach因为两个容器已经在同一个网络上,所以使用另一个容器的名称和容器的端口,所以在您的例子中是appacc:8080,所以现在您不需要8081,因为您直接调用容器,所以这就是8080的原因

Java相关问答推荐

在applitcation.properties中找到的字符串中输入变量

使用SaxonJ HE在收件箱中摆脱regex

编译期间错误(Java 0000)Android .Net MAUI

Android视图覆盖不阻止点击它后面的控件

AlarmManager没有在正确的时间发送alert

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

Hibernate EmptyInterceptor可以工作,但不能拦截器

如何调整工作时间日历中的时间

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

无法在Java中处理PayPal支付响应

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

WebSockets和Spring Boot安全性出现错误401

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

有谁能帮我修一下这个吗?使输出变得更加整洁

Android Studio模拟器没有互联网

视图被推出线性布局-Android

活泼的一次判断成语,结果中等

设置背景时缺少Android编辑文本下划线