【发布时间】:2018-02-13 16:30:56
【问题描述】:
我使用 docker 和微服务。假设我们有 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;
}
线索库只是react 的包装器。所以我得到的错误是:
DNS query for hotel.api.loc timed out 和最后一个错误An error occurred in the underlying stream。
所以我有一个问题:我做错了什么?为什么我可以通过 curl 访问 nginx 容器,但无法通过 reactPHP 访问?就算点dns!
但是,如果我使用带有端口的裸 ip,我可以访问它。我不是 dns 专业人士,只是基础知识。
更新
我使用 Linux Debian(在容器中)。在 Mac 上工作。
关于逻辑:当请求 URI 是 gateway.api.loc/api/hotel/list 在网关内部时,我们将请求发送到 hotel.api.loc 到相同的 URL(/api/hotel/list),接受响应并返回它。
我再说一遍,我可以通过 cURL 访问域,但无法使用 reactPHP 访问,并且不明白为什么...
【问题讨论】:
-
您使用的是什么操作系统?请在您的问题中更新
-
我找到了不使用任何 dns 的解决方案,直接请求即可。我请求带有标题
'Host' => 'user.api.loc'的http://172.14.10.10/api/doc并且它有效。但如果你告诉我为什么我不能在gateway内直接请求user.api.loc/api/doc,我将非常感谢 -
太好了,谢谢分享
标签: php docker nginx dns reactphp