swoft对php版本要求,Swoft 2.0.3 重大更新,发布优雅的微服务治理

什么是 Swoft ?

Swoft是一款基于Swoole扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。

Swoft 通过长达三年的积累和方向的探索,把 Swoft 打造成 PHP 界的 Spring Cloud, 它是 PHP 高性能框架和微服务治理的最佳选择。

优雅的服务治理

Swoft 官方建议开发者使用 Service mesh 模式,比如 Istio/Envoy 框架,把业务和服务治理分开,但是 Swoft 也为中小型企业快速构建微服务提供了一套微服务组件。

服务注册与发现

服务熔断

服务限流

配置中心

服务注册与发现

服务注册与发现,需要用到 Swoft 官方提供的swoft-consul组件,如果其它第三方也类似。

注册与取消服务

监听SwooleEvent::START事件,注册服务

/**

* Class RegisterServiceListener

*

* @since 2.0

*

* @Listener(event=SwooleEvent::START)

*/

classRegisterServiceListenerimplementsEventHandlerInterface{

/**

* @Inject()

*

* @var Agent

*/

private $agent;

/**

* @param EventInterface $event

*/

public functionhandle(EventInterface$event): void{

/* @var HttpServer $httpServer */

$httpServer = $event->getTarget();

$service = [

// ....

];

$scheduler = Swoole\Coroutine\Scheduler();

$scheduler->add(function()use($service){

// Register

$this->agent->registerService($service);

CLog::info('Swoft http register service success by consul!');

});

$scheduler->start();

}

}

监听SwooleEvent::SHUTDOWN事件,取消服务

/**

* Class DeregisterServiceListener

*

* @since 2.0

*

* @Listener(SwooleEvent::SHUTDOWN)

*/

classDeregisterServiceListenerimplementsEventHandlerInterface{

/**

* @Inject()

*

* @var Agent

*/

private $agent;

/**

* @param EventInterface $event

*/

public functionhandle(EventInterface$event): void{

/* @var HttpServer $httpServer */

$httpServer = $event->getTarget();

$scheduler = Swoole\Coroutine\Scheduler();

$scheduler->add(function()use($httpServer){

$this->agent->deregisterService('swoft');

});

$scheduler->start();

}

}

服务发现

定义服务提供者

/**

* Class RpcProvider

*

* @since 2.0

*

* @Bean()

*/

classRpcProviderimplementsProviderInterface{

/**

* @Inject()

*

* @var Agent

*/

private $agent;

/**

* @param Client $client

*

* @return array

* @example

* [

* 'host:port'

* ]

*/

public functiongetList(Client$client):array{

// Get health service from consul

$services = $this->agent->services();

$services = [

];

return $services;

}

}

配置服务提供者

return [

'user' => [

'class' => ServiceClient::class,

'provider' => bean(RpcProvider::class)

// ...

]

];

服务熔断

Swoft 使用@Breaker注解实现熔断,可以在任何方法上面进行熔断操作。

/**

* Class BreakerLogic

*

* @since 2.0

*

* @Bean()

*/

classBreakerLogic{

/**

* @Breaker(fallback="funcFallback")

*

* @return string

* @throws Exception

*/

public functionfunc(): string{

// Do something

throw new Exception('Breaker exception');

}

/**

* @return string

*/

public functionfuncFallback(): string{

return 'funcFallback';

}

}

服务限流

Swoft 中使用@RateLimiter注解实现服务限流,可以在任何方法上面限流,不仅仅是控制器,且 KEY 还支持symfony/expression-language表达式。

/**

* Class LimiterController

*

* @since 2.0

*

* @Controller(prefix="limiter")

*/

classLimiterController{

/**

* @RequestMapping()

* @RateLimiter(key="request.getUriPath()", fallback="limiterFallback")

*

* @param Request $request

*

* @return array

*/

public functionrequestLimiter(Request$request):array{

$uri = $request->getUriPath();

return ['requestLimiter', $uri];

}

/**

* @param Request $request

*

* @return array

*/

public functionlimiterFallback(Request$request):array{

$uri = $request->getUriPath();

return ['limiterFallback', $uri];

}

}

配置中心

配置中心,需要用到 Swoft 官方提供的Swoft-apollo组件,如果其它第三方也类似。

声明Agent

/**

* Class AgentCommand

*

* @since 2.0

*

* @Command("agent")

*/

class AgentCommand{

/**

* @Inject()

*

* @var Config

*/

private $config;

/**

* @CommandMapping(name="index")

*/

public function index(): void{

$namespaces = [

'application'

];

while (true) {

try {

$this->config->listen($namespaces, [$this, 'updateConfigFile']);

} catch (Throwable $e) {

CLog::error('Config agent fail(%s %s %d)!', $e->getMessage(), $e->getFile(), $e->getLine());

}

}

}

/**

* @param array $data

*

* @throws ContainerException

* @throws ReflectionException

*/

public function updateConfigFile(array $data): void{

foreach ($data as $namespace => $namespaceData) {

$configFile = sprintf('@config/%s.php', $namespace);

$configKVs = $namespaceData['configurations'] ?? '';

$content = '<?phpreturn ' . var_export($configKVs, true) . ';';

Co::writeFile(alias($configFile), $content, FILE_NO_DEFAULT_CONTEXT);

CLog::info('Apollo update success!');

/** @var HttpServer $server */

$server = bean('httpServer');

$server->restart();

}

}

}

启动Agent

Agent 只需要在服务(Http/RPC/Websocket)启动前,运行即可。

php bin/swoft agent:index

更新内容

移除(Remove)

移除request->json()方法(c9e8f04)

新增(Enhancement):

新增接口依赖注入(6169f84)

新增getFile方法获取文件上传保存之后的信息(fe7e3a6)

新增restart()服务新增重启方法(2ffec37)

新增调用 1.x RPC 服务支持(30d73c3)

新增 AOP 类名匹配支持正则表达式(bc5e479)

新增 RPC Server /Http Server 中间件命名空间use错误提示(b1cec04)

新增 验证器排除属性字段unfields(b1bf44f)

新增 自动写入时间戳(dc58011)

新增 模型动作事件(dc58011)

新增 数据库迁移(26bb464)

新增 实体自动与 json 和数组互转(dc58011)

新增 模型批量更新方法batchUpdateByIds(dc58011)

修复(Fixed):

修复 cookies 设置时的一些问题,增加一些 withCookie 相关方法(b05afbb01)

修复 在console使用协程方式运行命令时,没有捕获处理错误(8a5418bf)

修复 websocket server 重启命令没有先停止旧server问题(db2d935)

修复任务返回值为null问题(a69347c)

修复 RPC Server 只有类中间件无法使用问题()204bc7f

修复 RPC Server 返回值为null问题(4d091be)

修复 Logger 和 CLog 日志等级无法覆盖和无效问题(8eb8aba)

修复 模型里面的属性不支持自定义表达式(dc58011)

更新(Update):

验证器优化,支持自定义验证规则(d959a4f)

重命名错误处理管理类ErrorHanlders为ErrorManager(f3a8f04b)

console组件的异常处理改为由error组件提供的统一处理风格 (4f47204)

console组件允许设置禁用命令组(c5a0269)

在默认的错误处理中,允许设置错误捕获级别。默认级别是E_ALL | E_STRICT(afff9029)

优化 启动ws server时同时启用了http处理功能,信息面板添加提示(83a81170)

优化 启动ws server 并同时添加rpc server启动,信息面板没有显示 rpc server信息(3d1d0d848)

扩展(Extra):

文档添加支持通过google进行搜索

新增 apollo 组件

新增 consul 组件

新增 breaker 组件

新增 limter 组件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值