设为首页 收藏本站
查看: 1357|回复: 0

[软件发布] SwooleDistributed v1.2 发布,分布式通讯框架

[复制链接]

尚未签到

发表于 2016-10-28 05:54:46 | 显示全部楼层 |阅读模式
欢迎加入运维网交流群:263444886  
  SwooleDistributed v1.2 发布了。
  更新内容:
  

  •   完善协程,协程中允许使用异常。
  •   controller中添加了异常的回调,方便统一处理异常回复客户端。
  swoole 分布式通讯框架
  开发交流群:569037921
文档

  •   https://tmtbe.gitbooks.io/swooledistributed/content/
特性

  •   优秀的框架(MVC)设计,丰富的支持极大加快开发速度
      
  •   通过开启不同端口同时支持TCP和HTTP,同一逻辑处理不同协议
      
  •   全异步支持,无需手动处理连接池,异步redis,异步mysql,mysql语法构建器,支持异步mysql事务,异步httpclient,效率出众
      
  •   协程模式全支持,异步redis,异步mysql,异步httpclient,异步task,全部都提供了协程模式,业务代码摆脱处处回调的困扰(不是swoole2.0,php7同样支持)
      
  •   支持协程嵌套,支持协程内异常处理(和正常逻辑用法一样)
      
  •   额外提供了protobuf完整RPC实例,轻松使用protobuf
      
  •   天然分布式的支持,一台机器不够零配置,零代码修改完成高效分布式系统的搭建
      
  •   完善详细的文档,还有实例代码,轻松掌握
      
  •   线上项目打造维护,不断优化与改进
化繁为简,从零开始的框架设计
前言
  经历了一个又一个项目,也接触了很多的PHP框架,我欣赏CI的简约,又贪婪swoole的效率,我将CI和swoole很草率的结合到了一起。起初呢风平浪静,慢慢的就遇到了不少的瓶颈,毕竟CI的设计理念还是贴合FPM模式,如何更加得心应手的使用swoole,同时追求开发上和运行时的效率呢,最主要的还是要方便扩展,就萌生了SwooleDistributed这个开源框架的想法。
  在SwooleDistributed发布之前,开源社区还没有过针对swoole的分布式框架,起初的目的并不是一个完整的应用框架,而是一个简单的分布式通讯框架,后来需求变多了,框架也就慢慢的丰满了。
  分布式
  分布式这东西并不是有多神秘,但一个框架在基础构思中就包含分布式的思想,那无疑方便对以后的扩展。分布式系统涉及到多太物理机之间的调控,配置起来也是较为麻烦,SwooleDistributed使用了内网发现的技术手段,自动发现集群环境的物理机进行连接,简化了配置,甚至达到了无配置。
  SwooleDistributed在前期可以控制成本的使用单机模式进行部署,也可以在后期进行水平扩展,对逻辑代码无需任何的改动。
  你所需要的就是多增加物理机,跑上服务器就行啦。
  MVCT
  解决了底层的分布式通讯问题,接下来就是MVC结构的搭建了,这部分借鉴了CI的设计,使用Loader模块加载对应的Model,通过路由访问对应的Controller。相信使用过CI框架的工程师很容易就上手。
  此外引入了Swoole独特的Task,将swoole的Task进行了封装优化,更加易于使用。
//TestTask.php  
class TestTask extends Task
  
{
  
    public function test()
  
    {
  
        print_r("test timer task\n");
  
    }
  
}
  
//TestController.php
  
class TestController extends Controller
  
{
  
  public function http_test_task()
  
    {
  
        $task = $this->loader->task('TestTask');
  
        $task->test();
  
        $result = yield $task->coroutineSend();
  
        $this->http_output->end($result);
  
    }
  
}
  通过定时器和Task的结合,开发者可以很方便的制作定时任务,而这一切只需要简单的配置即可。
/**  
 * timerTask定时任务
  
 * (必填)task名称 task_name
  
 * (必填)执行task的方法 method_name
  
 * (选填)执行区间 [start_time,end_time) 格式: Y-m-d H:i:s 没有代表一直执行
  
 * (必填)执行间隔 interval_time 单位: 秒
  
 * (选填)最大执行次数 max_exec,默认不限次数
  
 */
  
$config['timerTask'][] = [
  
    'task_name'=>'TestTask',
  
    'method_name'=>'test',
  
    'start_time'=>'Y-m-d 00:00:00',
  
    'end_time'=>'Y-m-d 23:59:59',
  
    'interval_time'=>'2',
  
];
异步连接池
  swoole提供了redis和mysql的异步客户端,大大提高的服务端的效率,但问题又来了,如果使用异步客户端,就必须维护一个异步连接池。
  SwooleDistributed设计了一个通用的连接池模块,通过这个模块可以快捷简单的创建客户端的连接池,不仅如此redis和mysql的连接池早已封装在核心代码中,开发者只需调用其中的Api无需关注连接池的维护。
  swoole的异步redis客户端是基于hredis和我们通常使用的redis扩展不一样,在使用批量方法时回调的值是有所区别,SwooleDistributed屏蔽了这一点不同之处,使用起来和平常的redis扩展一致。
  异步的mysql客户端事务通常是比较难写的,SwooleDistributed同样针对mysql事务进行了封装,使用起来也非常的方便。
  此外mysql也提供了一个语法构建器,可以简单方便的构建mysql语法。
public function test_coroutine()  
    {
  
        $mySqlCoroutine = $this->mysql_pool->dbQueryBuilder->select('*')->from('account')->where('uid', 10303)->coroutineSend();
  
        $result = yield $mySqlCoroutine;
  
        $redisCoroutine = $this->redis_pool->coroutineSend('get', 'test');
  
        $result = yield $redisCoroutine;
  
        return $result;
  
    }
协程
  之前我去过很多家公司,交流的过程中发现有些公司使用php做短连接,用golang做长连接,我问他们为何不用swoole呢?回答都是异步回调太难写了。 确实异步回调写起来很不好看,可能会有多层回调的嵌套,复杂点的代码非常的难看,swoole2.0已经使用了协程,但首先是新功能稳定性尚且不知,其次不支持php7,于是我呢就对现有框架进行了一次大的调整,通过yield关键字实现了全异步的协程风格。使用起来非常的简单,和一般的写法没有什么太大的区别,只要遵循一个原则,涉及到异步的地方加上yield关键字就可以。
/**  
     * 协程测试
  
     */
  
    public function http_testCoroutine()
  
    {
  
        $this->testModel = $this->loader->model('TestModel', $this);
  
        $result = yield $this->testModel->test_coroutine();
  
        $this->http_output->end($result);
  
    }
  协程之间支持嵌套,也支持throw Exception异常捕获,总之用起来和同步的写法基本一致。 协程之间不存在堵塞,也可以通过控制yield的位置调整send和rev的调度策略。 比如:
$mySqlCoroutine = $this->mysql_pool->dbQueryBuilder->select('*')->from('account')->where('uid', 10303)->coroutineSend();  
$result = yield $mySqlCoroutine;
  
$redisCoroutine = $this->redis_pool->coroutineSend('get', 'test');
  
$result = yield $redisCoroutine;
  这段代码调度策略是mysql_send->mysql_rev->redis_send->redis_rev;
  我们调整下yield的位置
$mySqlCoroutine = $this->mysql_pool->dbQueryBuilder->select('*')->from('account')->where('uid', 10303)->coroutineSend();  
$redisCoroutine = $this->redis_pool->coroutineSend('get', 'test');
  
$result = yield $mySqlCoroutine;
  
$result = yield $redisCoroutine;
  这段代码调度策略变成了mysql_send->redis_send->mysql_rev->redis_rev;
同时支持TCP和HTTP
  这样你就可以开启一个服务同时处理TCP和HTTP请求了,代码复用率就高很多了,同时SwooleDistributed还提供了一些策略,方便隔离http和tcp的路由请求。
Protobuf
  提供了一个Protobuf的RPC实例,其实你可以通过框架的Pack和Route模块自由扩展,提供这个例子无非是我自己项目的需要顺便就发出来了,当然你可以自己实现。
其他
  很多细小的功能拉,去这看看吧https://www.gitbook.com/book/tmtbe/swooledistributed。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-292151-1-1.html 上篇帖子: 代码生成工具 bboss v4.10.8 发布 下篇帖子: WebMIS 2016
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表