关于php:Hyperf-22-版发布-企业级的渐进式-PHP-协程框架

3次阅读

共计 6010 个字符,预计需要花费 16 分钟才能阅读完成。

前言

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

变更明细

  • #3334 将 LengthAwarePaginator::toArray() 的返回值更改为与 Paginator::toArray() 的统一;
  • #3550 从 kafka 删除了 brokerbootstrap_server请应用 brokersbootstrap_servers代替;
  • #3580 将切面的默认优先级更改为 0;
  • #3582 将 AMQP 的消费者标签更改为空字符串;
  • #3634 应用 Fork Process 策略替换 BetterReflection 策略;

    • #3649 在 hyperf/database 应用 gen:model 时移除了roave/better-reflection
    • #3651 在 LazyLoader 中移除了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()办法的类型提醒;
  • #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 中删除了 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

正文完
 0