前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swoft 2.0.3 重大更新,发布优雅的微服务治理

Swoft 2.0.3 重大更新,发布优雅的微服务治理

作者头像
桶哥
发布2019-07-17 16:01:11
8290
发布2019-07-17 16:01:11
举报
文章被收录于专栏:PHP饭米粒PHP饭米粒

什么是 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)
 */
class RegisterServiceListener implements EventHandlerInterface
{
 /**
     * @Inject()
     *
     * @var Agent
     */
 private $agent;
 /**
     * @param EventInterface $event
     */
 public function handle(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)
 */
class DeregisterServiceListener implements EventHandlerInterface
{
 /**
     * @Inject()
     *
     * @var Agent
     */
 private $agent;
 /**
     * @param EventInterface $event
     */
 public function handle(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()
 */
class RpcProvider implements ProviderInterface
{
 /**
     * @Inject()
     *
     * @var Agent
     */
 private $agent;
 /**
     * @param Client $client
     *
     * @return array
     * @example
     * [
     *     'host:port'
     * ]
     */
 public function getList(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()
 */
class BreakerLogic
{
 /**
     * @Breaker(fallback="funcFallback")
     *
     * @return string
     * @throws Exception
     */
 public function func(): string
 {
 // Do something
 throw new Exception('Breaker exception');
 }
 /**
     * @return string
     */
 public function funcFallback(): string
 {
 return 'funcFallback';
 }
}

服务限流

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

/**
 * Class LimiterController
 *
 * @since 2.0
 *
 * @Controller(prefix="limiter")
 */
class LimiterController
{
 /**
     * @RequestMapping()
     * @RateLimiter(key="request.getUriPath()", fallback="limiterFallback")
     *
     * @param Request $request
     *
     * @return array
     */
 public function requestLimiter(Request $request): array
 {
        $uri = $request->getUriPath();
 return ['requestLimiter', $uri];
 }
 /**
     * @param Request $request
     *
     * @return array
     */
 public function limiterFallback(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   = '<?php return ' . 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)
  • 重命名错误处理管理类 ErrorHanldersErrorManager (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 组件

资源

  • Gitee: https://gitee.com/swoft/swoft
  • GitHub: https://github.com/swoft-cloud/swoft
  • 官网:https://www.swoft.org
  • 文档:https://www.swoft.org/docs
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP饭米粒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 Swoft ?
  • 优雅的服务治理
    • 服务注册与发现
      • 注册与取消服务
      • 服务发现
    • 服务限流
      • 配置中心
        • 声明Agent
        • 启动Agent
    • 更新内容
    • 资源
    相关产品与服务
    微服务引擎 TSE
    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档