基于Swoole+Hyperf的微服务架构实战
课程总体设计
课程名称:基于 Swoole+Hyperf 的微服务架构实战(三个月进阶)
前置要求:PHP 基础扎实、熟悉 Composer、了解基本网络协议
学习时长:12 周,每周 5 天学习(建议每天 4-6 小时实战)
核心目标:从协程原理到微服务治理,完成 3 个综合实践项目,具备高并发微服务系统设计与落地能力

第一阶段:基石——协程与框架核心(第 1-2 周)
第 1 周:Swoole 网络编程与协程入门
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | Docker 环境搭建;安装 Swoole 5.x;编写纯 TCP 服务器;理解事件循环(Reactor 模型) | 实现一个 TCP ECHO 服务,用 telnet 交互 | 端口连通性测试,并发 telnet 连接 |
| 周二 | HTTP 服务器创建、Request/Response 处理;静态资源托管;go() 协程创建,协程调度初探 | 创建 HTTP 服务,返回 JSON;在请求内启动协程写日志 | 通过 ab 工具并发请求,观察协程并发执行 |
| 周三 | 协程容器、Channel 通信、WaitGroup、协程上下文(Context);defer 机制 | 用 Channel 实现生产者-消费者;使用 Context 传递请求 ID | 编写单元测试,验证并发下数据一致性 |
| 周四 | Hyperf 框架安装(Composer 建项);骨架目录解读;生命周期(Request→Middleware→Controller) | 搭建 Hyperf 项目,运行 php bin/hyperf.php start | 浏览器访问默认路由,确认启动正常 |
| 周五 | 依赖注入(DI)与简单路由;控制器、路由注解;Hyperf 数据库连接(hyperf/database) | 编写第一个 CRUD 接口(User 表),数据来自 MySQL | Postman 测试接口,检查数据库读写 |
周测试:
使用 wrk 对 Swoole HTTP 服务器进行 1000 并发压测,输出 QPS 与错误率报告。编写一个 Hyperf 接口,通过依赖注入获取 Redis 并实现缓存读取。
第 2 周:Hyperf 注解、AOP、中间件与单服务实战
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | 注解原理、自定义注解;AOP 切面编程,Around、Before、After 切面 | 实现方法耗时统计注解,应用于控制器方法 | 访问接口时日志打印执行时间,验证 AOP 生效 |
| 周二 | 中间件(全局、路由级、注解级);跨域处理、参数加密解密中间件 | 编写 Token 校验中间件,保护 /api/* 路由 | 无 Token 请求返回 401,正确 Token 通过 |
| 周三 | 请求验证器(hyperf/validation)、异常处理器(App\Exception\Handler) | 为注册接口添加参数校验,统一异常 JSON 返回 | 提交不合规数据,检验返回格式是否统一 |
| 周四 | Redis 缓存(连接池)、Model 缓存;事件机制(Psr\EventDispatcher) | 用户登录后将信息缓存,监听登录事件记录日志 | 通过 Redis 监控命令查看缓存,事件日志文件确认 |
| 周五 | 单服务实战:搭建 RESTful 文章系统(含分类、标签),集成缓存、校验、分页 | 完成一套文章 CRUD API,接口遵循 RESTful 规范 | 使用 Postman 跑全部接口,代码评审路由设计 |
周测试:
基于文章系统,增加 @Cacheable 注解(自定义)实现文章详情缓存,并用 Redis 检查命中率。完成一套 PHPUnit 协程测试用例,覆盖文章创建和缓存逻辑。
第二阶段:微服务通信与治理(第 3-6 周)
第 3 周:RPC 与服务拆分
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | 微服务拆分原则(DDD 入门)、接口边界定义、Proto/Json 契约 | 将前面文章系统拆分为用户服务、文章服务,规划接口 | 提交服务拆分文档及 Protobuf/Json 契约文件 |
| 周二 | Hyperf JSON-RPC 服务端搭建(hyperf/json-rpc),发布服务到注册中心 | 创建用户服务,暴露 getUserById 方法 | 通过 RPC 客户端调用验证返回值 |
| 周三 | RPC 客户端自动生成、@RpcClient 注解使用;自定义负载均衡策略 | 文章服务调用用户服务,获取作者信息 | 记录每次 RPC 调用节点,验证负载算法 |
| 周四 | RPC 超时、重试、连接池配置;服务熔断初探(hyperf/circuit-breaker) | 模拟用户服务宕机,实现降级返回默认值 | 关闭用户服务,文章服务调用返回降级数据 |
| 周五 | 统一 RPC 异常处理、跨服务验证 Token 传递 | 将 Token 通过 RPC 上下文传递,用户服务鉴权 | 无 Token 时 RPC 拒绝,客户端收到 403 |
周测试:
压力测试 RPC 调用,观察连接池复用情况。编写集成测试,模拟某服务崩溃时熔断器自动打开,并在半开状态恢复正常。
第 4 周:服务注册发现与配置中心
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | Consul 部署(Docker);服务注册与健康检查(hyperf/service-governance) | 将用户、文章服务注册到 Consul,健康检查心跳 | Consul UI 查看服务状态,停止后自动剔除 |
| 周二 | 服务发现与负载均衡;hyperf/load-balancer;加权随机算法 | 文章服务调用用户服务时,基于 Consul 发现多节点 | 启动 2 个用户服务实例,RPC 请求分布均匀 |
| 周三 | 配置中心(Nacos/Apollo)集成,hyperf/config-center 动态配置下发 | 将限流阈值、数据库连接等放入 Nacos,服务监听变更 | 修改配置后服务无需重启即生效 |
| 周四 | 多环境配置管理、配置加密 | 实现测试/生产环境分离,数据库密码加密存储 | 切换环境变量,服务自动加载对应配置 |
| 周五 | 实战:将文章系统和用户服务全量接入 Consul+Nacos,实现无感扩容 | 启动/停止实例,模拟动态伸缩,保证调用正常 | 伸缩过程中持续发送请求,错误率 < 0.1% |
周测试:
修改 Nacos 配置,观察服务日志中的配置更新事件。中断 Consul Agent,验证服务调用是否降级(文件缓存)。
第 5 周:API 网关、限流与熔断
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | API 网关模式讲解;Hyperf 搭建网关服务,动态路由转发(hyperf/http-server 路由) | 创建网关项目,将请求路由到对应微服务 | 通过网关访问用户服务、文章服务接口 |
| 周二 | 全局鉴权:JWT 签发与验证;网关层统一鉴权,向下透传用户信息 | 用户登录获取 JWT,网关校验并将 X-User-Id 传递后端 | 无 JWT 返回 401,服务获取 Header 识别用户 |
| 周三 | 限流算法(令牌桶、漏桶);hyperf/rate-limit 注解使用 | 为文章列表接口添加限流(100/s),超出返回 429 | 使用 wrk 压测,超过阈值触发限流 |
| 周四 | 熔断降级深入:hyperf/circuit-breaker,配合注解实现服务级别熔断;自定义降级逻辑 | 模拟文章服务超时,网关熔断后返回缓存数据 | 延时注入,观察网关自动熔断及半开恢复 |
| 周五 | 网关聚合:批次请求合并、响应裁剪 | 网关提供 /feed 接口,聚合文章列表+作者信息 | 一次请求返回聚合数据,减少客户端调用 |
周测试:
压测网关 + 后端集群,监控限流、熔断指标。完成网关灰度发布策略:根据 Header 将流量分流到不同版本服务。
第 6 周:可观测性——链路追踪与监控
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | OpenTracing 规范;Jaeger 部署;Hyperf 集成 hyperf/tracer | 微服务调用链上报,网关→文章→用户全链路跟踪 | Jaeger UI 查看完整调用链及耗时 |
| 周二 | 自定义 Span、Tag 注入业务信息;链路日志关联 | 为关键业务打点(登录、下单),在 Span 中添加用户 ID | 搜索用户维度 Trace,定位慢请求 |
| 周三 | 日志规范:hyperf/logger 集成 ELK(Filebeat → ES → Kibana) | 将所有服务日志集中到 ES,结构化 JSON 日志 | Kibana 按 TraceID 查询日志流 |
| 周四 | Prometheus + Grafana 监控;hyperf/metric 暴露指标 | 收集 QPS、延迟、错误率、协程数,Grafana 仪表盘 | 压测时仪表盘实时刷新,设置 QPS 告警规则 |
| 周五 | 服务告警:基于 Prometheus AlertManager 配置邮件/钉钉告警 | 设定延迟 >500ms 告警,触发测试 | 构造慢接口,验证告警消息接收 |
周测试:
完整压测微服务集群,从 Grafana 输出系统瓶颈分析报告。进行故障演练(杀掉某服务实例),观测熔断、监控、告警联动情况。
第三阶段:异步消息与分布式事务(第 7-8 周)
第 7 周:消息队列与事件驱动
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | RabbitMQ 基础;hyperf/amqp 生产者、消费者实现;交换机/队列绑定 | 创建订单服务生产者,发送订单创建消息 | RabbitMQ 管理界面查看消息堆积情况 |
| 周二 | 消息可靠性:手动确认、死信队列、幂等消费 | 消费者处理失败时进入死信,保证幂等(基于消息ID去重) | 重复发送相同消息,数据库只产生一条记录 |
| 周三 | Kafka 与高吞吐场景;hyperf/kafka 使用 | 实现日志收集生产者,发送至 Kafka topic | Kafka 控制台查看消息写入速率 |
| 周四 | 事件总线与内部解耦;Hyperf 异步事件(hyperf/event)与队列事件 | 订单创建后异步触发短信、邮件服务 | 观察消费者并发处理,日志无丢失 |
| 周五 | 综合:构建订单通知链,包含重试、延迟消息(死信+TTL) | 下单 30 分钟未支付发送提醒,取消订单恢复库存 | 时间轮验证延迟消息是否准时触发 |
周测试:
模拟消息队列宕机后重启,验证消息持久化不丢失。压测消费者并发处理能力,调整 maxConsumption 参数优化吞吐。
第 8 周:分布式事务与分布式锁
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | 分布式事务理论:CAP、BASE;Saga 模式设计 | 设计下单流程的 Saga 步骤:预扣库存→创建订单→扣款 | 绘制 Saga 状态图,定义补偿操作 |
| 周二 | Hyperf 实现 Saga 协调器,基于消息队列驱动步骤 | 编码 Saga 逻辑,订单服务作为协调者 | 正常流程全部执行,查看数据库数据一致性 |
| 周三 | Saga 失败补偿:模拟扣款失败,触发补偿(取消订单、释放库存) | 人为让扣款服务返回失败,验证补偿链执行 | 库存和订单状态恢复,无脏数据 |
| 周四 | 分布式锁:Redis 红锁、hyperf/redis-lock 防止库存超卖 | 秒杀场景,加分布式锁扣减库存 | 高并发下库存扣减数量 = 订单数 |
| 周五 | 分布式 Session 与跨服务认证优化;集成 JWT 无状态 + 分布式 Session 兜底 | 网关支持两种方式,用户状态共享 | 多服务实例下,用户登录状态一致 |
周测试:
运行全套 Saga 单元测试,覆盖正向、补偿路径。使用 Jmeter 并发模拟秒杀,检查库存一致性及死锁情况。
第四阶段:综合实战项目(第 9-12 周)
项目一(第 9-10 周):微服务电商核心系统
项目描述:构建用户、商品、库存、订单、网关五大服务,接入 Consul、Nacos、Jaeger,实现全链路压测与限流熔断。模拟“秒杀活动”场景,有趣且具有挑战。
| 周次 | 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|---|
| 第 9 周 | 周一 | 项目骨架搭建,定义服务边界、Proto 契约;Docker Compose 开发环境 | 一键启动所有服务及中间件 | 检查所有服务注册到 Consul |
| 周二 | 用户服务:注册、登录、JWT 签发;商品服务:CRUD + 分页缓存 | 独立开发完成,接口自测 | Postman 调用,缓存命中率检查 | |
| 周三 | 库存服务:扣减、回补;订单服务:创建订单,RPC 调用库存、商品 | 下单流程整合,使用 RPC 调用 | 下单后库存减少,订单生成 | |
| 周四 | 网关聚合下单接口,集成限流(下单接口 50/s),JWT 全局鉴权 | 所有客户端请求通过网关 | 压测下单,触发限流 | |
| 周五 | 集成分布式事务 Saga(下单、扣库存、扣款);延迟队列取消未支付订单 | 完成支付补偿与取消逻辑 | 模拟支付失败,检查库存回补 | |
| 第 10 周 | 周一 | 秒杀功能:商品打上秒杀标签,独立秒杀接口,预热缓存 | 秒杀接口直接操作 Redis 库存,异步落库 | Redis 原子扣减,无超卖 |
| 周二 | 网关层秒杀限流(令牌桶 500/s)+ 服务层分布式锁 | 双重防护,保证高并发安全 | Jmeter 5000 并发秒杀测试 | |
| 周三 | 全链路压测与调优:开启链路追踪,Swoole 协程化 MySQL/Redis 配置 | 找到瓶颈点并优化(索引、连接池) | 输出压测报告,QPS 达到预期 | |
| 周四 | 完善监控:Prometheus 采集秒杀指标,Grafana 实时大屏 | 实现秒杀活动监控面板 | 大屏实时刷新 | |
| 周五 | 项目复盘,代码评审,文档编写 | 输出架构图、压测结果、改进建议 | PPT 演示,导师评审 |
测试方法:功能测试(下单全流程)、性能测试(秒杀并发 5000+ 无错误)、故障演练(随机停止服务验证降级与告警)、代码质量评审。
项目二(第 11 周):异步日志采集与实时分析系统
项目描述:构建日志收集服务(HTTP/RSocket 接收),投递 Kafka,消费者解析聚合,存储 ClickHouse/ES,提供统计看板。用于“站点流量监控与异常检测”,实用且有趣。
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | 系统设计;采集服务:Hyperf 接收日志,异步投递 Kafka(hyperf/kafka) | 实现日志接收接口,批量异步发送 | 用 wrk 发送海量日志,Kafka 不丢数据 |
| 周二 | 消费者:拉取日志,解析 User-Agent、IP 归属地等;富化日志 | 消费者组并发处理,存入 ES | Kibana 查看结构化日志 |
| 周三 | 实时统计:使用 Redis HyperLogLog 统计 UV,滑动窗口统计 PV | 接口返回实时 UV/PV | 验证去重与时间窗口精确度 |
| 周四 | 异常检测:简单阈值告警,或基于规则发现流量骤增;异步告警通知 | 每分钟 PV 超过阈值触发钉钉告警 | 模拟突发流量,告警触发 |
| 周五 | 看板服务:提供图表 API,前端 Echarts 展示;全链路压测优化 | 部署完整系统,压测采集接口 20000 QPS | 看板数据实时刷新,系统稳定 |
测试方法:日志完整传输验证(无丢失、乱序),UV/PV 统计算法准确率测试,异常告警延迟 <10s,全链路压力测试采集部分维持 2w QPS 以上。
项目三(第 12 周):高性能 API 网关与流量治理平台
项目描述:自研 API 网关,支持动态路由、插件链、多维度限流、熔断、安全防护,提供可视化后台。这是一款“可商用的微服务网关”雏形,极具深度和实用价值。
| 天次 | 学习任务 / 知识点 | 实战要求 | 测试 / 检验方法 |
|---|---|---|---|
| 周一 | 网关架构设计:核心路由匹配(前缀、正则)、动态配置加载 | 路由配置存于 Nacos,网关热更新 | 修改路由配置,网关即时生效 |
| 周二 | 插件机制:利用 Hyperf 事件与 AOP 设计插件接口;内置日志、CORS 插件 | 实现请求日志插件(记录请求耗时、状态码) | 访问任何接口,日志输出 |
| 周三 | 高级限流:分布式令牌桶(Redis + Lua),支持按用户、IP、接口限流 | 配置不同维度的限流规则,组合生效 | 测试同一 IP 超额返回 429,其他 IP 正常 |
| 周四 | 安全模块:IP 黑白名单、SQL 注入/XSS 检测插件、请求体大小限制 | 配置黑名单 IP,请求被拦截 | 模拟攻击,网关直接返回 403 |
| 周五 | 可视化后台(简易):管理路由、插件、限流规则;容器化部署 K8s CronJob | 网关及后台服务打包成 Docker,编写 K8s 部署文件 | 最终演示:动态修改规则,查看实时流量图,总结三个月学习成果 |
测试方法:网关稳定性压测(自身 QPS 不低于 5 万),插件热加载验证,恶意请求拦截测试,并通过 K8s 进行滚动更新零中断部署。
整体考核与认证建议
- 每日:提交当天代码到 Git 仓库,通过自动化 PHPUnit 测试。
- 每周:完成周测试要求,撰写学习笔记(遇到的坑与优化点)。
- 每阶段:阶段实战项目代码评审 + 输出架构图及性能报告。
- 结业:三个综合项目必须全部通过验收,完成至少一次完整压测与故障演练。将最终项目部署至云服务器并演示,由导师打分。
该课程覆盖了从协程原理到生产级微服务治理的全链路技能,通过“理论+每日任务+综合项目”驱动,确保学完即可在实际工作中构建高性能 PHP 微服务体系。
更多推荐
所有评论(0)