news 2026/4/19 8:56:57

Hyperf方案 微服务迁移策略(单体到微服务)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hyperf方案 微服务迁移策略(单体到微服务)
单体迁移微服务核心策略:绞杀者模式(Strangler Fig),逐步替换而非重写。 ──---─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 迁移路线 单体应用 ↓ 第一步:API Gateway 分流 ↓ 第二步:抽离高价值/高负载模块 ↓ 第三步:数据库解耦 ↓ 第四步:事件驱动异步化 ↓ 完成:全微服务 所需库:composerrequire hyperf/json-rpc\hyperf/rpc-client\hyperf/service-governance-nacos\hyperf/async-queue\hyperf/kafka\hyperf/config-nacos ---1. API Gateway 分流(绞杀者入口)<?php namespace App\Middleware;use Hyperf\HttpServer\Contract\RequestInterface;use Psr\Http\Message\ResponseInterface;use Psr\Http\Server\MiddlewareInterface;use Psr\Http\Server\RequestHandlerInterface;use GuzzleHttp\Client;/** * 新模块路由到微服务,旧模块继续走单体 */ class StranglerMiddleware implements MiddlewareInterface{// 已迁移到微服务的路由前缀 private array$migrated=['/api/orders'=>'http://order-service','/api/payments'=>'http://payment-service','/api/users'=>'http://user-service',];publicfunction__construct(private Client$http){}publicfunctionprocess(ServerRequestInterface$request, RequestHandlerInterface$handler): ResponseInterface{$path=$request->getUri()->getPath();foreach($this->migrated as$prefix=>$target){if(str_starts_with($path,$prefix)){return$this->proxy($request,$target);}}// 未迁移模块继续走单体逻辑return$handler->handle($request);}privatefunctionproxy(ServerRequestInterface$request, string$target): ResponseInterface{$response=$this->http->request(method:$request->getMethod(), uri:$target.$request->getUri()->getPath(), options:['headers'=>$request->getHeaders(),'json'=>$request->getParsedBody(),'query'=>$request->getQueryParams(),]);return$this->response ->withStatus($response->getStatusCode())->withBody($response->getBody());}}---2. 双写过渡(数据同步) 迁移期间新旧系统同时写入,确保数据一致。<?php namespace App\Service;use Hyperf\AsyncQueue\Driver\DriverFactory;class OrderService{publicfunction__construct(private LegacyOrderRepository$legacy, // 单体 DB private DriverFactory$queue,){}publicfunctioncreate(int$userId, array$items): array{//1. 写入单体(主)$order=$this->legacy->create($userId,$items);//2. 异步同步到新服务(副)$this->queue->get('default')->push(new SyncOrderToMicroserviceJob($order->toArray()));return$order->toArray();}}同步 Job:<?php namespace App\Job;use Hyperf\AsyncQueue\Job;class SyncOrderToMicroserviceJob extends Job{publicfunction__construct(private array$order){}publicfunctionhandle(): void{// 写入新微服务 DB,幂等处理 Order::updateOrCreate(['legacy_id'=>$this->order['id']],$this->order);}}---3. 事件驱动解耦(Kafka) 用事件替代模块间直接调用,解耦单体内部依赖。<?php namespace App\Service;use Hyperf\Kafka\Producer;class OrderService{publicfunction__construct(private Producer$producer){}publicfunctioncreate(int$userId, array$items): array{$order=Order::create(['user_id'=>$userId,'total'=>collect($items)->sum('price')]);// 发布事件,下游服务自行消费(替代直接调用)$this->producer->send(topic:'order.created', value: json_encode($order->toArray()), key:(string)$order->id,);return$order->toArray();}}消费方(库存/通知服务):<?php namespace App\Consumer;use Hyperf\Kafka\AbstractConsumer;use Hyperf\Kafka\Annotation\Consumer;use longlang\phpkafka\Consumer\ConsumeMessage;#[Consumer(topic: 'order.created', groupId: 'inventory-service', autoCommit: false)]class OrderCreatedConsumer extends AbstractConsumer{publicfunctionconsume(ConsumeMessage$message): string{$order=json_decode($message->getValue(),true);// 扣减库存 Inventory::where('product_id',$order['product_id'])->decrement('stock',$order['qty']);returnself::ACK;}}---4. 数据库解耦(分库策略)<?php // config/autoload/databases.phpreturn[// 单体库(迁移期保留)'legacy'=>['driver'=>'mysql','host'=>env('LEGACY_DB_HOST'),'database'=>env('LEGACY_DB_NAME'),], // 新订单服务独立库'order'=>['driver'=>'mysql','host'=>env('ORDER_DB_HOST'),'database'=>'order_service',],];迁移期 Model 双读: class Order extends Model{// 切换此处完成数据库迁移 protected string$connection=env('ORDER_DB_DRIVER','legacy');}---5. 功能开关(灰度切流)<?php namespace App\Service;use Hyperf\ConfigNacos\NacosClient;class FeatureFlag{publicfunction__construct(private NacosClient$nacos){}publicfunctionisMigrated(string$module): bool{// Nacos 动态配置,无需重启切流return(bool)config("migration.{$module}",false);}}控制器中使用:#[PostMapping(path: 'orders')]publicfunctioncreate(): array{if($this->flag->isMigrated('order')){// 走新微服务return$this->orderRpcClient->create($this->request->input('user_id'),$this->request->input('items'),);}// 走单体逻辑return$this->legacyOrderService->create($this->request->input('user_id'),$this->request->input('items'),);}--- 迁移检查清单 阶段一:准备 ✓ 部署 API Gateway(StranglerMiddleware) ✓ 接入 Nacos 配置中心 ✓ 接入链路追踪(hyperf/tracer) 阶段二:抽离 ✓ 高负载模块优先(订单/支付) ✓ 双写过渡,验证数据一致性 ✓ 功能开关控制流量比例(1% →10% →100%) 阶段三:解耦 ✓ 模块间调用改为 Kafka 事件 ✓ 独立数据库,停止双写 ✓ 下线单体对应模块 --- 核心要点: - 绞杀者模式:网关层分流,新旧并行,逐步替换,不停服 - 双写 + 功能开关是迁移期最重要的安全网 - 事件驱动解耦比 RPC 更适合迁移期(降低服务间强依赖) - 数据库解耦是最后一步,也是最难的一步,用 legacy_id 字段做映射
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:56:13

MogFace-large镜像使用:webui.py支持批量上传与异步检测队列配置

MogFace-large镜像使用&#xff1a;webui.py支持批量上传与异步检测队列配置 1. 快速了解MogFace-large人脸检测模型 MogFace是当前最先进的人脸检测方法之一&#xff0c;在Wider Face数据集的六项评测榜单上长期保持领先地位。这个模型后来被CVPR 2022会议收录&#xff0c;在…

作者头像 李华
网站建设 2026/4/17 13:54:45

CCD与CMOS技术对比

图像传感器技术是数字成像领域的核心,决定了从智能手机到科学望远镜等各类设备的成像质量。在这一领域,CCD(电荷耦合器件)与CMOS(互补金属氧化物半导体)作为两大主流技术路线,经历了从技术代差到性能趋同,再到应用场景分化的演进过程。本文将从基本原理、关键性能参数、…

作者头像 李华
网站建设 2026/4/17 13:54:45

从抓包到洞察:Wireshark实战解析IPv4网络通信全貌

1. Wireshark与IPv4网络通信基础 第一次打开Wireshark时&#xff0c;面对密密麻麻的数据包列表&#xff0c;很多人都会感到无从下手。其实就像学习一门外语&#xff0c;只要掌握了基本的"单词"和"语法"&#xff0c;就能读懂整个"故事"。Wireshar…

作者头像 李华
网站建设 2026/4/17 13:52:02

如何通过d2s-editor实现暗黑破坏神2存档的全面自定义配置

如何通过d2s-editor实现暗黑破坏神2存档的全面自定义配置 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款专为《暗黑破坏神2》玩家设计的开源存档编辑器&#xff0c;支持原版及重制版(D2R)存档文件的深度编辑。…

作者头像 李华
网站建设 2026/4/17 13:50:24

Hive窗口聚合函数避坑指南:为什么你的SUM结果和想象的不一样?

Hive窗口聚合函数避坑指南&#xff1a;为什么你的SUM结果和想象的不一样&#xff1f; 当你第一次在Hive中使用窗口聚合函数时&#xff0c;可能会觉得它们看起来很简单——毕竟语法看起来直白明了。但当你真正开始在实际项目中使用SUM、AVG等窗口函数时&#xff0c;往往会发现结…

作者头像 李华
网站建设 2026/4/17 13:48:20

3D-TransUNet快速部署实战指南:攻克医学图像分割难题

3D-TransUNet快速部署实战指南&#xff1a;攻克医学图像分割难题 【免费下载链接】3D-TransUNet This is the official repository for the paper "3D TransUNet: Advancing Medical Image Segmentation through Vision Transformers" 项目地址: https://gitcode.c…

作者头像 李华