Hyperf 2.2 版发布!| 企业级的渐进式 PHP 协程框架

前言

首先感谢所有 Hyperf 的支持者,从发布至今两年的时间里,我们坚持每周发布一个小版本,截止至今已经发布了超过 106 个版本,这是 Hyperf 团队传达对用户坚持和负责任精神最直接的一种方式,我们用行动来说明一切,往后我们仍将一如既往地继续保持 Hyperf 的迭代与维护。

同时我们也很荣幸看到越来越多的公司选择了 Hyperf 作为公司项目的框架来使用,并反哺了很多的 Pull Request 和 Bugfixs 给 Hyperf,当前 Hyperf 的 Contributors 已超 200 人,感谢大家一起共造了生态的繁荣,我们必定不负众望!

Thanks ALL

Thanks All Contributors

在持续迭代的过程中,我们又产生了一些新的思路。我们对这些思路进行迭代、验证,并最终沉淀到了 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 8Attributes 原生注解特性

简而言之,DI 组件作为 Hyperf 的核心组件之一,现在已经达到了一个全新的阶段,创新与实用值满格~

支持 PHP 8

Hyperf 2.2 各组件已经适配 PHP 8,注解亦兼容 PHP 8Attributes 原生注解特性。

<?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

变更明细

  • #3334LengthAwarePaginator::toArray()的返回值更改为与Paginator::toArray()的一致;
  • #3550kafka删除了brokerbootstrap_server请使用brokersbootstrap_servers代替;
  • #3580 将切面的默认优先级更改为 0;
  • #3582AMQP 的消费者标签更改为空字符串;
  • #3634 使用 Fork Process 策略替换 BetterReflection策略;
    • #3649hyperf/database使用gen:model时移除了roave/better-reflection
    • #3651LazyLoader 中移除了roave/better-reflection
    • #3654 在其他组件中移除了roave/better-reflection
  • #3676使用promphp/prometheus_client_php代替endclothing/prometheus_client_php
  • #3694更改Hyperf\CircuitBreaker\CircuitBreakerInterface为支持 PHP8
    • CircuitBreaker::inc*Counter()CircuitBreaker::incr*Counter()
    • 更改了 AbstractHandler::switch()方法的类型提示;
  • #3706PHP8 中将@Middlewares({@Middleware(FooMiddleware::class)})的书写风格更改为#[Middlewares(FooMiddleware::class)]
  • #3715 重构nacos组件,一定要重读文档;
  • #3722 删除了 config_apollo.php配置,请改用config_center.php
  • #3725 删除了 config_etcd.php配置,请改用config_center.php
  • #3730kafka中删除了brokersupdate_brokers配置;
  • #3733 删除了 zookeeper.php配置,请改用config_center.php
  • #3734 #3772 分割了nacosconfig-nacosservice-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

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 1周前 自动加精
讨论数量: 3

公司项目用了1.1跟2.0,还是很期待Hyperf一直往越来越好的方向发展,这波迭代非常给力,已经准备用到另一个项目中

1周前 评论

牛匹克拉斯,大批phper将受益

1周前 评论

很棒很棒

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!