4

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

 2 years ago
source link: https://segmentfault.com/a/1190000040369204
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

首先感谢所有 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 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK