ThinkPHP6实现高性能API网关开发实战:微服务架构核心组件
一、API网关核心功能设计
本案例实现以下核心功能:
- 动态路由转发:根据请求路径自动路由到不同微服务
- 请求聚合:单个API调用合并多个微服务请求
- 熔断降级:服务不可用时自动降级处理
- 限流控制:基于Redis的令牌桶限流算法
- 统一认证:JWT身份验证与权限控制
二、基础架构搭建
1. 项目初始化
composer create-project topthink/think tp6-gateway
cd tp6-gateway
composer require firebase/php-jwt
2. 目录结构设计
app/
├── controller/
│ └── Gateway.php # 网关入口控制器
├── middleware/
│ ├── Auth.php # 认证中间件
│ ├── RateLimit.php # 限流中间件
│ └── CircuitBreaker.php # 熔断中间件
├── service/
│ ├── Router.php # 动态路由服务
│ ├── Aggregator.php # 请求聚合服务
│ └── HttpClient.php # HTTP客户端服务
config/
├── gateway.php # 网关路由配置
└── services.php # 微服务配置
三、核心服务实现
1. 动态路由服务
app/service/Router.php:
<?php
namespace appservice;
use thinkfacadeConfig;
class Router
{
public static function dispatch($path)
{
$services = Config::get('services');
$segments = explode('/', trim($path, '/'));
foreach ($services as $prefix => $config) {
if (strpos($path, "/$prefix/") === 0) {
return [
'service' => $prefix,
'target' => $config['base_uri'] .
substr($path, strlen($prefix) + 1)
];
}
}
throw new Exception('Service not found');
}
}
2. 请求聚合服务
app/service/Aggregator.php:
<?php
namespace appservice;
use thinkfacadeCache;
class Aggregator
{
public static function aggregate(array $requests)
{
$client = new HttpClient();
$results = [];
foreach ($requests as $key => $request) {
$cacheKey = 'agg:'.md5(json_encode($request));
if ($data = Cache::get($cacheKey)) {
$results[$key] = $data;
continue;
}
$response = $client->request(
$request['method'],
$request['url'],
$request['data'] ?? []
);
Cache::set($cacheKey, $response, 60);
$results[$key] = $response;
}
return $results;
}
}
四、关键中间件实现
1. 熔断中间件
app/middleware/CircuitBreaker.php:
<?php
namespace appmiddleware;
use thinkfacadeCache;
class CircuitBreaker
{
public function handle($request, Closure $next, $service)
{
$key = "circuit_breaker:$service";
$state = Cache::get($key, 'closed');
if ($state === 'open') {
return $this->fallback($request, $service);
}
try {
$response = $next($request);
// 重置失败计数
Cache::set("$key:failure_count", 0);
return $response;
} catch (Exception $e) {
return $this->handleFailure($key, $request, $service);
}
}
private function handleFailure($key, $request, $service)
{
$count = Cache::inc("$key:failure_count");
if ($count >= 3) {
Cache::set($key, 'open', 300); // 5分钟熔断
Cache::set("$key:open_time", time());
}
return $this->fallback($request, $service);
}
private function fallback($request, $service)
{
// 返回预定义的降级响应
return json([
'code' => 503,
'msg' => "服务暂时不可用",
'data' => Config::get("fallback.$service", [])
]);
}
}
五、网关入口控制器
app/controller/Gateway.php:
<?php
namespace appcontroller;
use thinkRequest;
use appserviceRouter;
use appserviceHttpClient;
class Gateway
{
public function index(Request $request)
{
try {
$route = Router::dispatch($request->pathinfo());
$client = new HttpClient();
$response = $client->request(
$request->method(),
$route['target'],
$request->param()
);
return json($response);
} catch (Exception $e) {
return json([
'code' => 404,
'msg' => $e->getMessage()
], 404);
}
}
public function aggregate(Request $request)
{
$requests = $request->param('requests');
$results = Aggregator::aggregate($requests);
return json([
'code' => 200,
'data' => $results
]);
}
}
六、性能优化方案
- 连接池优化:使用Swoole协程HTTP客户端
- 缓存策略:高频接口数据缓存
- 异步日志:非阻塞方式记录访问日志
- OPcache加速:PHP脚本预编译
- 负载均衡:多节点网关部署