内容纲要

Centrifugo是一个实时消息服务器。它与语言无关,可以与任何编程语言编写的应用程序后端结合使用.Centrifugo 作为单独的服务运行,并保持应用程序客户端(来自Web浏览器或其他环境,如iOS / Android应用程序)的持久Websocket或SockJS连接。当你需要实时向您的客户提供活动时,您将其发布到Centrifugo API和Centrifugo然后向所有对此事件感兴趣的连接客户广播事件(即客户在活动频道上订阅)。换句话说 – 这是一个面向用户的PUB / SUB服务器。

请服务器参阅文档

你也可以找到有趣的介绍文章 – 这是Centrifugo的故事和动机。

方案

如何安装

发布可作为单个可执行文件 – 只需为您的平台下载最新版本,解压缩并运行。

如果您使用的是MacOS的:

brew tap centrifugal/centrifugo
brew install centrifugo

查看官方泊坞窗镜像

还有64位的Debian,Centos的和Ubuntu的的软件包

演示

在Heroku的上尝试我们的演示实例(管理员密码是password,秘密是secret,API密钥是api_key)。或者只需点击一下即可部署您自己的Centrifugo实例:

部署

强调

  • 快速服务器能够为数千个同时连接提供服务
  • 易于安装和跨平台 – 适用于Linux,MacOS和Windows
  • 轻松与现有应用程序集成 – 无需重写代码库即可引入实时事件
  • HTTP和GRPC API从您的应用程序后端进行通信(在通道中发布消息等)
  • JSON和二进制Protobuf Websocket协议
  • 用于没有Websocket支持的Web浏览器的SockJS polyfill(仅限JSON)
  • 使用Redis PUB / SUB,Redis Sentinel进行扩展,实现高可用性,一致的分片支持
  • 基于JWT的用户身份验证和私有通道授权
  • 频道的在线信息(显示频道中的所有活动客户端)
  • 频道的历史信息(发布到频道的最后消息)
  • 加入/离开频道的活动(客户端上线/离线)
  • 通过配置的窗口断开网络连接后自动恢复丢失的消息
  • 内置管理的Web界面
  • 准备部署(Docker,RPM / DEB包,Nginx配置,自动Let’s加密TLS证书,Prometheus / Graphite监控)
  • MIT许可证

配置

Centrifugo 与 Web 共享 jwt token 的私钥,Web 用户认证后,可连接到 Centrifugo 服务器订阅消息,Web 后端可通过 SDK  发布消息到 Centrifugo 服务器。

基本上客户端只是用于订阅消息,不建议客户端发布消息。

一个 Express 应用共用 Centrifugo JWT 私钥的演示,将 express 输出的 jwt token 输出到 ejs 模板的页面上,然后用 centrifuge 的客户端连上订阅消息。
[code language=”js”]
import express from ‘express’
import jwt from ‘express-jwt’
import jsonwebtoken from ‘jsonwebtoken’
import path from ‘path’

const app = express()

app.set(‘views’, path.join(__dirname, ‘views’))
app.set(‘view engine’, ‘ejs’)
app.use(express.static(path.join(__dirname, ‘public’)))

app.use((req, res, next) => {
res.header(‘Access-Control-Allow-Origin’, ‘*’)
res.header(‘Access-Control-Allow-Methods’, ‘POST,GET,HEAD,OPTIONS,DELETE’)
res.header(‘Access-Control-Allow-Headers’, ‘Authorization, Content-Type’)
next()
})

const payload = {
id: 1,
name: ‘Ashutosh Singh’,
age: 25
}

const jwtOptions = {
expiresIn: ’24h’
}

app.get(‘/’, (req, res) => {
const token = jsonwebtoken.sign(payload, ‘d329a3a9-a8c4-400d-8beb-cc4075720314’, jwtOptions)
res.render(‘index’, {title: ‘Title 1’, token: token})
})

app.get(‘/login’, (req, res) => {
const token = jsonwebtoken.sign(payload, ‘d329a3a9-a8c4-400d-8beb-cc4075720314’, jwtOptions)
console.log(token)
res.json({"token": token})
})

app.use(jwt({secret: ‘d329a3a9-a8c4-400d-8beb-cc4075720314’}))

app.get(‘/api’, (req, res) => {
res.json(payload)
})

app.listen(3001, () => {
console.log(‘ES6 application listening on port 3001!’)
})
[/code]

[code language=”js”]
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<script src="//cdn.rawgit.com/centrifugal/centrifuge-js/2.1.2/dist/centrifuge.min.js"></script>
</head>
<body>
<h1><%= title %></h1>
<%= token %>

<script>
var centrifuge = new Centrifuge(‘ws://localhost:8000/connection/websocket’);
centrifuge.setToken(‘<%= token %>’);
centrifuge.connect();

centrifuge.on(‘connect’, function(context) {
console.log(‘connected!’);
console.log(context);

centrifuge.publish("news", {"input": "hello"}).then(function(res) {
console.log(‘successfully published’);
}, function(err) {
console.log(‘publish error’, err);
});
});

centrifuge.subscribe("news", function(message) {
console.log(message);
});

</script>

</body>
</html>
[/code]

其他

  • Four years in Centrifuge
  • Building real-time messaging server in Go
  • Serving secure Websocket and GRPC over same port with Nginx
  • How Redis suits Centrifugo
  • 发表评论

    电子邮件地址不会被公开。 必填项已用*标注