# 基于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均是支持集群系統的,單機模式和集群模式對業務代碼不產生任何的影響。


SD框架還能通過簡單的配置將具體服務發布在Consul上,通過Consul實現微服務,同樣微服務的發現和健康檢測都是自動進行的,SD框架提供了內部的RPC方案,還提供了微服務的降級和熔斷,用于保證整體服務的穩定性。我們可以訪問框架的狀態信息看到目前的服務分布。

SD封裝了基于定時器的定時任務系統,并且可以通過Consul實現定時任務的動態裝配。

我們都知道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等,基本所有的回調都提供了對應的協程風格。

SD框架是MVC設計風格,通過裝載器裝載對應的模塊,熟悉MVC框架的開發者可以迅速上手。
通過Ports管理SD框架可以開啟多個端口,比如通過Http給所有的Tcp客戶端發消息這種需求在SD中特別的輕松,通過Pack我們可以給不同的端口開啟不同的協議解析,然而在業務代碼中開發者只需正常的發送信息,協議間的轉換都是由框架自動進行的。通過Route我們可以自定義路由,將消息路由給不同的Controller處理,通過Task我們可以將些耗時的任務丟給Task進程異步處理。通過Event我們可以搭建自己的消息派發機制,比如實現高性能Http同步堵塞,服務間的同步信號等。通過MQTT異步客戶端或者是AMQP異步客戶端我們可以搭建自己的任務處理系統,通過RabbitMQ進行任務的派發。甚至是和一些開源的MQTT服務器集成,打造純業務處理的服務器。

總之通過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
- 單元測試