ThinkPHP 8 分布式服务支持深度教程
ThinkPHP 8 提供全面的分布式架构支持,以下是关键组件实现指南:
一、数据库读写分离集群
1.1 主从配置
// config/database.php
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 启用分布式
'deploy' => 1,
// 读写分离
'rw_separate' => true,
// 主服务器集群(写操作)
'hostname' => [
'write' => [
'db_master1:3306',
'db_master2:3306' // 主备节点
]
],
// 从服务器集群(读操作)
'hostname' => [
'read' => [
'db_slave1:3306',
'db_slave2:3306',
'db_slave3:3306' // 读负载均衡
]
],
// 通用配置
'database' => 'order_db',
'username' => 'app_user',
'password' => 'S3cureP@ss',
'charset' => 'utf8mb4',
'break_reconnect' => true // 断线自动重连
]
]
];
1.2 负载均衡策略
// 自定义负载均衡器
class WeightedLoadBalancer
{
public function select(array $hosts)
{
// 按权重选择:db_slave1:3, db_slave2:2, db_slave3:1
$weightMap = [
'db_slave1:3306' => 3,
'db_slave2:3306' => 2,
'db_slave3:3306' => 1
];
$total = array_sum($weightMap);
$rand = mt_rand(1, $total);
foreach ($weightMap as $host => $weight) {
$rand -= $weight;
if ($rand <= 0) return $host;
}
}
}
// 注册到数据库配置
'load_balance' => [\app\common\WeightedLoadBalancer::class, 'select']
二、Redis分布式缓存与Session
2.1 Redis集群配置
// config/cache.php
'redis' => [
'type' => 'redis',
'host' => [
'redis1:6379',
'redis2:6379',
'redis3:6379'
],
'password' => 'RedisP@ss123',
'select' => 0,
'timeout' => 2, // 秒
'tag_prefix' => 'tp8:',
// 集群模式
'cluster' => true,
// 故障转移策略
'failover' => 'distribute', // 分布式重试
'retry_interval' => 200 // 重试间隔(ms)
],
2.2 分布式Session驱动
// config/session.php
return [
'type' => 'redis',
'prefix' => 'tp8_session:',
'auto_start' => true,
// Redis集群配置
'host' => 'redis1:6379,redis2:6379,redis3:6379',
'password' => 'SessionP@ss',
// 会话一致性保障
'read_master' => true, // 读主节点保证一致性
'expire' => 86400 // 24小时
];
三、消息队列分布式处理
3.1 RabbitMQ队列配置
// config/queue.php
return [
'default' => 'rabbitmq',
'connections' => [
'rabbitmq' => [
'type' => 'rabbitmq',
'host' => [
'mq_node1:5672',
'mq_node2:5672'
],
'vhost' => '/tp8',
'username' => 'mq_admin',
'password' => 'MqP@ss123',
'exchange' => 'tp8_exchange',
'timeout' => 60,
// 集群策略
'ha_policy' => 'all', // 镜像到所有节点
'heartbeat' => 30 // 心跳检测
]
]
];
3.2 分布式任务处理
// 生产者 (Controller)
use think\queue\Job;
Queue::push(\app\job\PaymentJob::class, [
'order_id' => $order->id,
'amount' => $order->amount
]);
// 消费者 (app/job/PaymentJob.php)
class PaymentJob
{
public function fire(Job $job, $data)
{
try {
// 分布式事务处理
Db::transaction(function () use ($data) {
PaymentService::process($data);
});
$job->delete();
} catch (\Exception $e) {
// 指数退避重试
if ($job->attempts() < 5) {
$job->release(2 ** $job->attempts());
} else {
$job->delete();
Log::error("支付处理失败: ".$e->getMessage());
}
}
}
}
四、微服务RPC通信
4.1 服务注册与发现
// 服务注册器
class ServiceRegistry
{
public static function getServiceNodes($serviceName)
{
// 从Consul获取节点信息
return Http::get('http://consul:8500/v1/catalog/service/'.$serviceName)
->json();
}
}
// 服务消费者
$inventoryNodes = ServiceRegistry::getServiceNodes('inventory-service');
$result = Http::post($inventoryNodes[0]['Address'], [
'action' => 'deduct',
'sku' => 'P1001',
'qty' => 10
]);
4.2 熔断器实现
class CircuitBreaker
{
private $service;
private $failureCount = 0;
private $lastAttempt = 0;
private $threshold = 5;
private $timeout = 30;
public function __construct($service) {
$this->service = $service;
}
public function call($method, $params) {
if ($this->isOpen()) {
throw new \Exception("服务熔断中");
}
try {
$result = call_user_func_array([$this->service, $method], $params);
$this->reset();
return $result;
} catch (\Exception $e) {
$this->recordFailure();
throw $e;
}
}
private function recordFailure() {
$this->failureCount++;
$this->lastAttempt = time();
}
private function isOpen() {
if ($this->failureCount >= $this->threshold &&
time() < $this->lastAttempt + $this->timeout) {
return true;
}
return false;
}
}
// 使用示例
$breaker = new CircuitBreaker(new InventoryService);
try {
$breaker->call('deductStock', [$sku, $qty]);
} catch (\Exception $e) {
// 降级处理
OrderService::holdStock($sku, $qty);
}
五、分布式文件存储
5.1 OSS多地域部署
// config/filesystem.php
'disks' => [
'oss_beijing' => [
'driver' => 'oss',
'access_id' => env('OSS_ACCESS_ID'),
'access_key' => env('OSS_ACCESS_KEY'),
'bucket' => 'company-bj',
'endpoint' => 'oss-cn-beijing.aliyuncs.com'
],
'oss_shanghai' => [
'driver' => 'oss',
'access_id' => env('OSS_ACCESS_ID'),
'access_key' => env('OSS_ACCESS_KEY'),
'bucket' => 'company-sh',
'endpoint' => 'oss-cn-shanghai.aliyuncs.com'
]
],
// 智能选择存储节点
Filesystem::disk(
request()->hasHeader('X-User-Region') &&
request()->header('X-User-Region') === 'SH' ?
'oss_shanghai' : 'oss_beijing'
);
六、分布式事务协调
6.1 Saga事务管理器
class OrderSaga
{
public function createOrder($data)
{
Saga::transaction()
->addCompensation([$this, 'cancelOrder']) // 补偿方法
// 步骤1: 锁定库存
->step(
InventoryService::class,
'lockStock',
[$data['items']]
)
// 步骤2: 创建支付单
->step(
PaymentService::class,
'createPayment',
[$data['payment']]
)
// 步骤3: 生成订单
->step(
OrderService::class,
'generateOrder',
[$data]
)
->execute();
}
public function cancelOrder($sagaData)
{
// 分布式回滚逻辑
PaymentService::cancelPayment($sagaData['payment_id']);
InventoryService::releaseStock($sagaData['items']);
OrderService::markCanceled($sagaData['order_id']);
}
}
七、分布式监控实践
7.1 Prometheus指标暴露
// 安装 prometheus_client_php
composer require promphp/prometheus_client_php
// 控制器
class MetricsController
{
public function index()
{
$registry = new CollectorRegistry(new InMemory());
// 请求计数器
$counter = $registry->getOrRegisterCounter(
'app',
'http_requests_total',
'Total HTTP requests',
['method', 'endpoint']
);
$counter->inc(['GET', '/metrics']);
// DB查询直方图
$histogram = $registry->getOrRegisterHistogram(
'db',
'query_duration_seconds',
'DB query duration',
['query'],
[0.1, 0.5, 1.0, 2.0]
);
$histogram->observe(0.25, ['SELECT * FROM users']);
return response($registry->render())
->header('Content-Type', 'text/plain');
}
}
架构验证清单
-
故障注入测试
# 模拟网络分区 iptables -A INPUT -p tcp --dport 3306 -j DROP # 观察系统反应 tail -f runtime/log/*.log
-
混沌工程验证项:
- 随机终止数据库节点
- 引入500ms网络延迟
- 强制Redis主节点切换
- 消息队列磁盘空间耗尽
-
基准性能测试:
# 使用ab进行压力测试 ab -c 100 -n 5000 http://your-api/endpoint # 监控指标 watch -n 1 "curl -s http://prometheus:9090/api/v1/query?query=app_http_requests_total"
ThinkPHP 8 的分布式支持通过解耦核心组件、提供集群化配置接口和故障恢复机制,使传统PHP应用具备现代分布式系统的弹性能力。建议在生产环境中逐步实施,从数据库读写分离开始,逐步扩展到全栈分布式架构。