摘要:項目中執行以下命令即可三應用在中結合消息隊列可參考使用隊列來完成消息推送。五配置如何創建一個服務,使得客戶端可以用過協來連接通訊,比如在微信小程序中連接服務端。微信小程序要求連接時不帶端口號,也就是端口只能是。
一、簡述
GatewayWorker基于Workerman開發的一個項目框架,用于快速開發TCP長連接應用,例如app推送服務端、即時IM服務端、游戲服務端、物聯網、智能家居等等二、安裝GatewayWorker使用經典的Gateway和Worker進程模型。Gateway進程負責維持客戶端連接,并轉發客戶端的數據給BusinessWorker進程處理,BusinessWorker進程負責處理實際的業務邏輯(默認調用Events.php處理業務),并將結果推送給對應的客戶端。Gateway服務和BusinessWorker服務可以分開部署在不同的服務器上,實現分布式集群。
GatewayWorker提供非常方便的API,可以全局廣播數據、可以向某個群體廣播數據、也可以向某個特定客戶端推送數據。配合Workerman的定時器,也可以定時推送數據。
GatewayWorker 安裝在LInux服務器上:
下載地址:GatewayWorker
1、下載 demo
2、命令行運行 unzip GatewayWorker.zip 解壓縮GatewayWorker.zip
3、命令行運行 cd GatewayWorker 進入GatewayWorker目錄
4、命令行運行 php start.php start 啟動 GatewayWorker
5、新開幾個命令行窗口運行 telnet 127.0.0.1 8282,輸入任意字符即可聊天(非本機測試請將127.0.0.1替換成實際ip)。
注意:如果telnet超時請檢查服務器防火墻(iptables)
這里啟動的是GatewayWorker的默認端口,要是需要更改要改以下三個文件:
GatewayWorker/Applications/YourApp/start_register.php
// register 必須是text協議;這個端口要保持一致,根據項目自定義 $register = new Register("text://0.0.0.0:1238");
GatewayWorker/Applications/YourApp/start_businessworker.php
// bussinessWorker 進程 $worker = new BusinessWorker(); // worker名稱,根據不同的項目自定義 $worker->name = "YourAppBusinessWorker"; // bussinessWorker進程數量 $worker->count = 4; // 服務注冊地址; 注意這個端口要保持一致,不同的項目可以自定義 $worker->registerAddress = "127.0.0.1:1238";
GatewayWorker/Applications/YourApp/start_gateway.php
// gateway 進程,這里使用Text協議,可以用telnet測試 $gateway = new Gateway("tcp://0.0.0.0:8282"); // gateway名稱,status方便查看 $gateway->name = "YourAppGateway"; // gateway進程數 $gateway->count = 4; // 本機ip,分布式部署時使用內網ip $gateway->lanIp = "127.0.0.1"; // 內部通訊起始端口,假如$gateway->count=4,起始端口為4000 // 則一般會使用4000 4001 4002 4003 4個端口作為內部通訊端口 ,不同項目開啟不同端口 $gateway->startPort = 2900; // 服務注冊地址;端口保持一致,項目自定義 $gateway->registerAddress = "127.0.0.1:1238"; // 服務端向客戶端發送心跳數據的時間間隔 單位:秒。如果設置為0代表不發送心跳檢測 //$gateway->pingInterval = 10; //客戶端連續$pingNotResponseLimit次$pingInterval時間內不回應心跳則斷開鏈接。 //如果設置為0代表客戶端不用發送回應數據,即通過TCP層面檢測連接的連通性(極端情況至少10分鐘才能檢測到) //$gateway->pingNotResponseLimit = 2; // 要發送的心跳請求數據,心跳數據是任意的,只要客戶端能識別即可 //$gateway->pingData = "{"type":"ping"}";
注意:需要客戶端與服務端保持連接不被斷開,可以開啟心跳檢查定時發送心跳數據。
服務管理
在GatewayWorker根目錄下有一個start.php文件:
php start.php start 啟動服務 (php start.php start -d 以daemon啟動) php start.php stop 停止服務 php start.php restart 重新啟動 (-d 以daemon啟動) php start.php reload 平滑重啟 php start.php status 服務狀態
vagrant@homestead:~/code/GatewayWorker$ php start.php status Workerman[start.php] status ----------------------------------------------GLOBAL STATUS---------------------------------------------------- Workerman version:3.5.10 PHP version:7.2.3-1+ubuntu16.04.1+deb.sury.org+1 start time:2018-06-08 14:00:54 run 0 days 2 hours load average: 0, 0, 0 event-loop:WorkermanEventsSelect 3 workers 9 processes worker_name exit_status exit_count YourAppBusinessWorker 0 0 YourAppGateway 0 0 Register 0 0 ----------------------------------------------PROCESS STATUS--------------------------------------------------- pid memory listening worker_name connections send_fail timers total_request qps status 4693 2M none YourAppBusinessWorker 5 0 0 3 0 [idle] 4694 2M none YourAppBusinessWorker 5 0 0 3 0 [idle] 4695 2M none YourAppBusinessWorker 5 0 0 156 0 [idle] 4696 2M none YourAppBusinessWorker 5 0 0 3 0 [idle] 4697 2M tcp://0.0.0.0:8282 YourAppGateway 8 0 0 226 0 [idle] 4698 2M tcp://0.0.0.0:8282 YourAppGateway 8 0 0 226 0 [idle] 4699 2M tcp://0.0.0.0:8282 YourAppGateway 8 0 0 226 0 [idle] 4700 2M tcp://0.0.0.0:8282 YourAppGateway 8 0 0 378 0 [idle] 4701 2M text://0.0.0.0:1238 Register 8 0 0 51 0 [idle] ----------------------------------------------PROCESS STATUS--------------------------------------------------- Summary 18M - - 60 0 0 1272 0 [Summary]
注意:修改代碼要重啟服務。
GatewayClient安裝下項目中
原則:
現有mvc框架項目與GatewayWorker獨立部署互不干擾所有的業務邏輯都由網站頁面post/get到mvc框架中完成
GatewayWorker不接受客戶端發來的數據,即GatewayWorker不處理任何業務邏輯,GatewayWorker僅僅當做一個單向的推送通道
僅當mvc框架需要向瀏覽器主動推送數據時才在mvc框架中調用Gateway的API(GatewayClient)完成推送
當然,這只是官方推薦的結合方式,也不是絕對的。開發者可以自由變化選擇結合方式以適應自己的業務需求。 當然也可以采用客戶端與GatewayWorker直接雙向通訊的方式完成業務通訊。更多參考官方手冊。
下載地址:GatewayClient。項目中執行以下命令即可:
composer require workerman/gatewayclient三、應用
在laravel中結合redis 消息隊列(可參考laravel/lumen 使用 redis隊列)來完成消息推送。
在controller中使用dispatch觸發隊列
dispatch(new YourJob($data));
在Jobs中示例:
id = $id; } public function handle() { //業務邏輯 Gateway::sendToAll(json_encode(["id" => xxx, "name" => xxx])); } }
每次改動代碼重啟隊列。supervisorctl reload四、調試
服務器端打開Telnet,不可執行Telnet命令需要安裝。
如:
vagrant@homestead:~/code/GatewayWorker$ telnet 127.0.0.1 8282 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is "^]". Hello 7f0000010b5600000001 7f0000010b5600000001 login hello 7f0000010b5600000001 said hello {"id":"35","name":"xxx"}
正常情況,會輸出你想發送的消息。
Escape character is "^]".是 Ctrl + ] 調出Telnet,輸入quit可以退出。
Workerman如何創建一個wss服務,使得客戶端可以用過wss協來連接通訊,比如在微信小程序中連接服務端。
wss協議實際是websocket+SSL,就是在websocket協議上加入SSL層,類似https(http+SSL)。 所以只需要在websocket協議的基礎上開啟SSL即可支持wss協議。
配置方式一:直接用Workerman開啟SSL:
準備工作:
1、Workerman版本不小于3.3.7
2、PHP安裝了openssl擴展
3、已經申請了證書(pem/crt文件及key文件)放在磁盤任意目錄
start_gateway.php中設置以下代碼
array( // 請使用絕對路徑 "local_cert" => "磁盤路徑/server.pem", // 也可以是crt文件 "local_pk" => "磁盤路徑/server.key", "verify_peer" => false, // "allow_self_signed" => true, //如果是自簽名證書需要開啟此選項 ) ); // 這里設置的是websocket協議(端口任意,但是需要保證沒被其它程序占用) $worker = new Worker("websocket://0.0.0.0:443", $context); $worker->name = xxx //配置名稱便于監控 // 設置transport開啟ssl,websocket+ssl即wss $worker->transport = "ssl"; $worker->onMessage = function($con, $msg) { $con->send("ok"); }; Worker::runAll();
通過以上的代碼,Workerman就監聽了wss協議,客戶端就可以通過wss協議來連接workerman實現安全即時通訊了。
測試
打開chrome瀏覽器,按F12打開調試控制臺,在Console一欄輸入(或者把下面代碼放入到html頁面用js運行)
// 證書是會檢查域名的,請使用域名連接
ws = new WebSocket("wss://域名"); ws.onopen = function() { alert("連接成功"); ws.send("tom"); alert("給服務端發送一個字符串:tom"); }; ws.onmessage = function(e) { alert("收到服務端的消息:" + e.data); };
注意:1、如果無法啟動,則一般是443端口被占用,請改成其它端口,注意改成其它端口后客戶端連接時需要帶上端口號,客戶端連接時地址類似wss://domain.com:xxx ,xxx為端口號。如果必須使用443端口請使用方法二代理的方式實現wss。
2、wss端口只能通過wss協議訪問,ws無法訪問wss端口。
3、證書一般是與域名綁定的,所以測試的時候客戶端請使用域名連接,不要使用ip去連。
4、如果出現無法訪問的情況,請檢查服務器防火墻。
5、此方法要求PHP版本>=5.6,因為微信小程序要求tls1.2,而PHP5.6以下版本不支持tls1.2。
6、微信小程序要求連接wss時不帶端口號,也就是wss端口只能是443。但是443端口一般被nginx/apache占用,此時可以考慮方法二。
配置方式二:利用nginx/apache代理wss
利用nginx/apache作為wss代理轉發給workerman(注意此方法workerman部分千萬不要設置ssl,否則將無法連接)。
通訊原理及流程是:1、客戶端發起wss連接連到nginx/apache
2、nginx/apache將wss協議的數據轉換成ws協議數據并轉發到Workerman的websocket協議端口
3、Workerman收到數據后做業務邏輯處理
4、Workerman給客戶端發送消息時,則是相反的過程,數據經過nginx/apache轉換成wss協議然后發給客戶端
nginx配置參考
前提條件及準備工作:1、假設Workerman監聽的是8282端口(websocket協議,不要用tcp)
2、已經申請了證書(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下
3、打算利用nginx開啟443端口對外提供wss代理服務(端口可以根據需要修改)
4、nginx一般作為網站服務器運行著其它服務,為了不影響原來的站點使用,這里使用地址 域名/wss 作為wss的代理入口。也就是客戶端連接地址為 wss://域名/wss
nginx配置類似如下:
server { listen 443; ssl on; ssl_certificate /etc/ssl/server.pem; ssl_certificate_key /etc/ssl/server.key; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; location /wss { proxy_pass http://127.0.0.1:8282; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header X-Real-IP $remote_addr; } # location / {} 站點的其它配置... }
測試
// 證書是會檢查域名的,請使用域名連接
ws = new WebSocket("wss://域名/wss"); ws.onopen = function() { alert("連接成功"); ws.send("tom"); alert("給服務端發送一個字符串:tom"); }; ws.onmessage = function(e) { alert("收到服務端的消息:" + e.data); };
另外為了方便測試,大家也可以使用在線測試工具,如 websocket在線測試
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28783.html
摘要:客戶端源碼服務端源碼實現實時聊天功能它是什么基于的有前端有后端的支持分布式部署的網頁版實時聊天。個人認為就是為的后端而生的,簡直是無縫結合起來。個人只在當中使用把和串連起來,解決了沒有后端的尷尬境地。 LayIM客戶端源碼 LayIM服務端源碼 Laravel+Layim+GatewayWorker實現實時聊天功能 它是什么? 基于wbsocket的有前端有后端的支持分布式部署的網頁版...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
摘要:即時通訊中,最重要的是響應速度,我們需要展示消息列表那么這時會有未讀消息,未讀數量,最后一條消息內容,時間等等。目前設計是單表單庫。這里只是對即時通訊設計上做了一些簡要的闡述,如有疑問和建議,請在評論區回復。 詳解即時通訊設計實現(PHP+GatewayWorker+Redis) 需要實現的功能 一對一聊天(私聊) 一對多聊天(群聊) 類似QQ,微信等聊天列表 實時消息 顯示 工具...
閱讀 3250·2021-10-21 17:50
閱讀 3260·2021-10-08 10:05
閱讀 3386·2021-09-22 15:04
閱讀 586·2019-08-30 14:00
閱讀 1944·2019-08-29 17:01
閱讀 1512·2019-08-29 15:16
閱讀 3222·2019-08-26 13:25
閱讀 856·2019-08-26 11:44