前言
首先感谢所有 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。