ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hyperf 2.1 完整技术解读:Swow 协程驱动、Kafka 消息组件与 24 个迭代版本的关键演进

Hyperf 2.1 完整技术解读:Swow 协程驱动、Kafka 消息组件与 24 个迭代版本的关键演进 后端微服务【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/gh_mirrors/hy/hyperf点击查看免费下载本文以官方 v2.1 更新记录涵盖 v2.1.0 至 v2.1.23 共 24 个版本时间跨度为 2020-12-28 至 2021-07-12为核心骨架并结合当前仓库中对应组件的源码实现系统梳理 Hyperf 2.1 系列在运行环境、协程支持、消息中间件、定时任务、RPC、数据库、安全修复等方面的全部演进内容。读者读完可以完整掌握 2.1 版本相对于 2.0 的破坏性变更清单、新增组件与 API 清单以及各个补丁版本修复的典型问题为升级决策与源码阅读提供依据。一、v2.1.02.1 系列的基石版本v2.1.0 发布于 2020-12-28是整个 2.1 系列的开篇版本。这一版本以依赖升级、Swow 驱动支持与一批 API 行为变更为核心后续 v2.1.1 ~ v2.1.23 的所有修复与增强都建立在该版本之上。1.1 依赖升级PHP 门槛提高至 7.3v2.1.0 对运行环境与核心依赖做了一次系统性的升级主要包括依赖升级后的版本要求php7.3phpunit/phpunit^9.0guzzlehttp/guzzle^6.0\|^7.0vlucas/phpdotenv^5.0endclothing/prometheus_client_php^1.0twig/twig^3.0jcchavezs/zipkin-opentracing^0.2.0doctrine/dbal^3.0league/flysystem^1.0\|^2.0需要注意的是league/flysystem在 2.1.0 中允许^1.0|^2.0但在后续的 v2.1.2 中又因2.0版本无法兼容而降级到^1.0PR #3077。因此实际以 2.1 系列最终状态为准时flysystem 的兼容版本为^1.0。1.2 新增 Swow 驱动支持v2.1.0 最重要的功能新增之一是支持 Swow 驱动的HttpServerPR #2659、#2663。Swow 是另一个面向协程的 PHP 运行环境Hyperf 自此可以在 Swoole 与 Swow 两套运行时之上运行 HTTP 服务。该版本同时修复了自定义进程无法在 Swow 驱动下使用的问题PR #2741。1.3 移除项清理废弃 API 与冗余配置v2.1.0 移除了一批在 v1.x/v2.0 中已标记废弃的成员与配置升级时需要注意移除Hyperf\Amqp\Builder已弃用的成员变量$name移除Hyperf\Amqp\Message\ConsumerMessageInterface已弃用的方法consume()移除Hyperf\AsyncQueue\Driver\Driver已弃用的成员变量$running移除Hyperf\HttpServer\CoreMiddleware已弃用的方法parseParameters()移除Hyperf\Utils\Coordinator\Constants已弃用的常量ON_WORKER_START与ON_WORKER_EXIT移除Hyperf\Utils\Coordinator已弃用的方法get()移除配置文件rate-limit.php请改用rate_limit.php移除无用的类Hyperf\Resource\Response\ResponseEmitter将组件hyperf/paginator从hyperf/database的依赖中移除移除Hyperf\Utils\Coroutine\Concurrent中的方法stats()。1.4 行为变更与破坏性调整v2.1.0 还包含一系列影响运行行为的变更属于升级时必须关注的部分Hyperf\Utils\Coroutine::parentId的返回值语义被明确在主协程顶层协程中调用时返回0在非协程环境中调用时抛出RunningInNonCoroutineException协程已被销毁时抛出CoroutineDestroyedException。Hyperf\Guzzle\CoroutineHandler的 API 调整删除了execute()方法initHeaders()改为返回初始化好的 Header 列表而非直接将$headers赋值给客户端删除了checkStatusCode()方法。不再在PDOStatement::bindValue()中设置data_typePR #2720以避免字符串索引使用整型时索引无法命中的问题。从StreamInterface获取数据时改用(string) $body而不是$body-getContents()PR #2871因为getContents()只会返回剩余部分的数据。允许设置重复的中间件PR #2909。修改了默认的Exception Formatter字符串格式PR #2935。命令gen:model不再默认将decimal格式转化为floatPR #2979。不再在require symfony/serialize时自动更换Hyperf\Contract\NormalizerInterface的实现如需使用 Symfony Serializer 需显式配置PR #1846配置示例如下use Hyperf\Utils\Serializer\SerializerFactory; use Hyperf\Utils\Serializer\Serializer; return [ Hyperf\Contract\NormalizerInterface::class new SerializerFactory(Serializer::class), ];Hyperf\GrpcClient\BaseClient的方法simpleRequest、getGrpcClient、clientStreamRequest更名为_simpleRequest、_getGrpcClient、_clientStreamRequestPR #1924。1.5 废弃预告提前规划 v2.2 / v3.0 迁移v2.1.0 明确了两项即将废弃的 APIHyperf\AsyncQueue\Signal\DriverStopHandler将在 v2.2 中废弃请改用Hyperf\Process\Handler\ProcessStopHandlerHyperf\Server\SwooleEvent将在 v3.0 中废弃请改用Hyperf\Server\Event。1.6 新增能力v2.1.0 的基础设施层新增新增Hyperf\AsyncQueue\Listener\QueueHandleListener用于记录异步队列的运行日志PR #2671新增Hyperf\Utils\Waiter可以用来等待一个协程结束PR #2923新增Hyperf\Database\Model\Collection::columns()行为类似于array_columnPR #3001为Json::decode与Json::encode新增参数$depth与$flagsPR #3002优化 prometheus 使其同时支持https与http协议PR #3009。二、2.1 系列新增组件与核心能力在 v2.1.0 之后2.1 系列通过 23 个补丁版本持续补充新组件与新 API。以下按主题梳理这些关键新增。2.1 新增hyperf/kafka消息组件v2.1.22021-01-11新增了hyperf/kafka组件PR #2847这是 2.1 系列中分量最重的新组件之一。围绕 Kafka 组件后续版本持续修复与增强v2.1.4修复 Kafka 生产者无法在集群模式下使用的问题PR #3189v2.1.6修复设置autoCommit为false时无效的问题PR #3245优化组件使其无需新建生产者即可重新发布消息PR #3249移除rebalance检查PR #3235因为底层库longlang/phpkafka已增加对应检查v2.1.7为 Kafka 消费者新增订阅多个主题的能力PR #3268并为不同消费者设置不同的 Client IDPR #3258。2.2 定时任务Crontab的 enable 参数演进定时任务是 2.1 系列迭代最密集的模块之一其核心演进是enable参数的能力扩展v2.1.9PR #3325为Crontab注解新增enable参数用于控制当前任务是否注册到定时任务调度器中v2.1.13PR #3450修复Crontab无法作用于方法的问题现在支持在一个类中配置多个Crontabv2.1.17PR #3329enable参数进一步支持array类型你可以通过数组动态控制定时任务是否启动。从当前仓库源码看Crontab注解的enable属性类型已扩展为array|bool|string并兼容了字符串形式的true/false解析见 Crontab.php。同时 crontab.php 配置文件 中提供了默认的enable true开关。这意味着定时任务既可以通过注解参数控制也可以通过全局配置文件统一开关。2.3 RPC 路径生成器 DotPathGeneratorv2.1.19PR #3626为 RPC 组件新增了路径生成器Hyperf\Rpc\PathGenerator\DotPathGenerator。从源码看该实现将服务的类名取命名空间最后一段并转为 Studly 风格与方法名以.连接生成 RPC 路径见 DotPathGenerator.phpnamespace Hyperf\Rpc\PathGenerator; use Hyperf\Rpc\Contract\PathGeneratorInterface; use Hyperf\Stringable\StrCache; class DotPathGenerator implements PathGeneratorInterface { public function generate(string $service, string $method): string { $handledNamespace explode(\\, $service); $path StrCache::studly(end($handledNamespace)); return $path . . . StrCache::studly($method); } }例如服务类App\JsonRpc\CalculatorService的方法calculate会生成CalculatorService.calculate这样的点分路径适合与使用点分路径约定的 RPC 对端如部分 Go / Java 服务互通。2.4 事务注解Transactional增强v2.1.11PR #3376为Hyperf\DbConnection\Annotation\Transactional注解新增了$connection与$attempts参数用户现在可以按需指定事务使用的数据库连接名以及事务失败后的重试次数而不再局限于默认连接与单次尝试。2.5 JSON-RPC 连接池传输器的重试机制v2.1.4PR #3195为JsonRpcPoolTransporter新增了重试机制当连接、发包、收包失败时默认重试 2 次收包超时不进行重试。从当前仓库源码可以确认其默认配置与重试逻辑见 JsonRpcPoolTransporter.phpprivate $config [ connect_timeout 5.0, settings [], pool [ min_connections 1, max_connections 32, connect_timeout 10.0, wait_timeout 3.0, heartbeat -1, max_idle_time 60.0, ], recv_timeout 5.0, retry_count 2, retry_interval 100, ];其中retry_count默认值为 2retry_interval默认值为 100毫秒。在send()方法中通过retry($this-retryCount, ...)包裹整个获取连接 → 发送 → 接收校验流程一旦抛出RecvException且错误码为SOCKET_ETIMEDOUT收包超时则直接抛出不再重试其余异常则按重试间隔重试。同时 v2.1.4PR #3191优化了hyperf/json-rpc组件当连接中断后会先尝试重连修复了服务端重启后连接池连接全部失效、新请求首次调用必失败的问题PR #3179、#3191。2.6 watcher 新增 FindNewerDriverv2.1.4PR #3170为hyperf/watcher组件新增了驱动器FindNewerDriver对 Mac、Linux 和 Docker 环境更加友好。仓库中可找到该驱动器的实现与配套测试见 FindNewerDriver.php 与 FindNewerDriverTest.php。2.7 协程安全的实例复用Hyperf\Utils\Channel\Callerv2.1.5PR #3214新增类Hyperf\Utils\Channel\Caller它通过 Channel 帮助你在协程安全模式下复用实例避免连接被多个协程同时绑定而导致的报错。v2.1.13PR #3453又优化了Hyperf\Utils\Channel\Caller回收实例的机制防止实例为null时无法正确回收的问题。同期 v2.1.2PR #3082修复了hyperf/db组件在defer中使用时连接被其他协程绑定的问题可见协程上下文隔离是这一阶段修复的重点。2.8 数据库与 ORM 相关新增v2.1.15PR #3484新增 ORM 聚合方法withMax()、withMin()、withSum()与withAvg()可在预加载关联时直接计算聚合值v2.1.8PR #3310新增Blueprint::comment()允许在使用 Migration 时为表设置注释v2.1.8PR #3316允许用户为hyperf/db组件注册自定义数据库适配器v2.1.2PR #3066为hyperf/db新增ConnectionInterface::run(Closure $closure)方法v2.1.7PR #3261新增Pipeline::handleCarry()方法便于处理返回值v2.1.4PR #3174严格检查hyperf/database组件中where语句的绑定参数避免绑定值被不严谨的代码替换同时修复了 PR #3174 描述的绑定值问题v2.1.5PR #3226优化hyperf/database组件在使用group by或having时通过子查询计算总数v2.1.2PR #3050修复increment()后使用save()时extra数据被保存两次的问题。2.9 反射与调试工具v2.1.7PR #3267新增Hyperf\Utils\Reflection\ClassInvoker用于执行类的非公共方法、读取非公共属性v2.1.10PR #3367优化gen:model生成模型字段类型注释时尽量读取自定义转换器转换后的对象类型v2.1.16PR #3514新增Hyperf\HttpServer\Request::clearStoredParsedData()方法用于清理已解析的请求体数据。2.10 其他重要新增v2.1.1为metric组件新增收集命令行运行指标的能力PR #3052为socketio-server新增Engine::close协议支持并在getRequest调用失败时抛出连接已关闭的异常PR #3054v2.1.5为hyperf/nacos组件新增配置项url用于访问 Nacos 服务PR #3211新增Hyperf\Utils\CodeGen\Package::getPrettyVersion()用于获取组件版本PR #3224并将jean85/pretty-package-versions升级到^1.2|^2.0以支持 Composer 2.xPR #3224——使用 Composer 2.x 需安装^2.0版本反之安装^1.2v2.1.7为phar:build新增选项-MPR #3193、#3296可将外部文件或目录映射到 Phar 包内的虚拟位置v2.1.8新增RouteCollector::getRouteParser()方法PR #3311可便捷地从RouteCollector获取RouteParser对象v2.1.10优化phar:build生成的 Phar 可以脱离php直接执行如./composer.phar而非php composer.pharPR #3364v2.1.11新增Hyperf\Testing\Client::sendRequest()PR #3403允许使用自己构造的ServerRequest如自定义 Cookies发起测试请求v2.1.13优化phar:build支持以软连接方式加载的组件包PR #3455v2.1.3为view-engine组件增加合并任意标签属性的能力PR #3059与ComponentAttributeBag::has()方法PR #3123。2.11 新组件孵化2.1 系列期间官方还发布了多个孵化项目Incubator它们独立于主仓库迭代v2.1.2DAG有向无环图任务编排与 RPN逆波兰表示法v2.1.4基于 Channel 的多路复用 RPC 组件rpc-multiplex、适配hyperf/db的db-pgsqlPgSQL 适配器v2.1.8rpc-multiplex与db-pgsql的后续推进v2.1.19基于 Nacos Open API 的nacos-sdk。仓库中rpc-multiplex、dag、rpn等组件现已并入主仓库的 src/rpc-multiplex、src/dag、src/rpn 目录可作为阅读这些孵化组件最终落地的参考。三、安全更新与关键问题修复3.1 v2.1.22 的两项安全修复v2.1.222021-06-28是 2.1 系列中唯一标注为 Security 的版本包含两个值得关注的安全修复修复验证器规则active_url无法正确通过dns_get_record检查 DNS 记录、从而可能绕过验证的问题PR #3723修复RequiredIf规则可能被利用生成反序列化漏洞小工具链的问题PR #3724。同版本还修复了in/not in规则对in:00与传值0的判断错误PR #3721。3.2 定时任务规则解析系列修复2.1 系列在 v2.1.20 集中修复了 Crontab 规则解析的两个典型问题形如10-12/1,14-15/1的复合步长规则无法正常工作PR #3667没有步长后缀的区间规则如10-12无法正常工作PR #3669。此外 v2.1.20 还修复了Task注解中$workerId参数无效的问题PR #3674v2.1.12 修复了worker_num设置为非 Integer 时 Task 策略无法使用的问题PR #3423。3.3 协程上下文与依赖注入修复2.1 系列修复了大量与协程上下文、Inject注入相关的边界问题v2.1.16修复Inject无法作用于嵌套 Trait 的问题PR #3520v2.1.11修复Inject注入的对象会被 Trait 中注入的对象覆盖PR #3394、继承父类私有变量注入导致子类实例化报错PR #3395v2.1.10修复FormRequest无法从协程上下文获取修改后的ServerRequest导致验证失败PR #3351v2.1.9修复其他协程修改静态变量$constraints导致模型关系查询错误的问题PR #3330v2.1.3修复从已被销毁的父协程复制协程上下文时报错的问题PR #3106v2.1.8修复hyperf/cache在注解未设置超时时间时 ttl 被强制转为 0、导致缓存不失效的问题PR #3301。3.4 模型缓存与数据库修复v2.1.18修复事务回滚时模型的累加、累减操作导致模型缓存产生脏数据的问题PR #3598修复数据库存在表前缀时fromSub()/joinSub()无法使用的问题PR #3610v2.1.13修复存在表前缀时模型缓存的默认值无法生效的问题PR #3447v2.1.5修复hyperf/database中 JOIN 查询导致的内存泄露PR #3222v2.1.4修复MySqlBuilder::getColumnListing在 MySQL 8.0 下无法使用的问题PR #3165v2.1.3修复未主动设置PDO::ATTR_PERSISTENT为true时的类型错误PR #3137v2.1.1 的 PR #3045 修复了相同问题v2.1.2修复hyperf/scout中ElasticsearchEngine::getTotalCount()不兼容 Elasticsearch 7.0 的问题PR #3095。3.5 协程风格服务与 WebSocket 修复协程风格服务Coroutine Server是 2.0 引入的重要能力2.1 系列围绕其持续修复v2.1.14修复协程风格下 WebSocket 服务不支持配置多个端口的问题PR #3465修复协程风格 WebSocket 服务无法正常释放数据库连接池的问题PR #3467新增Sender::getResponse()获取与fd对应的 Response 对象PR #3472v2.1.18修复协程风格 WebSocket 服务onOpen事件结束后协程无法销毁的问题PR #3607v2.1.17修复 Swow 服务处理 keepalive 请求时协程无法在每请求结束后销毁的问题PR #3586v2.1.10修复协程风格服务下未配置pid_file仍意外生成runtime/hyperf.pid的问题PR #3365v2.1.13修复 SocketIO 定时清理失效fd无法作用到其他 worker 进程的问题PR #3432。3.6 RPC 与消息中间件修复v2.1.13修复 RPC 结果不支持可空类型如?array被强制转数组的问题PR #3434v2.1.5修复hyperf/rpc-server中中间件被意外替换的问题PR #3204修复协程风格服务下 AMQP 消费者异常时连接无法回收到连接池的问题PR #3209修复hyperf/tracer在 defer 中 flush 失败导致进程退出PR #3228修复hyperf/scout的orderBy无效PR #3230v2.1.6修复 AMQP 连接服务端失败导致连接池耗尽PR #3233修复 Nsq 消费者进程无法触发deferPR #3255优化 Kafka 重用连接进行消息发布PR #3249v2.1.16修复 Nats 因 Socket 超时小于最大闲置时间导致连接意外关闭PR #3513v2.1.2修复 AOP 使用 pipeline 时的内存泄露PR #3087修复phar打包后getRealPath无法工作PR #3084。3.7 路由与测试相关修复v2.1.19修复describe:routes命令中相同路径但不同方法的路由被合并的问题PR #3618修复Hyperf\Di\Annotation\Scanner中class_map不生效的问题PR #3625v2.1.12修复可选参数路由设置中间件时被意外执行两次的问题PR #3426v2.1.10修复bin/hyperf.php中自定义常量无法在server:watch中使用PR #3363修复Hyperf\Testing\Client无法模拟构造正常的UriInterfacePR #3356修复Arr::forget在整型 key 不存在时报错PR #3348v2.1.11修复超全局变量在协程上下文无 Request 对象时无法工作PR #3380修复UploadedFile::isValid()在 phpunit 中判断错误PR #3398v2.1.9优化 testing 组件使模拟请求运行在独立协程中避免协程变量污染PR #3338。四、AMQP 默认行为变更v2.1.5PR #3218默认为 AMQP 配置了 QOS 参数prefetch_count为1、global为false、prefetch_size为0。这一变更让消费者默认具备一定的流控能力。从当前仓库源码可以印证ConsumerMessage的默认 QOS 配置中prefetch_count默认为 1见 ConsumerMessage.php而 Consumer.php 在消费时会从 QOS 配置中读取prefetch_count并调用basic_qos($size, $count, $global)设置信道。五、升级建议与兼容性注意事项综合 2.1 全系列的变化从 2.0 升级到 2.1 或从 2.1 继续升级时建议重点核对以下事项运行环境确认 PHP 7.3如使用 Composer 2.x需安装jean85/pretty-package-versions的^2.0版本v2.1.5 起。依赖版本guzzle 允许^6.0|^7.0flysystem 在 2.1.2 后锁定为^1.0doctrine/dbal升级为^3.0后需关注gen:migration相关兼容v2.1.3 修复了doctrine/dbal在 Migration 中无法工作的问题。API 变更检查是否使用了被移除的rate-limit.php配置改用rate_limit.php、Hyperf\Guzzle\CoroutineHandler的旧方法、GrpcClient\BaseClient旧方法名等。废弃项规划DriverStopHandler将在 v2.2 废弃、SwooleEvent将在 v3.0 废弃尽早切换到替代 API。安全修复如使用验证器组件v2.1.22 的active_url与RequiredIf修复建议尽快合入。六、小结Hyperf 2.1 系列以 Swow 驱动支持与 PHP 7.3 门槛为起点在 24 个版本中完成了 Kafka 组件引入、定时任务enable参数能力扩展、JSON-RPC 连接池重试、协程安全实例复用等一系列能力建设同时修复了协程上下文隔离、模型缓存一致性、验证器安全、定时任务规则解析等大量实战问题。本文涉及的关键源码均可直接在仓库中继续深入RPC 路径生成可看 DotPathGenerator.phpJSON-RPC 重试可看 JsonRpcPoolTransporter.php定时任务开关可看 Crontab.php 与 crontab.phpAMQP 流控可看 ConsumerMessage.php 与 Consumer.php。赞分享后端微服务【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/gh_mirrors/hy/hyperf点击查看免费下载相关推荐guzzlehttp/psr7 版本演进全解读从 1.0 到 2.1 的 PSR-7 消息实现关键变更guzzlehttp/psr7 版本演进全解读从 1.0 到 2.1 的 PSR 7 消息实现关键变更 导读本文以 captcha 仓库 PHP 服务端依赖后端应用安全图像处理Gradio Textbox 前端组件演进全解从 CHANGELOG 到源码实现的 24 个关键版本Gradio Textbox 前端组件演进全解从 CHANGELOG 到源码实现的 24 个关键版本 gradio/textbox 是 Gradio 前端体前端后端AI 应用Hyperf框架Swow协程引擎深度集成技术解析实现超高并发性能的终极指南 Hyperf框架Swow协程引擎深度集成技术解析实现超高并发性能的终极指南 Hyperf框架作为一款专注于超高速和灵活性的PHP协程框架其与Swow协后端微服务上一篇终极Windows启动器10倍提升工作效率的完整指南下一篇PyPTO operation dtype 配置化迁移从 C 内联集合到 JSON 配置PR 6074 新架构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表