Centrifugo使用总结

Centrifugo是一个实时消息服务器,它与语言无关,可以与任何语言编写的应用程序后端(Python,Ruby,Perl,PHP,Javascript,Java,Objective-C等)结合使用.

Centrifugo作为单独的服务运行,并保持从应用程序客户端(从Web浏览器或其他环境,如iOS或Android应用程序)持续的WebSocket或SockJS连接.当发生某些事件时,您可以使用Centrifugo API将其广播给所有感兴趣的客户.

Centrifugo的相当文档参见:

  1. 官网地址:https://centrifugal.github.io/centrifugo/
  2. 各语言库:https://centrifugal.github.io/centrifugo/libraries/client/
  3. 快速开始:https://centrifugal.github.io/centrifugo/getting_started/
  4. 详细文档:https://centrifugal.github.io/centrifugo/server/install/

1.部署Centrifugo,我们采用了比较简单的docker方式

docker run --rm -ti centrifugo/centrifugo /bin/sh

2.在窗口中执行命令,生成配置文件

centrifugo genconfig

3.生成的配置文件大致如下:

{
  "v3_use_offset": true,
  "token_hmac_secret_key": "xxxxx-xxx-xx-9cdc-xxxx",
  "admin_password": "xxx-84f3-xx-xxx-xxx",
  "admin_secret": "xxx-45d1-4c3d-xx-xxx",
  "api_key": "xxxxx-baa8-44c9-8b13-2c2c5ee4cc42"
}

4.启动 centrifugo

centrifugo  -c config.json --admin

5.前台采用 centrifugo的js客户端,大致代码如下

<html>
    <head>
        <title>Centrifugo quick start</title>
    </head>
    <body>
        <div id="counter">-</div>
        <script src="https://cdn.jsdelivr.net/gh/centrifugal/centrifuge-js@2.6.2/dist/centrifuge.min.js"></script>
        <script type="text/javascript">
            const container = document.getElementById('counter')
            const centrifuge = new Centrifuge("ws://localhost:8000/connection/websocket");
            centrifuge.setToken("<TOKEN>");//要替换成真正的tocken

            centrifuge.on('connect', function(ctx) {
                console.log("connected", ctx);
            });

            centrifuge.on('disconnect', function(ctx) {
                console.log("disconnected", ctx);
            });

            centrifuge.subscribe("channel", function(ctx) {
                container.innerHTML = ctx.data.value;
                document.title = ctx.data.value;
            });

            centrifuge.connect();
        </script>
    </body>
</html>

6.用命令方式生成token

centrifugo gentoken -u 123722

HMAC SHA-256 JWT for user 123722 with expiration TTL 168h0m0s:
eyJhbGciOiJIUzI1ssssInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM3MjIiLCJleHAiOjE1OTAxODYzMTZ9.YMJVJsQbK_p1fYFWkcoKBYr718AeavAkXxxxxxxxx

7.用代码方式生成token可参见 https://jwt.io/ ,以下只是go示例

package main

import (
	"fmt"

	"github.com/dgrijalva/jwt-go"
)

func main() {
	claims := jwt.MapClaims{"sub": "123"}
	t, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte("xxxx"))
	if err != nil {
		panic(err)
	}
	fmt.Println(t)
}

8.发送测试消息1,验证web页面是否要以收到消息,可以用现在的web后台发送 ,打开http://localhost:8000 ,密码就是上面配置文件中的 admin_password 配置项


 9.点此可以发送消息

 

 10.也可以用go语言发送消息,代码示例如下

package main

import (
	"context"
	"fmt"

	"github.com/centrifugal/gocent"
)

func main() {
	CentClient := gocent.New(gocent.Config{
		Addr: "http://localhost:8000",
		Key:  "xxxx",
	})
	ctx := context.Background()
	err = CentClient.Publish(ctx, "channel", []byte("{\"value\":123}"))
	if err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println("ok")
	}
	fmt.Println("finish")
}

这样,我们就基本完成了一个简单的聊天系统!

11.配置文件说明 ,详见:https://centrifugal.github.io/centrifugo/server/configuration/

  1. v3_use_offset:打开自动使用最新的client-server协议
  2. token_hmac_secret_key:用于生成或者检查token,必选项
  3. api_key:用于 Centrifugo API 端点授权,
  4. client_channel_limit:设置单个客户端可以拥有的最大数量的不同通道订阅,默认128
  5. channel_max_length:设置频道名称的最大长度
  6. client_user_connection_limit:同一用户(不包含匿名用户)连接到Centrifugo节点的最大连接数,默认值0表示不限制
  7. client_request_max_size:客户端请求的最大允许长度,按字节计,默认值65536
  8. client_queue_max_size:客户端消息队列的最大大小,以字节计.默认大小为 10mb
  9. client_anonymous:是否允许客户端匿名连接,如果设置为 true,则所有客户端可以在没有JWT令牌的情况下连接到Centrifugo.在这种情况下,没有令牌的连接会被视为匿名(user ID 为空),并且只能订阅开启了anonymous选项的频道,默认为false
  10. client_concurrency:需要Centrifugo v2.8.0及以上, 决定Centrifugo并发的处理客户端发来的命令,默认为0,顺序的处理
  11. sockjs_heartbeat_delay:SockJS心跳检测时间间隔,单位为秒,默认为25
  12. websocket_compression:是否开启websocket压缩,默认为false
  13. gomaxprocs:默认情况下,Centrifugo会在所有可用CPU内核上执行,本选项可以用来限制Centrifugo同时可利用的CPU内核数
  14. admin:开启管理员后台
  15. admin_password:管理员密码
  16. admin_secret:管理secret
  17. debug:是否打开debug,当Centrifugo以debug模式启动时,debug端点将可用,端点URL: http://localhost:8000/debug/pprof/,通过上面的地址,你可以看到 Centrifugo 实例的内部状态信息,这些信息在故障排除时会非常有用
  18. publish:允许客户端直接发布消息到频道,而不经过应用程序后端.一般情况下.消息都是由应用程序后端通过Centrifugo API发布到Centrifugo服务器的.这个参数适用于没有后端或者demo的快速构建.需要注意的一点是客户端只有成功订阅了频道之后才能发布消息到该频道.本参数默认值为false

12:频道(Channel)

     频道(Channel)是消息发布的通道,客户端通过订阅频道来接收与频道相关的事件,包括发布到本频道的消息、用户订阅/取消订阅的消息等等。同样,客户端也需要订阅频道来获取频道的状态(presence)和历史消息.频道的生命周期比较短暂,不需要显式的去声明.当第一个客户端进行订阅时,Centrifugo会自动创建相应频道.当最后一个客户端取消订阅时,频道会立即自动被销毁.

    频道以字符串为标识,由字母、数字、下划线或连接符组成,长度必须大于2(^[-azA-Z0-9_]{2,}$),默认最大长度为255,如需修改可以通过配置文件中的 channel_max_length 参数进行调整.

    以下字符是内部保留字符:

  1.     : – 命名空间分隔符
  2. $ – 私有频道前缀
  3. # – 用户频道分隔符
  4. * – 保留字符
  5. & – 保留字符
  6. / – 保留字符

    命名空间分隔符(:) :如果频道名称为 public:chat,该频道的配置信息将使用 public 命名空间的配置参数设置。
    私有频道前缀($):如果频道名称以$开头,则意味着该频道为私有频道。订阅私有频道必须通过应用程序后端签名。
    用户频道分隔符(#):该字符用于创建用户专属频道,而无需向后端Web应用程序发送POST请求。例如,频道名 news#42,表示只有 ID 为 42 的用户可以订阅该频道。客户端在连接 Centrifugo 时需要提供 Token,其中包含了 user ID,因此 Centrifugo 清楚每个客户端的 user ID。另外,用户频道可以支持多个 user ID,user ID 之间通过逗号分隔,例如 dialog#42,43。此种类型的频道适用于固定用户,例如用户个人消息通道、确定用户之间的对话通道,一旦需要动态用户访问频道,此频道类型就不合适了。

此条目发表在 网站开发 分类目录,贴了 标签。将固定链接加入收藏夹。

评论功能已关闭。