在 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
我调试了它,但没有得到更详细的消息。
我试过了:
- 休息调用 http://localhost:8082
- 打电话休息的不同方式
服务控制器
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。
我想我遇到了一个简单的问题,但尚未在网上找到解决方案。我有 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
我调试了它,但没有得到更详细的消息。
我试过了:
- 休息调用 http://localhost:8082
- 打电话休息的不同方式
服务控制器
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。