• 反腐败国际合作"朋友圈"又大了! 2019-07-13
  • 前线 从一面“魔镜” 看苏宁科技集团智能化发展战略 2019-07-13
  • 身份证被盗产生不良记录 网络虚拟账号权属纠纷如何避免 2019-07-07
  • 的确,呆子七窍通了栁窍。[哈哈] 2019-06-20
  • 强国博客首页整合公告 2019-06-08
  • 西海都市报数字报刊平台 2019-05-27
  • 美国反拥枪的孩子很受伤 2019-05-25
  • C罗戴帽单骑救主 葡萄牙33战平西班牙 2019-05-25
  • 证监会去年对外公开监管信息14560条 2019-05-16
  • 中山八路总站调整12公交线 2019-05-16
  • 谢春涛:深刻把握“中国特色社会主义进入新时代”的重大意义 2019-05-09
  • 湖南一博士生举报水利局领导受贿 遭到冒牌纪委约谈 2019-05-09
  • 西安地铁唐风诗韵文化专列将于6月18日首发 2019-04-30
  • 铜梁区旧县街道:全面提升执行力 推动工作落地见效 2019-04-30
  • 上海电影节女性影人大放异彩 中生代女演员不用焦虑 2019-04-29
  • Swoft 2.0.3 重大更新,发布优雅的微服务治理

    stelin
     stelin
    发布于 2019年07月09日
    收藏 14

    什么是 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)
    • 重命名错误处理管理类 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 组件

    资源

    本站文章除注明转载外,均为本站原创或编译?;队魏涡问降淖?,但请务必注明出处,尊重他人劳动共创开源社区。
    转载请注明:文章转载自 OSCHINA 社区 广东十一选五推荐号
    本文标题:Swoft 2.0.3 重大更新,发布优雅的微服务治理
    加载中

    精彩评论

    Q471155350
    Q471155350
    PHP中的spring cloud
    Sakuraovq
    Sakuraovq
    更新太勤劳啦 给力的很 官方大大辛苦了
    Inhere
    Inhere
    ???? 支持支持!
    jekywong
    jekywong
    非常给力

    最新评论(5

    Q471155350
    Q471155350
    PHP中的spring cloud
    p
    phper08
    Gitee的链接错了 @stelin
    Sakuraovq
    Sakuraovq
    更新太勤劳啦 给力的很 官方大大辛苦了
    Inhere
    Inhere
    ???? 支持支持!
    jekywong
    jekywong
    非常给力
    返回顶部
    顶部
  • 反腐败国际合作"朋友圈"又大了! 2019-07-13
  • 前线 从一面“魔镜” 看苏宁科技集团智能化发展战略 2019-07-13
  • 身份证被盗产生不良记录 网络虚拟账号权属纠纷如何避免 2019-07-07
  • 的确,呆子七窍通了栁窍。[哈哈] 2019-06-20
  • 强国博客首页整合公告 2019-06-08
  • 西海都市报数字报刊平台 2019-05-27
  • 美国反拥枪的孩子很受伤 2019-05-25
  • C罗戴帽单骑救主 葡萄牙33战平西班牙 2019-05-25
  • 证监会去年对外公开监管信息14560条 2019-05-16
  • 中山八路总站调整12公交线 2019-05-16
  • 谢春涛:深刻把握“中国特色社会主义进入新时代”的重大意义 2019-05-09
  • 湖南一博士生举报水利局领导受贿 遭到冒牌纪委约谈 2019-05-09
  • 西安地铁唐风诗韵文化专列将于6月18日首发 2019-04-30
  • 铜梁区旧县街道:全面提升执行力 推动工作落地见效 2019-04-30
  • 上海电影节女性影人大放异彩 中生代女演员不用焦虑 2019-04-29
  • 南粤36选7第2117期 20060922至尊百家乐 陕西十一选五遗漏数据 乐彩app是真的假的 双色球2019134号码查询 福建体育彩票官方网站 体彩7星彩第18115期开奖结果 老版横财富 彩票如何准确判断蓝球 七星彩走势图带连线图 中国福彩中心双色球 德州扑克培训大师 田野大乐透 篮球规则大全 三肖中特九州大帝