Работаю с докером и микросервисами. Представьте, что у нас есть 3 сервиса:
user API
/
gateway API
\
hotel API
Запросы проходят через шлюз к сервисам. У меня есть контейнер с php
и nginx
, где объемы одинаковы. Далее привожу список конфигов:
server {
server_name gateway.api.loc;
root /var/www/der-ibe/ibe-gateway-api/web;
client_max_body_size 32m;
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(app|app_dev|config)\.php(/|$) {
...
}
}
server {
server_name hotel.api.loc;
root /var/www/der-ibe/ibe-hotel-api/web;
client_max_body_size 32m;
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(app|app_dev|config)\.php(/|$) {
...
}
}
...
docker-compose.yml
version: "3.1"
services:
tphp:
build: docker/php
restart: always
container_name: my_tphp
extra_hosts:
- gateway.api.loc:172.14.10.10
- user.api.loc:172.14.10.10
- hotel.api.loc:172.14.10.10
networks:
- test
volumes:
- ../user-api:/var/www/user-api
- ../hotel-api:/var/www/hotel-api
- ./:/var/www/gateway-api
tnginx:
build: docker/nginx
restart: always
container_name: my_tnginx
ports:
- 80:80
networks:
test:
ipv4_address: 172.14.10.10
volumes:
- ../user-api:/var/www/user-api
- ../hotel-api:/var/www/hotel-api
- ./:/var/www/gateway-api
networks:
ibe:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.14.10.0/24
Если я использую простой cURL, я могу связаться с API отеля и пользователя и получить от них ответ, но если я попытаюсь сделать это с помощью reactPHP - я не смогу! Мой мир кода:
public function asyncGetRequest(Route $route, $params, $token)
{
$url = $this->buildURL($route, $params);
$loop = React\EventLoop\Factory::create();
$dns = '172.14.10.10';
$sender = Clue\React\Buzz\Io\Sender::createFromLoopDns($loop, $dns);
//$url = 'http://172.14.10.10:3000/api/quota/list';
$client = new Clue\React\Buzz\Browser($loop, $sender);
//$client = new Clue\React\Buzz\Browser($loop);
$promise = $client->get($url,
[
'Authorization' => $token,
]
);
/** @var Response $response */
$response = new Response();
try {
$response = Clue\React\Block\await($promise, $loop);
} catch (ResponseException $e) {
$this->logger->error($e->getMessage());
}
dump($response->getBody()->getContents()); // I work on symfony 3.2
die;
}
Библиотека Clue — это просто оболочка для react
. Итак, ошибка, которую я получаю: DNS query for hotel.api.loc timed out
и последняя ошибка An error occurred in the underlying stream
.
Вот у меня вопрос: что я делаю не так? Почему у меня есть доступ к контейнеру nginx с помощью curl, но нет доступа с помощью reactPHP? Даже если указать DNS!
Но если я использую голый ip с портом, я могу до него добраться. Я не профи в днс, просто базовые знания.
ОБНОВЛЕНИЕ
Я использую Linux Debian (в контейнере). Работайте на Mac.
Немного о логике: когда URI запроса gateway.api.loc/api/hotel/list
внутри шлюза, мы отправляем запрос на hotel.api.loc
на тот же URL (/api/hotel/list
), принимаем ответ и возвращаем его.
Повторюсь, у меня есть доступ к доменам по cURL от, но не могу сделать это с помощью reactPHP и не понимаю почему...
http://172.14.10.10/api/doc
с заголовком'Host' => 'user.api.loc'
, и он работает. Но если вы скажете мне, почему я не могу запросить напрямуюuser.api.loc/api/doc
внутриgateway
, я буду очень благодарен - person Nikita_kharkov_ua   schedule 06.09.2017