分享laravel-echo-server广播服务搭建

2022-05-15 0 387

下面由Laravel教程栏目给大家介绍laravel-echo-server广播服务搭建,希望对需要的朋友有所帮助!

分享laravel-echo-server广播服务搭建

动机

当前项目中很多场景采用 Redis 队列和定时任务来处理执行时间较长的任务,这些任务执行的状态和执行结果只能通过前端重新发送请求获取。

目标

为了优化程序体验,让用户尽可能早的关注到任务执行结果,我们评估了各种方案。为了降低前后端的沟通成本避免重复造轮子,我们决定采用 Laravel 框架内置的广播功能。

选择服务

官方推荐采用 pusher 来搭建应用,pusher 的好处是搭建起来非常简单。但考虑到是国外的服务,存在访问稳定性风险;且目前项目规模较小,于是尝试自己搭建 Websocket 服务,使用的就是 Laravel 框架官方提到的 tlaverdure/laravel-echo-server 项目。

laravel-echo-server 服务特点

这个项目的使用方法可以直接去他们的 github 页面 获得,我们看中的几点如下:

可通过 Redis 的发布订阅功能来获取事件信息并广播出去,这点的效率要高于向 pusher 的 HTTP API 发送推送请求;同时兼容 pusher 的 HTTP API ,如果一些服务无法通过 Redis 发布事件,则可以采用这种模式推送事件;

搭建 Websocket 服务

我们一开始使用了 oanhnn/laravel-echo-server 这个镜像来启动容器,在调试过程中发现这个服务并不稳定,Node 的服务会在异常时直接退出,这是我们碰到的第一个坑。为了快速解决这个问题,我们再这个镜像基础上加入了 supervisor 来负责进行服务进程的退出后重启的任务,并做成了我们自己的镜像。

Redis 订阅

在试用 Redis 订阅时,除了常规的数据库地址和密码等参数以外,key 前缀是我们碰到的又一个坑,对应在 laravel-echo-server 服务中的 laravel-echo-server.json 文件中的 keyPrefix 配置项,一开始没有找到正确的方法,无论怎么配置都不对。后来发现如果想知道要广播事件的程序当前的 Redis key 前缀是什么,就在 tinker 中执行以下脚本即可。

# php artisan tinkerconfig('database.redis.options.prefix');

Nginx 代理

由于生产环境采用了 HTTPS 协议,所以需要给服务增加证书,但因为我是 Node 小白,没有 Node 程序使用证书的配置经验,所以一轮尝试之后基本上放弃了,之后采用了 Nginx 代理的方式使用证书,经过几轮尝试,终于配置成功。

server {    listen port;    server_name your-domain;    ssl on;    ssl_certificate     path-to-pem;    ssl_certificate_key path-to-key;    ssl_session_timeout 5m;    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    ssl_prefer_server_ciphers on;    location /socket.io {        proxy_pass http://container-name:6002;        proxy_http_version 1.1;        proxy_set_header Upgrade $http_upgrade;        proxy_set_header Connection "Upgrade";    }}

私有/出席频道授权

Laravel 广播将频道分为:公共、私有和出席(我可能翻译的不对,请指正),其中后两者是需要授权访问。我们需要用到的是私有频道,只有经过授权的人才能从前端订阅我们的事件。这也是我们遇到的一个坑。

经我们观察和源码阅读,发现 laravel-echo 的整体授权过程是:

前端程序先向 laravel-echo-server 服务发送一个 HTTP POST 请求;laravel-echo-server 根据配置中 authEndpointauthHost 这两项,向应用服务器发送一个 HTTP POST,POST 数据是 channel 名字,同时透传 header 中的 Authorization 数据;laravel-echo-server 会根据应用服务器的响应来判断授权结果,如果应用服务器响应的是非 HTTP 200 状态,就说明发生了错误,授权失败。

我们在实践中遇到两个问题。第一个问题是,我们项目的授权守门逻辑并非 laravel 默认的,所以默认的 Broadcast::routes() 所引入的路由无法直接使用。发现问题后,我们重新加入了我们自己的授权路由,并配置到 laravel-echo-server.json 的 authEndpoint 配置项中。

另一个问题是,我们没有采用标准的 RESTFul 协议规则:响应对应的 HTTP Code 来描述错误状态。致使 laravel-echo-server 即便在授权失败的时候也不能发现问题并反馈给前端程序,情况类似下图:

分享laravel-echo-server广播服务搭建

迟早还是要还债的…

总结

这个功能开发的,没有当初想的那么顺利,主要的问题有以下几点:

laravel-echo-server 没有预想的那么健壮,以后有时间还得找找替代方案,貌似也有用 swoole 做的项目,可以尝试一下;预先忘记考虑到 SSL 的问题,导致发布时临时处理得手忙脚乱;laravel-echo-server 和 laravel-echo 本身都是很小的项目,遇到问题应该优先考虑去分析其代码减少尝试的时间。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 分享laravel-echo-server广播服务搭建 https://www.jike1995.com/36668.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务