由于公司業(yè)務(wù)需要實(shí)時(shí)獲取后端狀態(tài), 又想避免前臺(tái)輪循的方式, Centrifugo 正好能解決我們的問題, 借此機(jī)會(huì)進(jìn)行學(xué)習(xí)筐乳。以下為一些參考文檔及demo
目錄
安裝
-
添加源
curl -s https://packagecloud.io/install/repositories/FZambia/centrifugo/script.deb.sh | sudo bash
-
安裝 Centrifugo
sudo apt install centrifugo
-
生成配置文件
-
生成文件為: config.json, 更多配置可參考: 配置說明
centrifugo genconfig
-
新手可參考以下配置進(jìn)行測(cè)試, 需要根據(jù)自己環(huán)境進(jìn)行調(diào)整
{ "admin": true, "port": 8000, "debug": true, "presence": true, "history_size": 100, "history_lifetime": 600, "publish": true, "anonymous": true, "subscribe_to_publish": true, "join_leave": true, "history_recover": true, "log_file": "/srv/logs/centrifugo.log", "log_level": "debug", "engine": "redis", "redis_host": "127.0.0.1", "redis_port": "6379", "redis_db": "12", "redis_password": "abc123_", "secret":"453a5488-586e-4d46-a79a-920af89e0b30", "admin_password":"4ce7384d-cdcd-4d93-96db-9c911a8a53f3", "admin_secret":"ef390b3e-f03f-4c7d-8e48-5d39f03bda10", "api_key":"12a4e62c-e055-4a23-8bbd-d248740f5458", "namespaces":[ { "name":"public", "anonymous":true, "publish":true, "presence":true, "join_leave":true, "history_size":20, "history_lifetime":30, "history_recover":true } ] }
-
配置說明
-
基本配置說明
Centrifugo – real-time messaging server Usage: [flags] [command] Available Commands: checkconfig Check configuration file genconfig Generate simple configuration file to start with help Help about any command version Centrifugo version information Flags: -a, --address string interface address to listen on 服務(wù)的地址 --admin enable admin web interface 是否開啟admin的管理界面 --admin_insecure use insecure admin mode – no auth required for admin socket admin安全驗(yàn)證, 節(jié)點(diǎn): /, 可直接訪問admin管理界面, 默認(rèn)為false, 登錄admin需要admin_password, 反之可直接登錄 --api_insecure use insecure API mode 后臺(tái)推送安全驗(yàn)證, 節(jié)點(diǎn): /api. 默認(rèn)為 false, 此時(shí)訪問節(jié)點(diǎn)需要api_key. 當(dāng)設(shè)置為 true 后, 任何人都將可以訪問此節(jié)點(diǎn) --client_insecure start in insecure client mode 客戶端是否需要安全驗(yàn)證, 默認(rèn)為false, 客戶端必須擁有 JWT token 才能訪問 -c, --config string path to config file (default "config.json") --debug enable debug endpoints 是否開啟dubug節(jié)點(diǎn), 開啟后可訪問 /debug/pprof/ 查看一些Centrifugo的網(wǎng)絡(luò)狀態(tài) -e, --engine string engine to use: memory or redis (default "memory") 消息存儲(chǔ)引擎, 默認(rèn)為內(nèi)存, 部署多個(gè)實(shí)例會(huì)造成數(shù)據(jù)不同步, 因此推薦使用 redis --grpc_api enable GRPC API server 是否開啟grpc api, 目前我們將使用 http_api -h, --help help for this command --internal_port string custom port for internal endpoints 開啟自定義默認(rèn)端口, 默認(rèn)為8000, 開啟額外的端口為admin訪問 --log_file string optional log file - if not specified logs go to STDOUT log輸出文件 --log_level string set the log level: debug, info, error, fatal or none (default "info") log級(jí)別 -n, --name string unique node name 命名空間名稱, 此空間下的屬性會(huì)覆蓋common部分, 但不會(huì)繼承 --pid_file string optional path to create PID file -p, --port string port to bind HTTP server to (default "8000") 服務(wù)端口號(hào) --prometheus enable Prometheus metrics endpoint --redis_db int Redis database (Redis engine) --redis_host string Redis host (Redis engine) (default "127.0.0.1") --redis_master_name string name of Redis master Sentinel monitors (Redis engine) --redis_password string Redis auth password (Redis engine) --redis_port string Redis port (Redis engine) (default "6379") --redis_sentinels string comma-separated list of Sentinel addresses (Redis engine) --redis_tls enable Redis TLS connection --redis_tls_skip_verify disable Redis TLS host verification --redis_url string Redis connection URL in format redis://:password@hostname:port/db (Redis engine) --tls enable TLS, requires an X509 certificate and a key file --tls_cert string path to an X509 certificate file --tls_key string path to an X509 certificate key
-
注意點(diǎn):
- engine:
- 主要功能: 在節(jié)點(diǎn)之間發(fā)布消息,處理PUB / SUB代理訂閱阳惹,保存/檢索狀態(tài)和歷史數(shù)據(jù)。
- 分類:
- Memory: 測(cè)試學(xué)習(xí)可直接使用默認(rèn)的 Memory 引擎. 使用簡(jiǎn)單, 但不允許縮放節(jié)點(diǎn)
- Redis: 允許將節(jié)點(diǎn)進(jìn)行橫向拓展, 各節(jié)點(diǎn)通過redis共享信息
- name: 命名空間名稱
- 名字唯一, 命名格式
^[-a-zA-Z0-9_]{2,}$
- 命名空間和渠道配置
沒有繼承
, 命名空間必須單獨(dú)配置參數(shù), 不然會(huì)使用默認(rèn)值
- 名字唯一, 命名格式
- engine:
-
注意點(diǎn):
-
渠道配置說明
- 渠道定義: 用戶可以訂閱渠道, 并接受該渠道推送的所有消息
- 渠道命名中的特別字符
-
:
, 命名空間分隔符, namespace:channelName -
$
, 私有渠道前綴, 客戶端必須正確的提供簽名 -
#
, 用戶渠道分隔符, channelName#42, 代表只有用戶42才能訂閱此渠道, 此時(shí)需要在生成JWT token 時(shí)正確在 payload 中加入?yún)?shù) "sub": "42", 多個(gè)用戶可使用以下方式, channelName#42,43
-
- 配置
- publish: 是否允許客戶端直接推送消息到渠道, 一般情況下由后端進(jìn)行消息推送
- subscribe_to_publish: 在推送消息之前, 是否必須要訂閱渠道才能推送
- anonymous: 匿名訪問, JWT token 中sub為空, 默認(rèn)為false, 當(dāng)設(shè)置為true時(shí), 將默認(rèn)使用空字符串為用戶id
- presence: 是否可查看當(dāng)前渠道的連接信息(連接的用戶)
- join_leave: 渠道內(nèi)用戶是否接收渠道內(nèi)訂閱/取消訂閱的信息推送
- history_recover: 是否開啟消息回復(fù), 適用于在斷掉連接重連時(shí)使用, 此時(shí) history_size 和 history_lifetime 必須配置
- history_size: 保存多少歷史消息
- history_lifetime: 歷史消息的保存時(shí)長(zhǎng). 單位為秒
部署
參考demo中的README
Q&A
- 啟動(dòng)centrifugo后, 建立連接報(bào)錯(cuò): "attempt to call field 'replicate_commands' (a nil value)"
- 詳細(xì)細(xì)節(jié)參考issus
- centrifugo啟動(dòng)后存儲(chǔ)引擎有兩種可選方案, 內(nèi)存和redis. 此bug出現(xiàn)在使用redis引擎的時(shí)候, centrifugo 2.x 版本依賴redis版本為 3.2.x 以上, 請(qǐng)檢查依賴, 并升級(jí)
- Ubuntu 16.04 默認(rèn)源中的 Redis 版本是3.0版本套腹,不是最新版捶障,要想通過 apt-get install 的方式安裝最新版,首先添加 Redis 源。可執(zhí)行以下步驟升級(jí):
- 首先安裝依賴:sudo apt-get install software-properties-common -y
- 使用如下命令添加 Redis 鏡像源:sudo add-apt-repository ppa:chris-lea/redis-server -y
- 使用如下命令安裝 Redis:sudo apt-get update && sudo apt-get install redis-server -y