Hyperf 2.2 版发布!| 企业级的渐进式 PHP 协程框架
Hyperf 2.2 版本发布!
前言
首先感谢所有 Hyperf 的支持者,从发布至今两年的时间里,我们坚持每周发布一个小版本,截止至今已经发布了超过 106 个版本,这是 Hyperf 团队传达对用户坚持和负责任精神最直接的一种方式,我们用行动来说明一切,往后我们仍将一如既往地继续保持 Hyperf 的迭代与维护。
同时我们也很荣幸看到越来越多的公司选择了 Hyperf 作为公司项目的框架来使用,并反哺了很多的 Pull Request 和 Bugfixs 给 Hyperf,当前 Hyperf 的 Contributors 已超 200 人,感谢大家一起共造了生态的繁荣,我们必定不负众望!
Thanks ALL
在持续迭代的过程中,我们又产生了一些新的思路。我们对这些思路进行迭代、验证,并最终沉淀到了 2.2 版本中,今天很荣幸向大家公布,Hyperf 2.2 版本发布!
主要功能迭代
DI 底层实现重构
在 2.0-2.1 版本时,为了实现 AOP 作用于非 DI 管理的对象(如 new
关键词实例化的对象时),底层实现采用了BetterReflection
组件来实现相关功能,带来新的编程体验的同时,也还是存在一些此前未攻克的问题,如下:
- 无扫描缓存时项目启动很慢
- 特殊场景下 Inject 和 Value 不生效
BetterReflection
尚未支持 PHP 8 (截止发版时)
在新的版本里,我们弃用了 BetterReflection
的应用,采用了 子进程扫描的方式
来解决此前的问题,以上这些痛点,我们全部解决了~
用正向的角度来描述这个功能的变更:
- 无缓存下,启动时间缩减一个数量级,以笔者所在公司的某个巨型项目为例,原启动时间长达 5分钟,新版本只需 10秒!
- 丰富了
Inject
注解注入的适用场景,但可惜仍有一种情况下无效(父类private
属性注入时失效,与此前版本表现一致),我们会继续努力攻克该场景的实现 - 支持
PHP 8
及Attributes
原生注解特性
简而言之,DI 组件作为 Hyperf 的核心组件之一,现在已经达到了一个全新的阶段,创新与实用值满格~
支持 PHP 8
Hyperf 2.2 各组件已经适配 PHP 8
,注解亦兼容 PHP 8
的 Attributes
原生注解特性。
<?php namespace App\Controller; #[Controller] class IndexController { #[GetMapping("/test")] public function index() { ... } }
需要注意的是,同一区域同时使用 注解(Annotations)
和 原生注解(Attributes)
,底层将 忽略注解(Annotations) (即使注解不同)
<?php namespace App\Controller; /** * @Controller * 同一区域同时使用,注解(Annotations) 无效 */ #[Middleware(TestMiddleware::class)] class IndexController { // 单独使用,可以支持 #[Inject] protected StdoutLoggerInterface $logger; /** * 单独使用,可以支持 * @GetMapping("/test") */ public function index() { ... } }
需要注意的是,框架虽然已经支持 PHP8
,但是升级时仍需要自行确认业务代码和依赖的第三方组件是否满足 PHP 8 不兼容变更 。
可重复注解
在之前版本中,同一区域相同Annotation
无法重复使用:
/** * @AutoController() * @Middleware(FooMiddleware::class) * @Middleware(BarMiddleware::class) * 重复 @Middleware 只有一个生效! */ class IndexController { }
此前,重复使用相同注解只能通过注解嵌套方式实现:
/** * @AutoController() * @Middlewares({ * @Middleware(FooMiddleware::class) * @Middleware(BarMiddleware::class) * }) * 非常繁琐,增加额外心智负担 */ class IndexController { }
在 2.2 中,我们实现了可重复注解:
<?php namespace App\Controller; #[AutoController] #[Middleware(FooMiddleware::class)] #[Middleware(BarMiddleware::class)] class IndexController { }
当用户自定义的注解需要可重复时,将注解的父类更改为 Hyperf\Di\Annotation\AbstractMultipleAnnotation
即可,具体可参考框架 Middleware
注解的实现。
配置中心完全重构
在此前的版本,配置中心的实现是由各个零散的组件自行实现的,各组件的实现参差不一,都有一些细节实现的区别,各组件间的代码重合度也是非常高的,在 2.2 版本,我们 完全重构 了相关组件,增加了 hyperf/config-center
组件,该组件将作为配置中心的统一接入层和抽象层,通过结合其他配置中心的 Driver 组件来实现相关储存引擎的能力驱动,如 hyperf/config-center
+ hyperf/config-apollo
组件结合使用的方式来实现对 Apollo 配置中心的使用,其他驱动只需更换对应的驱动即可。这样的改造使我们极大的减少了驱动的代码量,现在简单几行代码几个类就能完成一个新的驱动的接入了。
在升级使用时,注意相关配置文件的变更,新版本将由 config/autoload/config_center.php
配置文件来管控所有相关信息,初次创建该文件可通过运行 php bin/hyperf.php vendor:publish hyperf/config-center
命令生成。
服务治理组件重构
在此前的版本,hyperf/service-governance
组件跟配置中心所面临的问题也是一致的,我们在此版本也做了与配置中心类似的改变,比如通过 hyperf/service-governance
+ hyperf/service-governance-nacos
组件来实现 nacos 作为服务中心的使用。
在升级使用时,注意相关配置文件的变更,新版本将由 config/autoload/services.php
配置文件来管控所有相关信息,内部结构有一定的改变,初次创建该文件可通过运行 php bin/hyperf.php vendor:publish hyperf/service-governance
命令生成。
Nacos 组件完全重构
重要:一定要重读该组件文档!!!
我们对 Nacos 组件做了 完全的重构,使该组件的代码实现、结构分层和 API 更加的合理,并对原来整合在一个组件内的配置中心逻辑、服务中心逻辑和客户端代码进行了拆分,如上面两个主要迭代功能介绍所示。
具体使用到 Nacos 组件的一定要重新阅读新的文档,并根据新的文档指示来使用。
AMQP 组件连接机制重构
我们发现使用 AMQP 组件的用户非常的多,而作为一个消息队列组件,其性能速度对系统的削峰效果和消息投递/消费速度影响是非常大的,我们通过 协程通道(Channel)
实现了一个多路复用的机制,使该组件的消息投递性能提升了将近一倍!在性能提升的同时,还使得客户端与服务端间的连接稳定性得到了提升。
该组件升级后会直接切换为新的连接机制,无需做任何调整。
以下是抽取压测对比中的关键信息:
非 Confirm 模式投递
2.1 版本
连接池内最大数量设置为 10
$ ab -c 32 -n 10000 http://127.0.0.1:9501/ Requests per second: 5340.80 [#/sec] (mean) Time per request: 5.992 [ms] (mean) Time per request: 0.187 [ms] (mean, across all concurrent requests) Transfer rate: 928.38 [Kbytes/sec] received
2.2 版本
设置 2 个多路复用的连接
$ ab -c 32 -n 10000 -k http://127.0.0.1:9501/ Requests per second: 9101.44 [#/sec] (mean) Time per request: 3.516 [ms] (mean) Time per request: 0.110 [ms] (mean, across all concurrent requests) Transfer rate: 1626.53 [Kbytes/sec] received
Confirm 模式投递
2.1 版本
连接池内最大数量设置为 10
$ ab -c 32 -n 5000 -k http://127.0.0.1:9501/ Requests per second: 797.73 [#/sec] (mean) Time per request: 40.114 [ms] (mean) Time per request: 1.254 [ms] (mean, across all concurrent requests) Transfer rate: 142.56 [Kbytes/sec] received
2.2 版本
设置 2 个多路复用的连接
$ ab -c 32 -n 5000 -k http://127.0.0.1:9501/ Requests per second: 1595.94 [#/sec] (mean) Time per request: 20.051 [ms] (mean) Time per request: 0.627 [ms] (mean, across all concurrent requests) Transfer rate: 285.21 [Kbytes/sec] received
3 个 Incubator 组件毕业进入主库
自从采用 Incubator 机制来孵化组件后,产生了大量的新组件,很荣幸在 2.2 版本时,有 3 个 Incubator 组件毕业进入主库,这也意味着这些组件进入了生产可用阶段~
以下为各个毕业的组件及其简介
hyperf/dag
该组件是一个轻量级有向无环图 (Directed Acyclic Graph) 任务编排库,通过该组件可以很轻松的完成任务的编排和运行。
hyperf/rpc-multiplex
该组件是一个实现多路复用的 RPC 协议连接组件,通过使用该库可以得到性能更高和连接更稳定的 RPC 功能;
hyperf/rpn
该组件是一个 逆波兰表示法 的实现组件,RPN
是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。通过该组件可以完成 逆波兰表达式 的解析。
依赖升级
- 升级
friendsofphp/php-cs-fixer
为^3.0
; - 升级
psr/container
为^1.0|^2.0
; - 升级
egulias/email-validator
为^3.0
; - 升级
markrogoyski/math-php
为^2.0
; - 升级
league/flysystem
为^1.0|^2.0
;
依赖项已更改
- #3577
domnikl/statsd
废弃,不再维护。作者建议改用slickdeals/statsd
包;
即将弃用 API
- #3636
Hyperf\Utils\Resource
将在v2.3
中被弃用,请改用Hyperf\Utils\ResourceGenerator
;
变更明细
- #3334 将
LengthAwarePaginator::toArray()
的返回值更改为与Paginator::toArray()
的一致; - #3550 从
kafka
删除了broker
和bootstrap_server
,请使用brokers
和bootstrap_servers
代替; - #3580 将切面的默认优先级更改为 0;
- #3582 将
AMQP
的消费者标签更改为空字符串; - #3634 使用
Fork Process
策略替换BetterReflection
策略; - #3676使用
promphp/prometheus_client_php
代替endclothing/prometheus_client_php
; - #3694更改
Hyperf\CircuitBreaker\CircuitBreakerInterface
为支持PHP8
;- 改
CircuitBreaker::inc*Counter()
到CircuitBreaker::incr*Counter()
; - 更改了
AbstractHandler::switch()
方法的类型提示;
- 改
- #3706 在
PHP8
中将@Middlewares({@Middleware(FooMiddleware::class)})
的书写风格更改为#[Middlewares(FooMiddleware::class)]
; - #3715 重构
nacos
组件,一定要重读文档; - #3722 删除了
config_apollo.php
配置,请改用config_center.php
; - #3725 删除了
config_etcd.php
配置,请改用config_center.php
; - #3730 从
kafka
中删除了brokers
和update_brokers
配置; - #3733 删除了
zookeeper.php
配置,请改用config_center.php
; - #3734 #3772 分割了
nacos
为config-nacos
和service-governance-nacos
; - #3734 重命名
nacos-sdk
组件名为nacos
; - #3737 重构配置中心和配置驱动程序
- 添加
AbstractDriver
并将重复的代码并合到抽象类中 - 添加
PipeMessageInterface
以统一配置获取进程的消息结构
- 添加
- #3817 #3818 从 service-governance 组件中分离出 service-governance-consul 组件;
更多
升级指南
我们提供了详尽的升级指南,请查阅官方文档 - 2.2 升级指南
官网及交流
Github 👈👈👈👈👈 点 Star 支持我们
Gitee 码云 👈👈👈👈👈 点 Star 支持我们
Hyperf 官网
Hyperf 文档
Hyperf 交流群: 862099724(已满)
Hyperf 交流 2 群: 811414891(已满)
Hyperf 交流 3 群: 589051831
钉钉群 一群: 34538367(已满)
钉钉群 二群: 34488757

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
趣说开源|为什么要参与到开源社区中?
你无法想象开源项目离你有多近。它早已融入你生活的方方面面,从办公室到家里,从健身房到餐厅等等。 俗话说:“开源项目属于我们,而不是我”,这就解释了为什么这些项目很受欢迎,以至于连知名的商业巨头都将开源计划纳入他们的商业计划中。但是对于普通人来说,到底是否有必要又是否有可能加入开源社区呢?它的魅力何在? 在这篇文章中,我将通过介绍优点和缺点来回答这些问题。我们都知道,奖励比惩罚更好,那我们就先从奖励开始说起。 01掌握一项新技能 你是否厌倦了每天疏远和重复的工作?你是否想学习新的、令人兴奋的、有价值的技能? 在线课程(MOOCs)或书籍绝对是提高你的技能和扩展你的知识的好方法。然而,我想推荐另一种高效,有趣的方法,那就是加入相关的开源社区,在生产环境中解决实际问题的同时学习新技能。这些活跃的开源项目之所以如此受欢迎,是因为它们帮助用户解决实际问题并满足他们的需求。通过参与开源社区,你学习到的是真正能解决现实生产上的实战知识,而不是书本上的条条框框与课本理论。 让我们以 Apache ShardingSphere 为例。Apache ShardingSphere 受到了全世界程序员和学生的...
- 下一篇
木兰语言 0.0.22 继续 py 转木兰;探路 py 3.8
之前复现了一部分由 Python 自动转换为木兰代码的功能,运行如下命令就能输出木兰代码:$ 木兰 -兰 某某.py,但尚缺失一些基本语法支持,该功能尚未达到实用程度。 这两天将插入和冒泡排序算法为目标,按需复原了相关部分,达成效果如下(左 Python 右木兰): 下面打算以 猜数字例程 为目标继续补完转换功能。 另外,前几天有位在项目首页加了 binder 在线环境,这才知道有这样的免费服务: 还干了件闲事。木兰重现项目伊始时,就确认了按原始实现基于 python3.7,毕竟离 2023 年还有段时间。不过,现在积攒了这么些测试用例,忍不住想看看如果以后需要升级到 Python 3.8 的话有多大工作量。结果是 添了一处代码,就通过了语法功能部分的测试用例,不过有下面几个语法树相关报警待研究: 每年应付一次 Python 大版本升级导致的语法树变动,似乎还可以接受。先搁着,需要的话再说吧。 附:代码量统计 主要部分的代码行数统计,格式为:上次->现在。 木兰代码量 3206 -> 3259 运行环境,实现与测试大部为木兰代码:582 木兰测试用例,包括部分实用小程序(如...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能