# 基于Swoole扩展分布式全栈开发框架
PHP在Web界很出名,网站的建设大多数都是使用PHP开发的,但是不是PHP就仅仅限制于Web开发了呢?在Swoole扩展出来之前PHP似乎确实只能在Web建站上蹦跶下,不过在Swoole扩展的支持下,PHP可以说是能在高性能高并发的网络通讯中一战了。
很多人接触过Swoole又被它众多的API和功能打败了,诚然功能越强大复杂度越高,上手难度也就越大,Swoole可以定义为PHP的高性能网络库,如果想灵活自由的使用它则必须在其基础上进行开发,而开发出的框架目的就是优化众多开发者使用体验。
SwooleDistributed框架(简称SD)是基于Swoole开源的一个分布式通讯框架,发展到现在已经接近2年,不断的维护和革新,不断地添加功能和代码优化,如今的SD框架可以说是相当的强大。基于SD框架上线的产品也有不少,稳定性和性能都一致好评,框架开发者也非常的活跃,版本的更新和Bug的修复也相当的快,文档也相对的比较全面,还有些基础的视频帮助大家入门。
那么说说SD框架究竟给了开发者多大的便利呢?
首当其冲的是SD框架天然分布式的架构,基于Consul配置中心SD框架实现了服务节点的发现,通过发现SD节点,SD服务器间会俩俩相连,完成一个网状的拓扑结构,没有中心节点不依赖任何的存储结构。SD服务器间会交换同步客户端数据,每一个SD服务器都能拿到集群中客户端的所有状态。动态添加服务器和移除服务器,以及服务器健康状态的检测均能通过Consul控制台查看SD服务器也会基于这些数据进行集群拓扑的动态调整,SD框架中提供的消息API均是支持集群系统的,单机模式和集群模式对业务代码不产生任何的影响。
![](https://box.kancloud.cn/a3217603caf67ea6ad913ffd190d6087_349x292.png)
![](https://box.kancloud.cn/29dfaae2eaea85c01a10516c7f81b130_1395x805.png)
SD框架还能通过简单的配置将具体服务发布在Consul上,通过Consul实现微服务,同样微服务的发现和健康检测都是自动进行的,SD框架提供了内部的RPC方案,还提供了微服务的降级和熔断,用于保证整体服务的稳定性。我们可以访问框架的状态信息看到目前的服务分布。
![](https://box.kancloud.cn/12b70806daea7e70b6390c9eca483ed7_453x932.png)
SD封装了基于定时器的定时任务系统,并且可以通过Consul实现定时任务的动态装配。
![](https://box.kancloud.cn/198e36c5437fdae419ea7d561f184034_816x371.png)
我们都知道Swoole是基于事件驱动的扩展,是异步回调的风格,那么如果直接使用会导致代码间相互嵌套影响逻辑的写作和代码的识别,SD框架基于yield实现了协程模式,可以通过yield来实现同步的写法。
Swoole提供了异步Redis和异步Mysql客户端的库,SD框架封装了客户端连接池,可以通过连接池实现高并发的异步客户端。
```php
$result = yield $this->redis_pool->getCoroutine()->set('testroute',1);
$this->http_output->end($result);
```
Swoole是多进程模式,SD提供了用户进程模板,可以轻松的实现自定义进程,并能在进程中使用协程调用连接池,并封装了进程间的通讯。
```php
ProcessManager::getInstance()->addProcess(MyProcess::class);
ProcessManager::getInstance()->getRpcCall(ClusterProcess::class, true)->my_sendToAll($data);
```
除此之外SD框架还提供了自动Reload模块,消息分发模块,日志系统,RedisLua管理,高速缓存,分布式锁,Leader选举,对象池等。异步客户端提供了AMQP,MQTT,Http,Tcp等,基本所有的回调都提供了对应的协程风格。
![](https://box.kancloud.cn/b7be372ac36ec031cab8ce7aeed29dd4_1047x300.png)
SD框架是MVC设计风格,通过装载器装载对应的模块,熟悉MVC框架的开发者可以迅速上手。
通过Ports管理SD框架可以开启多个端口,比如通过Http给所有的Tcp客户端发消息这种需求在SD中特别的轻松,通过Pack我们可以给不同的端口开启不同的协议解析,然而在业务代码中开发者只需正常的发送信息,协议间的转换都是由框架自动进行的。通过Route我们可以自定义路由,将消息路由给不同的Controller处理,通过Task我们可以将些耗时的任务丢给Task进程异步处理。通过Event我们可以搭建自己的消息派发机制,比如实现高性能Http同步堵塞,服务间的同步信号等。通过MQTT异步客户端或者是AMQP异步客户端我们可以搭建自己的任务处理系统,通过RabbitMQ进行任务的派发。甚至是和一些开源的MQTT服务器集成,打造纯业务处理的服务器。
![](https://box.kancloud.cn/eea38590a17673b7ca36c96748735d42_494x382.png)
总之通过SD框架可以玩转的东西有很多很多,不仅可以单机,业务量上升后可以转换为集群模式,其实最重要的是更新维护频繁,作者活跃不是么。
附带SD框架的文档以及官网
[官网](http://sd.youwoxing.net/)
[文档](http://docs.youwoxing.net/)
[GitHub](https://github.com/tmtbe/SwooleDistributed)
如果你喜欢,请打个星星支持下~
- Introduction
- SD 3.X文档连接
- 导言
- 用户案例
- 基于Swoole扩展分布式全栈开发框架
- 选择SD框架助力企业开发
- 捐赠SwooleDistributed项目
- 框架性能报告
- 更新日志
- VIP服务福利
- 安装与配置
- 【推荐】全自动安装部署
- 环境要求
- 使用Composer安装/更新SD框架
- 通过Docker安装
- 代码结构
- 启动命令
- 服务器配置
- 服务器基础配置server.php
- 客户端协议配置client.php
- business.php
- log.php
- 微服务及集群配置consul.php
- fileHeader.php
- mysql.php
- redis.php
- 定时任务配置timerTask.php
- 服务器端口配置ports.php
- catCache.php
- 验证服务启动成功
- 微服务-Consul
- 日志工具-GrayLog
- 集群-Cluster
- 内核优化
- 入门教学
- 开发流程
- 开发前必读
- 开发规范
- 基本流程
- 框架入口
- Model数据模型
- Controller控制器
- 协程
- 协程基础
- 迭代器
- 调度器
- 使用协程的优势
- 通过协程的方法屏蔽异步同步的区别
- Select多路选择器
- 协程Sleep
- 通用协程方法
- 设置超时
- 设置无异常
- 设置降级函数
- initAsynPools
- dump
- 封装器与路由器
- 封装器
- sendToUid
- 路由器
- sendToUids
- 对象池
- 扩展组件
- 中间件
- Redis使用介绍
- RedisAsynPool
- Redis具体使用
- sendToAll
- RedisRoute
- Redis+Lua
- Mysql使用介绍
- MysqlAsynPool
- Mysql返回值
- 如何获取构建的mysql语句
- 如何执行一个SQL
- 如何执行事务
- stopTask
- Mysql具体使用
- 异步客户端
- Loader
- MqttClient
- model
- SdTcpRpcPool
- task
- HttpClientPool
- view
- TcpClientPool
- AMQP
- initialization
- Memory
- destory
- Cache
- Lock
- Pool
- EventDispatcher
- Process
- Cluster
- TimerTask
- Reload
- Consul
- Context
- 自定义进程
- 进程间RPC
- $http_input
- CatCache
- $http_output
- TimerCallBack
- 专题
- HTTP专栏
- TCP专栏
- 基础知识
- WebSocket专栏
- 微服务
- Consul配置
- RPC
- REST
- AMQP异步任务系统
- MQTT简易服务器
- Docker化以及资源编排
- 快速搭建公司内部统一的开发环境
- 使用HTTPS/WSS
- 订阅/发布
- 游戏专题
- 类介绍
- AppServer
- clearState
- onOpenServiceInitialization
- SwooleDistributedServer
- get_instance
- kickUid
- bindUid
- unBindUid
- coroutineUidIsOnline
- coroutineCountOnline
- setTemplateEngine
- isWebSocket
- isTaskWorker
- getSocketName
- initAsynPools
- addAsynPool
- getAsynPool
- getServerAllTaskMessage
- Controller
- onExceptionHandle
- send
- sendToUid
- sendToUids
- sendToAll
- sendToGroup
- close
- getContext
- defaultMethod
- $redis_pool
- $mysql_pool
- $request_type
- $fd
- $uid
- $client_data
- $request
- $response
- $loader
- $logger
- $server
- $config
- Model
- initialization
- destory
- View
- Task
- stopTask
- HttpInput
- postGet
- post
- get
- getPost
- getAllPostGet
- getAllHeader
- getRawContent
- cookie
- getRequestHeader
- server信息
- getRequestMethod
- getRequestUri
- getPathInfo
- HttpOutput
- setStatusHeader
- setContentType
- setHeader
- end
- setCookie
- endFile
- 单元测试