首页 / 资讯中心 / 文章详情

Hyperf v1.0 版本演进全记录:从协程并发控制到分布式组件体系的技术变迁

Hyperf v1.0 版本演进全记录:从协程并发控制到分布式组件体系的技术变迁 ★ FEATURED ARTICLE
后端微服务【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/gh_mirrors/hy/hyperf点击查看免费下载本文以 Hyperf v1.0 系列 15 个补丁版本v1.0.2 ~ v1.0.162019-06-25 至 2019-09-20的官方更新记录为主体逐项梳理该框架在协程并发控制、gRPC 客户端、分布式 ID 生成Snowflake、多语言翻译Translation、视图与定时任务、服务注册发现等方向上的新增特性、行为变更与关键修复。读完本文你将完整掌握 Hyperf v1.0 阶段每个版本引入了什么能力、调整了哪些行为、修复了哪些隐患并能结合仓库源码理解其底层实现原理为升级或排查兼容性问题提供依据。版本脉络一览Hyperf v1.0 的演进节奏非常密集从 2019-06-25 的 v1.0.2 到 2019-09-20 的 v1.0.16几乎每周一个补丁版本逐步补齐了微服务、分布式、异步任务、定时任务等企业级能力。整体脉络可以概括为三个阶段阶段版本区间主题起步期v1.0.2 ~ v1.0.4基础设施打磨Redis 连接、连接池、协程兼容、测试体系能力扩充期v1.0.5 ~ v1.0.10定时任务、视图组件、Task 组件、AMQP 多路由、ETCD、RPC 动态代理、缓存文件驱动稳定深化期v1.0.11 ~ v1.0.16进程命名、Snowflake、Translation、协程并发控制、gRPC 客户端异常规范化下文按版本号从新到旧逐版展开与官方记录顺序一致并在关键条目处补充仓库源码级别的实现佐证。v1.0.16 - 2019-09-20本版本的重点是协程并发控制特性的引入与 gRPC/Task 异常语义的规范化。新增Redis 客户端options配置参数支持#565允许通过配置向 Redis 客户端传递更细粒度的连接选项为后续高级用法如超时、重连策略铺路。**协程并发控制特性#580class Concurrent { protected Channel $channel; public function __construct(protected int $limit) { $this-channel new Channel($limit); } // ... public function create(callable $callable): void { $this-channel-push(true); Coroutine::create(function () use ($callable) { try { $callable(); } catch (Throwable $exception) { // 记录异常日志 } finally { $this-channel-pop(); } }); } }从源码结构看其原理是借助容量为$limit的协程 Channel 作为“信号量”每次create()先push(true)占位容量耗尽时协程会挂起等待任务执行完毕在finally中pop()释放槽位从而保证同一时刻最多只有limit个协程在运行。仓库配套测试位于 src/coroutine/tests/ConcurrentTest.php。变更**gRPC 客户端启动失败抛出专用异常#583并在 src/grpc-client/src/BaseClient.php 中用于“发送请求失败”等场景携带 gRPC 标准状态码如StatusCode::INTERNAL使调用方可以精确捕获并区分错误类型。Task 失败回传异常#585投递到 TaskWorker 执行的 Task 失败时异常会回传到 Worker 进程中便于调用方感知异步任务的真实失败原因而不是静默丢失。修复修复Coroutine\Http2\Client-send返回值不正确的场景#564。修复 JSON RPC 消费者配置name非接口时无法生成代理类#567。修复 ExceptionHandlerstopPropagation的协程变量污染#571协程上下文隔离不当时异常传播标记会串扰到其他协程本版本修复了这一隐患。动态初始化 Snowflake 的 MetaData#579主要修复在命令模式下使用 Snowflake例如执行di:init-proxy命令时会连接 Redis 服务器直至超时的问题——即元数据不再在非必要场景下被强制从 Redis 拉取。v1.0.15 - 2019-09-11本版本聚焦 gRPC 客户端与 UDP Server 的稳定性。修复Guzzle HTTP 客户端CoroutineHanlder未处理状态码-3#534补齐了协程 Handler 对连接异常状态码的兜底判断。gRPC 客户端$client参数设置错误#541。Hyperf\Grpc\Parser::parseResponse无法支持 gRPC 标准状态码#542使响应解析与 gRPC 规范对齐。gRPC 客户端在服务端关闭连接时残留死循环协程#551修复了连接断开后协程无法退出的资源泄漏问题。UDP Server 无法正确配置启动#558。优化优化Hyperf\Amqp\Connection\SwooleIO的read/write#549减少不必要的重试降低 AMQP 通信延迟。优化Hyperf\HttpServer\Response::redirect()#559自动识别链接首位是否为斜杠并合理修正参数。优化Hyperf\WebSocketServer\CoreMiddleware#560移除不必要的代码。移除与弃用预告移除Hyperf\Database\Model\SoftDeletes内无用的restoring和restored静态方法#545。标记Hyperf\Server\ServerInterface::SERVER_TCP为弃用#558该常量将在 v1.1 移除由更合理的Hyperf\Server\ServerInterface::SERVER_BASE常量替代。这提示升级到 v1.1 时需要对服务类型常量做一次替换。v1.0.14 - 2019-09-05本版本的最大亮点是Snowflake 分布式全局唯一 ID 生成组件的正式引入。新增**Snowflake 官方组件#389核心类SnowflakeIdGenerator定义于 src/snowflake/src/IdGenerator/SnowflakeIdGenerator.php并通过 src/snowflake/src/ConfigProvider.php 将IdGeneratorInterface默认绑定到SnowflakeIdGenerator即接入容器后即可通过接口注入使用。download()方法#525为Hyperf\HttpServer\Contract\ResponseInterface增加download()方法提供便捷的文件下载响应返回。变更**db:model的refresh-fillable行为#482 与 src/database/src/Commands/ModelOption.php 看到isRefreshFillable()/setRefreshFillable()的完整定义AST 层面仅在选项开启时才重写fillable属性见 src/database/src/Commands/Ast/ModelUpdateVisitor.php。路由path空字符串行为#501当Mapping注解的path属性为空字符串时该路由为/prefix即仅保留控制器前缀。进程名携带app_name#513如果项目设置了app_name属性则进程名称会自动带上该名称便于运维区分多应用进程。非协程环境下Coroutine::parentId()返回null#508 #526明确了非协程环境下的返回值语义。修复Elasticsearch clienthost配置错误时的返回类型错误#479。Redis 密码为空字符串时鉴权失败#514修复了空密码被当作有效密码处理的边界情况。**Translator 无法重复翻译#527核心通过TranslatorLoaderInterface加载语言包、以MessageSelector处理复数选择。v1.0.13 - 2019-08-28本版本正式拆出translation 独立组件并为 GRPC-Server 补齐标准错误码。新增**独立组件 hyperf/translation#428 与 src/translation/src/TranslatorFactory.php。GRPC-Server 标准错误码#449使 gRPC 服务端错误返回符合 gRPC 规范。Schema魔术方法 IDE 提示#450为Hyperf\Database\Schema\Schema类的魔术方法增加对应静态方法注释为 IDE 提供代码提醒支持。变更AutoController不再为魔术方法生成路由#451避免__call等魔术方法被意外暴露为 HTTP 路由。GRPC-Server 与 HTTP-Server 异常处理器覆盖全部异常#468不再只处理ServerException未捕获异常也能被统一处理防止异常直接抛到进程外层。修复分页数据不足时返回类型错误#466。vendor:publish重复生成#470当目标文件夹已存在时不再重复生成。v1.0.12 - 2019-08-21本版本为协程上下文与日志体系带来两项实用能力。新增**Context::override()方法#405/** * Retrieve the value and override it by closure. */ public static function override(string $id, Closure $closure, ?int $coroutineId null): mixed { $value null; if (self::has($id, $coroutineId)) { $value self::get($id, null, $coroutineId); } $value $closure($value); self::set($id, $value, $coroutineId); return $value; }其语义是“读-改-写”三步原子化封装先取出已有值不存在则为null交由闭包计算新值再写回协程上下文并返回新值。配套测试见 src/context/tests/ContextTest.php。Logger 多 Handler 支持#415Logger 配置文件现在支持配置多个 Handler。变更与修复移除GrpcClient::openStream()第 3 个参数#431该参数不影响实际使用。修复 WebSocketExceptionHandler 内变量名称错误#414修复 GuzzleCoroutineHandler下proxy参数不支持数组传值#424修复Request::file()在同一个 Name 上传多个文件时返回格式不正确#430修复 GRPC Client 发送 Force-Close 请求时缺少参数#431。v1.0.11 - 2019-08-15本版本引入进程命名与生命周期事件并优化了异步队列的 Job 压缩。新增进程名称监听器#366新增Hyperf\Server\Listener\InitProcessTitleListener来设置进程名称同时增加了Hyperf\Framework\Event\OnStart和Hyperf\Framework\Event\OnManagerStart两个生命周期事件供用户在对应阶段执行初始化逻辑。修复db:model在 MySQL 8 下无法运行#361修复了 MySQL 8 信息模式差异导致的兼容问题。实现\Serializable接口的自定义异常无法正确序列化/反序列化#369修复跨进程传递异常时的数据丢失问题。JSON RPC Server 下自定义 ExceptionHandler 不生效#384因为框架默认自动处理了对应异常用户自定义处理器被绕过。BaseClient流式传输时$client属性类型错误#370同时增加默认content-type为application/grpcproto并允许用户通过自定义Request对象重写buildRequest()方法。变更AsyncQueue 的 Job 压缩#356 #390生成 Job 时如果 Job 实现了Hyperf\Contract\CompressInterfaceJob 对象会被压缩为更小的对象后再投递。仅$enableCache为 true 时才生成注解缓存文件#358避免缓存文件被无谓生成。Collection 与 Model 增加压缩能力#359 #390当类实现CompressInterface时可通过compress方法生成更小的对象降低跨进程传输开销。v1.0.10 - 2019-08-09本版本带来RPC 动态代理客户端与缓存文件驱动两项重要能力。新增Controller/RequestHandler 参数的自定义对象数组支持#321特别适用于 JSON RPC现在可以通过在方法上定义var Object[]获得框架自动反序列化对应对象的支持。NodeRequestIdGenerator#324实现Hyperf\Contract\IdGeneratorInterface的 ID 生成器。动态代理的 RPC 客户端#336无需手写客户端类即可基于接口声明获得可调用的 RPC 代理。缓存文件驱动#346 #348为hyperf/cache缓存组件增加文件驱动不再依赖 Redis 即可使用缓存能力。变更当扫描的$paths为空时不再输出扫描信息#330。根据 Composer 的 PSR-4 定义规则加载业务项目#328。优化 JSON RPC 服务端与客户端的异常消息处理#329。为make函数增加索引数组传参方式#340。修正拼写错误的类名重命名#349升级时需要注意类名变更原类名修改后的类名Hyperf\Database\Commands\Ast\ModelUpdateVistorHyperf\Database\Commands\Ast\ModelUpdateVisitorHyperf\Di\Aop\ProxyClassNameVistorHyperf\Di\Aop\ProxyClassNameVisitorHyperf\Di\Aop\ProxyCallVistorHyperf\Di\Aop\ProxyCallVisitor修复优化 RPC 服务注册时多次调用 Consul Services 的问题#325。修复TraceMiddeware在新版 openzipkin/zipkin 下的类型约束错误#332。修复Redis::delete()方法在 Redis 5.0 版本不存在的问题#333。修复向阿里云 ACM 配置中心拉取配置时部分配置无法更新的问题#334。修复 Header 的 key 为非字符串类型时返回 500 的问题#337。修复ProviderConfig::load在重复 key 时深度合并将字符串转换成数组的问题#338。v1.0.9 - 2019-08-03新增composer-json-fixer#317用于优化composer.json文件内容。DI Definition 支持匿名函数 value#320依赖注入定义时允许 value 为匿名函数实现延迟求值。修复AsyncQueue 消息改为在子协程内处理#300修复attempts参数与实际重试次数不一致的问题。修复Hyperf\Utils\Arr::set的$key不支持int和null#305。修复Hyperf\Amqp\BeforeMainServerStartListener监听器优先级错误#312。修复 ETCD 配置中心在 Worker 进程重启后或自定义进程内无法使用#315。修复服务持续注册到服务中心的问题#318。变更强制转换Cacheable和CachePut注解的$ttl属性为int类型#323。v1.0.8 - 2019-07-31本版本引入ETCD 客户端与 ETCD 配置中心组件。新增AMQP 消费者支持配置及绑定多个routing_key#276一个消费者可以同时订阅多个路由键。**ETCD 客户端及配置中心组件#277 与 src/config-etcd。变更服务注册失败 10 秒后重试#297且屏蔽了连接不上服务中心Consul而抛出的异常避免注册失败直接拖垮主流程。适配openzipkin/zipkinv1.3.3#298 #301。修复AOP 同类多方法只代理第一个方法#271修复classes策略下配置同一个类的多个方法时只有第一个方法被代理的问题。AOP 匿名类节点丢失#285。自动 rollback 未 commit/rollback 的 MySQL 连接#286防止连接归还连接池时残留未结束事务。修复Request::header方法的$default参数无效#292。修复Arr::get的$key不支持int与null#293。v1.0.7 - 2019-07-26修复修复投递 AMQP 消息时的超时逻辑#266。修复当一个服务注册到服务中心时所有服务被移除的问题#273——典型的注册表被整体覆盖的并发问题。修复视图响应的 Content-Type#274。v1.0.6 - 2019-07-24本版本是能力扩充的高峰视图组件、Task 组件、定时任务调度策略、JSON RPC TCP 协议完善集中落地。新增**视图组件#203 与 src/view-engine。Task 组件#203适配 Swoole Task 机制实现异步任务投递。定时任务调度策略#245增加TaskWorkerStrategy和WorkerStrategy两种定时任务调度策略。协程上下文缓存驱动#251增加用协程上下文作为存储介质的缓存驱动。RequestMapping::$methods数组传值#254现在可以通过RequestMapping(methods{GET})和RequestMapping(methods{RequestMapping::GET})两种新方式定义方法。控制器返回Arrayable自动转 Response#255控制器返回Hyperf\Utils\Contracts\Arrayable会自动转换为 Response 对象同时对返回字符串的响应对象增加text/plainContent-Type。JSON RPC 请求 ID 自动生成#256如果Hyperf\Contract\IdGeneratorInterface存在容器绑定关系JSON RPC 客户端会根据该类自动生成请求 ID 并存储在 Request attribute 中同时完善了 JSON RPC 在 TCP 协议下的服务注册及健康检查。变更使用WorkerStrategy作为默认的计划任务调度策略#247。优化 JSON RPC 的错误处理#256当方法不存在时也会返回一个标准的 JSON RPC 错误对象而不是非标准响应。修复为 grpc-server 增加默认错误处理器防止错误抛出#235。优化 OnPipeMessage 事件触发修复多个监听器获取错误数据的问题#240。修复某些环境下无法获得内网 IP 的问题#257。v1.0.5 - 2019-07-17新增响应xml格式支持#185。协程内未捕获异常默认输出 trace#202。**秒级定时任务组件#138。变更retry()函数$times参数语义变更#195表示重试的次数而不是执行的次数升级时需要重新核对传参。Container::has()对不可实例化示例返回 false#198当传递接口等不可实例化示例如接口至$container-has($interface)时返回false。AMQP 生产失败自动重试一次#199。Git 打包不再包含tests文件夹#200缩小部署包体积。修复修复LengthAwarePaginator::nextPageUrl()返回值类型约束#176。修复 Guzzle Client 代理设置不生效#188。修复多个 RPC Client 相互覆盖的问题#211。修复 Guzzle Client 的ssl_key和cert配置项不生效#212。v1.0.4 - 2019-07-08新增支持 Swoole v4.4.0#140。连接池低使用率自动释放连接#152数据库连接在低使用率时连接池会自动释放连接节约资源。**AbstractConstants::__callStatic支持自定义参数#163。变更DriverInterface::push增加$delay参数#124用于设置延迟时间同时DriverInterface::delay被标记为弃用将于 1.1 版本移除。config()函数$default默认值改为null#125。修复修复Redis::select无法正常切换数据库#110 #111。修复middlewares配置在Router::addGroup下无法正常设置#131。修复request-hasFile判断条件错误#132。修复response-redirect调整外链时无法正确生成链接#135。修复 ConsulAgent 的 URI 无法自定义设置#139。修复migrates文件夹不存在时无法生成迁移模板#148。修复处理请求时无法正确处理数组类型参数#169。修复路由不存在时 WebSocket Server 无法正确捕获异常#170。移除移除Routeroptions里的server参数#131。v1.0.3 - 2019-07-02新增**WebSocket 协程客户端及服务端#48 与 src/websocket-server。enableCache参数#51控制DefinitionSource是否启用注解扫描缓存。db:model创建模型时增加属性类型#61。**模型缓存 JSON 格式支持#65。变更移除组件对hyperf/framework的依赖#46hyperf/di、hyperf/command和hyperf/dispatcher组件不再依赖hyperf/framework组件可独立使用。修复修复引用hyperf/websocket-server组件时可能导致 HTTP Server 启动失败#55。修复方法级Middleware注解被覆盖#55。修复db:model命令对短属性处理不正确#73。修复控制器存在多层文件夹时生成的路由不正确#88。修复常量不存在Message注解时报错#101。v1.0.2 - 2019-06-25v1.0 系列的首个补丁版本主要打磨基础设施与测试体系。新增接入 Travis CI#25当时 Hyperf 共存在 426 个单元测试、1124 个断言建立了可持续的 CI 验证体系。完善Redis::connect方法参数支持#29。修复修复 HTTP Server 被 WebSocket Server 影响的问题WebSocket Server 当时尚未发布。修复代理类部分注解没有生成的问题。修复数据库连接池在单测环境下无法获取连接的问题。修复 co-phpunit 某些情况下不能按预期运行的问题。修复模型事件creating、updating等运行与预期不一致的问题。修复flushContext方法在单测环境下不能按预期运行的问题。从 v1.0 记录看 Hyperf 的演进方向纵览 v1.0 全程可以总结出几条对后续版本影响深远的演进主线协程原语逐步完备从 v1.0.4 支持 Swoole v4.4.0到 v1.0.12 的Context::override()再到 v1.0.16 的Concurrent协程并发控制协程上下文隔离与并发限制这两大基础能力在 v1.0 内全部就位。微服务与 RPC 体系成型JSON RPC 的 TCP 协议服务注册/健康检查、动态代理 RPC 客户端、gRPC 客户端异常规范化、服务注册失败自动重试共同构成了 Hyperf 微服务能力的底座。组件化拆分加速translation、snowflake、etcd等以独立组件形式落地仓库中对应src/translation、src/snowflake、src/etcd且di/command/dispatcher解除对framework的依赖为后续“按需引入”的包管理方式奠定基础。关注生产可用性Task 失败回传异常、AMQP 生产失败自动重试、MySQL 连接自动 rollback、进程命名、部署包剔除 tests 等细节处处体现工程化与可运维性考量。对正在使用或升级 Hyperf 的开发者而言本文可作为 v1.0 阶段行为变更的对照清单特别是retry()的$times语义调整、SERVER_TCP常量弃用、三个拼写错误类名重命名、DriverInterface::delay弃用这几处破坏性变更升级到 v1.1 或更高版本前务必核对。赞分享后端微服务【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/gh_mirrors/hy/hyperf点击查看免费下载相关推荐Hyperf v1.0 系列版本演进全解析从协程并发控制到分布式 ID 的组件化之路Hyperf v1.0 系列版本演进全解析从协程并发控制到分布式 ID 的组件化之路 Hyperf v1.0 是项目迈向稳定成熟的第一条主版本线。本文以 do后端Web框架微服务RPC框架异步编程Hyperf v1.0 版本演进全解析从协程并发控制到分布式 ID 的核心能力构建Hyperf v1.0 版本演进全解析从协程并发控制到分布式 ID 的核心能力构建 导读 本文基于 Hyperf 官方仓库中的 docs/zh hk/chan后端Web框架微服务RPC框架异步编程PSR-3 日志接口实战指南从 psr/log 协议到 Rector 项目的应用PSR 3 日志接口实战指南从 psr/log 协议到 Rector 项目的应用 导读 本文围绕 Rector 仓库中引入的 psr/log 组件深入讲解后端Web框架微服务RPC框架异步编程上一篇一次排障带你看懂10常用网络端口号速查表下一篇OpCore Simplify革命性的黑苹果自动化配置工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站