在 Docker Compose 中使用 REST 调用访问其他服务

Accessing other service using an REST Call inside Docker Compose

我想我遇到了一个简单的问题,但尚未在网上找到解决方案。我有 1 个项目,其中包含多个 解决方案 。我已将它们全部放入 docker 组合文件。每个服务都有自己的端口:http://localhost:8081、http://localhost:8082等等...

我在端口 http://localhost:8081 上有服务 A,在端口 http://localhost:8082 上有服务 B。

我尝试使用 HttpClient 从 服务 A 调用 服务 B 中的端点。进行 Rest 调用的默认方式。我调用 http://localhost:8081/ServiceA/testcall.

我尝试调用外部 API : https://jsonplaceholder.typicode.com/posts 并且有效。但是当我尝试调用我自己的端点时,出现以下错误:

内部服务器错误 500

我调试了它,但没有得到更详细的消息。

我试过了:

  1. 休息调用 http://localhost:8082
  2. 打电话休息的不同方式

服务控制器

namespace A_service.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class ServiceAController : ControllerBase
    {
        private readonly IServiceARepository _serviceARepository;

        public ServiceAController(IServiceARepository serviceARepository)
        {
            _serviceARepository= serviceARepository;
        }
        [HttpGet]
        public async Task<IActionResult> JustASimpleGetCall()
        {
            // This call works fine
            return("Hello World");
        }
        [HttpGet("testcall")]
        public async Task<IActionResult> GetSomethingFromOtherService()
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://service-b:8080/");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            // HTTP GET
            HttpResponseMessage response = await client.GetAsync("ServiceB/simplefunction");

            if (response.IsSuccessStatusCode)
            {
                string responseBody = await response.Content.ReadAsStringAsync();
            }
            return Ok("Succesful");
            
        }

服务 B 控制器

namespace B_service.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class ServiceBController : ControllerBase
    {
        private readonly IServiceBRepository _serviceBRepository;

        public ServiceBController(IServiceBRepository serviceBRepository)
        {
            _serviceBRepository= serviceBRepository;
        }

        [HttpGet("simplefunction")]
        public IActionResult ServiceBFunction()
        {
            // To simplify, we just return a
            // Declaration of the array
            string[] str1;

            // Initialization of array
            str1 = new string[5]{ “Element 1”, “Element 2”, “Element 3”, “Element 4”, “Element 5” };
            return Ok(str1);
        }
version: '3.0'

services:
  serviceA:
    build:
      context: .
      dockerfile: serviceA/Dockerfile
    ports:
      - "8081:80"
  serviceB:
    build:
        context: .
        dockerfile: serviceB/Dockerfile
    environment: 
        - SERVER_URL=http://service-b:8080
    ports:
    - "8082:80"

如果你想从 serviceA 到达 serviceB,url 是 http://serviceB:(application port) 似乎你的应用程序在端口 80 上运行(至少那是写在 docker-compose.yml)。如果你可以像 localhost:8082 这样从你的计算机访问 serviceB,这意味着端口配置为 80。 如果应用程序中的端口配置为 8080,这意味着您需要写入的端口是 8080。