选择动态端点时 Guzzle 不使用基本 uri(在本地工作但不在 K8S 上工作)
Guzzle not using base uri when a dynamic endpoint is selected (Works locally but not on K8S)
我正在为 运行 我的公司构建一个 API 网关和一堆微服务。我选择使用 PHP,因为这是我最有经验的。
本地设置:Opensuse Tumbleweed、PHPStorm、php7.3、SQLite、docker
远程设置:GKE、PHP7.3 Percona Xtra DB 和 Docker
我正在使用 Laravels Lumen Framework 5.8。
我的网关通过 Guzzle6 Http Client 与微服务通信,并且在本地运行良好。当使用 Gitlab 将其推送到集群时,使用 运行 一个 ci/cd 管道将其编译为 docker 图像并将其部署到 Google Cloud 上的 Kubernetes。
我试过在“”和''之间切换,
我重写了整个代码,
我查看了 Guzzle 文档,
我在 docker
中阅读了许多类似行为的堆栈溢出问题
路线
$router->get('/customers','CustomerController@getAll');
$router->post('/customers','CustomerController@createCustomer');
$router->get('/customers/{customer}','CustomerController@getCustomer');
$router->put('/customers/{customer}','CustomerController@updateCustomer');
$router->patch('/customers/{customer}','CustomerController@updateCustomer');
$router->delete('/customers/{customer}','CustomerController@deleteCustomer');
控制器
public function updateCustomer(Request $request, $customer)
{
return $this->successResponse($this->customerService->updateCustomer($request->all(), $customer));
}
public function deleteCustomer($customer)
{
return $this->successResponse($this->customerService->deleteCustomer($customer));
}
服务
public function createCustomer($data)
{
return $this->performRequest('POST','', $data);
}
public function getCustomer($customer)
{
return $this->performRequest('GET', "/{$customer}");
}
public function updateCustomer($data, $customer)
{
return $this->performRequest('PUT', "{$customer}", $data);
}
public function deleteCustomer($customer)
{
return $this->performRequest('DELETE', "{$customer}");
}
执行请求
public function performRequest($method, $requestUrl, $formParams = [], $headers = [])
{
$client = new Client([
'base_uri' => $this->baseUri,
]);
$response = $client->request($method, $requestUrl, ['form_params' => $formParams, 'headers' => $headers]);
return $response->getBody()->getContents();
}
本地端点:
- 获取 /contacts 有效!
- POST /contacts 有效!
- GET /contacts/(联系人 UUID 标识符)有效!
- PUT/PATCH /contacts/(联系人 UUID 标识符)有效!
- 删除 /contacts/(联系人 UUID 标识符)有效!
端点生产:
- 获取 /contacts 有效!
- POST /contacts 有效!
- GET /contacts/(联系人 UUID 标识符)失败!
- PUT/PATCH /contacts/(联系人 UUID 标识符)失败!
- 删除 /contacts/(联系人 UUID 标识符)失败!
Sentry Bug Tracker 显示 GuzzleHttp\Exception\RequestException
cURL 错误 3:(参见 http://curl.haxx.se/libcurl/c/libcurl-errors.html)
在哨兵上查看 URL 时,基本 URI 在失败的端点上被忽略,但这不会发生在我的本地机器上。
url 不包含协议 (http
) 添加此协议将修复格式错误的 url 错误。
决赛url:
http://customer-microservice.customer-microservice.svc.cluster.local
我正在为 运行 我的公司构建一个 API 网关和一堆微服务。我选择使用 PHP,因为这是我最有经验的。
本地设置:Opensuse Tumbleweed、PHPStorm、php7.3、SQLite、docker 远程设置:GKE、PHP7.3 Percona Xtra DB 和 Docker
我正在使用 Laravels Lumen Framework 5.8。
我的网关通过 Guzzle6 Http Client 与微服务通信,并且在本地运行良好。当使用 Gitlab 将其推送到集群时,使用 运行 一个 ci/cd 管道将其编译为 docker 图像并将其部署到 Google Cloud 上的 Kubernetes。
我试过在“”和''之间切换, 我重写了整个代码, 我查看了 Guzzle 文档, 我在 docker
中阅读了许多类似行为的堆栈溢出问题路线
$router->get('/customers','CustomerController@getAll');
$router->post('/customers','CustomerController@createCustomer');
$router->get('/customers/{customer}','CustomerController@getCustomer');
$router->put('/customers/{customer}','CustomerController@updateCustomer');
$router->patch('/customers/{customer}','CustomerController@updateCustomer');
$router->delete('/customers/{customer}','CustomerController@deleteCustomer');
控制器
public function updateCustomer(Request $request, $customer)
{
return $this->successResponse($this->customerService->updateCustomer($request->all(), $customer));
}
public function deleteCustomer($customer)
{
return $this->successResponse($this->customerService->deleteCustomer($customer));
}
服务
public function createCustomer($data)
{
return $this->performRequest('POST','', $data);
}
public function getCustomer($customer)
{
return $this->performRequest('GET', "/{$customer}");
}
public function updateCustomer($data, $customer)
{
return $this->performRequest('PUT', "{$customer}", $data);
}
public function deleteCustomer($customer)
{
return $this->performRequest('DELETE', "{$customer}");
}
执行请求
public function performRequest($method, $requestUrl, $formParams = [], $headers = [])
{
$client = new Client([
'base_uri' => $this->baseUri,
]);
$response = $client->request($method, $requestUrl, ['form_params' => $formParams, 'headers' => $headers]);
return $response->getBody()->getContents();
}
本地端点: - 获取 /contacts 有效! - POST /contacts 有效! - GET /contacts/(联系人 UUID 标识符)有效! - PUT/PATCH /contacts/(联系人 UUID 标识符)有效! - 删除 /contacts/(联系人 UUID 标识符)有效!
端点生产: - 获取 /contacts 有效! - POST /contacts 有效! - GET /contacts/(联系人 UUID 标识符)失败! - PUT/PATCH /contacts/(联系人 UUID 标识符)失败! - 删除 /contacts/(联系人 UUID 标识符)失败!
Sentry Bug Tracker 显示 GuzzleHttp\Exception\RequestException cURL 错误 3:(参见 http://curl.haxx.se/libcurl/c/libcurl-errors.html)
在哨兵上查看 URL 时,基本 URI 在失败的端点上被忽略,但这不会发生在我的本地机器上。
url 不包含协议 (http
) 添加此协议将修复格式错误的 url 错误。
决赛url:
http://customer-microservice.customer-microservice.svc.cluster.local