实时通信平台:Centrifugo

xiaohai 2019-05-19 17:01:53 4223人围观 标签: Go 
简介Centrifugo是一个用Golang实现的基于Websocket或者SockJS的实时通信平台。它与语言无关,可以与任何语言编写的应用程序后端(Python,Ruby,Perl,PHP,Javascript,Java,Objective-C等)结合使用。

Centrifugo是一个用Golang实现的基于Websocket或者SockJS的实时通信平台。它与语言无关,可以与任何语言编写的应用程序后端(Python,Ruby,Perl,PHP,Javascript,Java,Objective-C等)结合使用。

Centrifugo特点
  • 快速的处理数千个并发连接.
  • 轻松地与现有应用程序集成 - 不需要重写后端代码来引入实时事件
  • 应用程序后端通过HTTP API和centrifugo进行通信(在通道中发布消息等).拥有Python,Ruby,PHP,Go,NodeJS等语言的API客户端.
  • Javascript客户端通过SockJS或纯Websocket协议从Web浏览器进行连接。iOS和Android客户端通过Websocket连接
  • 使用Redis和Redis Sentinel扩展到多台机器,实现高可用性,一致的散列分片。
  • SHA-256基于HMAC的连接认证和专用信道授权
  • 不同类型的渠道 - 私人,用户限制,客户端限制的渠道
  • 通过命名空间灵活配置通道
  • 频道存在信息(显示频道中的所有活动客户端)
  • 频道的历史信息(最后发送到频道的讯息)
  • 加入/离开频道事件(客户端在线/离线)
  • 网络断开后恢复丢失的消息
  • 内置管理Web界面
  • 可以用作WebRTC信令服务器
  • 准备部署(docker映像,RPM / DEB包,Nginx配置,自动让我们加密TLS证书)
  • MIT许可证

需要更多了解Centrifugo的相关内容,可以进入https://centrifugal.github.io/centrifugo/进行查看。

一、Centrifugo服务搭建

1、下载发布的包
下载地址:https://github.com/centrifugal/centrifugo/releases

[root@localhost ~]# wget https://github.com/centrifugal/centrifugo/releases/download/v2.2.1/centrifugo_2.2.1_linux_amd64.tar.gz

2、解压压缩包到指定目录

[root@localhost apps]# mkdir -p /apps/centrifugo [root@localhost ~]# tar -zxf centrifugo_2.2.1_linux_amd64.tar.gz -C /apps/centrifugo/ [root@localhost ~]# cd /apps/centrifugo/ [root@localhost centrifugo]# ll total 16524 -rwxrwxr-x. 1 2000 2000 16861984 Apr 15 14:40 centrifugo -rw-rw-r--. 1 2000 2000 47426 Apr 15 14:38 CHANGELOG.md -rw-rw-r--. 1 2000 2000 1102 Apr 15 14:38 LICENSE -rw-rw-r--. 1 2000 2000 3681 Apr 15 14:38 README.md

3、生成配置文件

[root@localhost centrifugo]# ./centrifugo genconfig [root@localhost centrifugo]# ll total 16528 -rwxrwxr-x. 1 2000 2000 16861984 Apr 15 14:40 centrifugo -rw-rw-r--. 1 2000 2000 47426 Apr 15 14:38 CHANGELOG.md -rw-r--r--. 1 root root 226 May 17 19:58 config.json -rw-rw-r--. 1 2000 2000 1102 Apr 15 14:38 LICENSE -rw-rw-r--. 1 2000 2000 3681 Apr 15 14:38 README.md

执行命令后,生成了一个config.json的配置文件,包含了基本的配置信息

[root@localhost centrifugo]# cat config.json { "secret": "54a2ff0f-006e-457c-9197-41fa908fa446", "admin_password": "ad581503-f8d7-4501-98b3-7096e12a16c0", "admin_secret": "e3cd5036-c80a-4586-a40a-ee7be52a6129", "api_key": "24d498f1-d42b-45ef-899e-507534f4d55d" }

4、启动Centrifugo服务

[root@localhost centrifugo]# ./centrifugo --config=config.json 2019-05-17T20:01:59-04:00 |INFO| starting Centrifugo 2.2.1 (go1.12.4) 2019-05-17T20:01:59-04:00 |INFO| config path: /apps/centrifugo/config.json 2019-05-17T20:01:59-04:00 |INFO| pid: 30421 2019-05-17T20:01:59-04:00 |INFO| engine: Memory 2019-05-17T20:01:59-04:00 |INFO| gomaxprocs: 1 2019-05-17T20:01:59-04:00 |INFO| serving websocket, SockJS, API endpoints on :8000

如果要启动WEB管理服务,需要在命令后面加上–admin,如

[root@localhost centrifugo]# ./centrifugo --config=config.json --admin 2019-05-17T20:02:31-04:00 |INFO| starting Centrifugo 2.2.1 (go1.12.4) 2019-05-17T20:02:31-04:00 |INFO| config path: /apps/centrifugo/config.json 2019-05-17T20:02:31-04:00 |INFO| pid: 30429 2019-05-17T20:02:31-04:00 |INFO| engine: Memory 2019-05-17T20:02:31-04:00 |INFO| gomaxprocs: 1 2019-05-17T20:02:31-04:00 |INFO| serving websocket, SockJS, API, admin endpoints on :8000

启动后可以通过IP和端口访问:http://192.168.71.109:8000,密码是配置文件中的admin_password。通过后台可以观看所有节点信息,节点中频道、客户端和用户信息。

其他相关配置参数请参考官方文档。

二、Centrifugo客户端

现在Centrifugo已经支持JS、Golang、ISO、Android、Dart、Flutter、Java等客户端。

这里我们使用JS为例,首先需要去https://github.com/centrifugal/centrifuge-js下载dist中的库。

然后新建一个index.html页面

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="dist/centrifuge.js"></script> </head> <body> <script type="text/javascript"> var centrifuge = new Centrifuge('ws://192.168.71.109:8000/connection/websocket'); centrifuge.setToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsImNoYW5uZWwiOiIkbG9jYWxkb21haW5fODAwMCJ9.A7cLUfP3T-4Der1L0yYfCB0iuBmk4RorbKewPgU-99s"); centrifuge.subscribe("news", function(message) { console.log('abad',message); }); centrifuge.connect(); </script> </body> </html>

上面生成Token的Python代码:

import jwt token = jwt.encode({"sub": "42", "data": "存放数据"}, "54a2ff0f-006e-457c-9197-41fa908fa446").decode() # sub:表示以一个用户的ID, # data:存放任何数据 # 54a2ff0f-006e-457c-9197-41fa908fa446是配置文件中的secret print(token)

运行文件,然后在Centrifugo后台去发送一个消息,这边就能看到打印的信息了