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

动机

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

目标

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

选择服务

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

laravel-echo-server 服务特点

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

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

搭建 Websocket 服务

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

Redis 订阅

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

# php artisan tinkerconfig('');

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 的整体授权过程是:

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

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

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

迟早还是要还债的…

总结

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

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

echo 多行_分享laravel-echo-server广播服务搭建-Laravel相关推荐

  1. echo 多行_【庭审现场】利用注销公司诈骗 多行不义必自毙_政务_澎湃新闻

    阮某原是某物业服务有限公司天长分公司负责人,承包天长市某小区物业,从事物业管理.2016年4月11日,阮某公司被注销后,却故意隐瞒实情,仍冒用公司名义,诈骗资金万元.10月20日,天长法院以诈骗罪.合 ...

  2. mysql编辑前200行_巧妙使用SQL Server编辑前200行功能

    在SQL Server 2005/2008/2008 R2中,我们可以使用SQL Server自带的编辑前200行功能,使用这个功能的本意是简化Update 的使用,让开发人员.DBA和不懂T-SQL ...

  3. ad域管理与维护_详解Windows Server 2016如何搭建AD服务器(图文教程)

    概述 今天主要分享怎么在Windows Server 2016服务器上去搭建AD服务器,先介绍下相关概念. 相关概念 1.AD 域服务 什么是目录(directory)呢? 日常生活中使用的电话薄内记 ...

  4. mock server 挡板服务搭建

    官网:https://github.com/dreamhead/moco 启动moco服务 java -jar moco-runner-<version>-standalone.jar s ...

  5. linux脚本echo off,echo什么意思_@echo off的作用 - 编程语言及工具 - 电子发烧友网

    ECHO简介 英文原义:EchoProtocol中文释义:应答协议注解,主要用于调试和检测中.它可以基于TCP协议,服务器就在TCP端口7检测有无消息,如果使用UDP协议,基本过程和TCP一样,检测的 ...

  6. 亚马逊echo中国使用_我需要Amazon Echo才能使用Alexa吗?

    亚马逊echo中国使用 Amazon has gone into overdrive promoting their powerful and popular voice assistant Alex ...

  7. 亚马逊echo中国使用_如何在您的Amazon Echo上收听播客

    亚马逊echo中国使用 Podcasts and the Amazon Echo system are a match made in heaven: you get good sound quali ...

  8. 亚马逊echo中国使用_您是否需要Amazon Prime才能使用Amazon Echo?

    亚马逊echo中国使用 Amazon's popular Echo speaker system (and the personal assistant Alexa that comes with i ...

  9. 亚马逊echo中国使用_您可以(也可以不)使用多个Amazon Echo做的事情

    亚马逊echo中国使用 The Amazon Echo is a device that can quickly become the center point of your smarthome s ...

最新文章

  1. Material Master
  2. linux 硬链接 软链接 简介
  3. 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
  4. python12个基本语法_12-25python基本语法
  5. global在python_在Python中使用“global”关键字
  6. 为ashx文件启用session管理
  7. python爬虫淘宝评论图片_Python爬虫实战四之抓取淘宝MM照片
  8. python xlsxwriter模块生成EXCEL柱状图、饼图
  9. Laravel打印操作的sql 阿星小栈
  10. 大数定理与中心极限定理
  11. 无偏性 VS 一致性
  12. Linux可重入函数
  13. PAT A1103 Integer Factorization整数分解 (经典DFS优化)
  14. jsp铁路交通查询系统
  15. 什么是扩散模型(Diffusion Models)?
  16. 使用Aspose.Cells组件生成Excel文件列宽度自适应时出错:Column width must be between 0 and 255...
  17. 如何帮助电商人解决问题?
  18. POJ-3013: Big Christmas Tree(dij,spfa)
  19. 世界坐标系-相机坐标系-像素坐标系
  20. mysql之 存在则修改,不存在则插入的sql(inert if not exist,else update)语法

热门文章

  1. 全局安装gulp 报错问题解决
  2. 【白皮书分享】2021国有企业数字化转型指数与方法路径白皮书.pdf(附下载链接)...
  3. 全球首发!惯性导航导论(剑桥大学)第四部分
  4. kaggle房价预测(House Prices: Advanced Regression Techniques)详解
  5. sklearn中的XGBClassifier函数学习
  6. 拖拽批量上传图片如何保证 顺序_新手指南︱shopee店铺上架产品该如何操作?...
  7. Leetcode每日一题:52.N-Queens II(N皇后Ⅱ)
  8. TensorFlow2.0:数据统计
  9. 分享一个不错的Windows软件——Fliqlo
  10. 安装指定版本的GPU版本的tensorflow小技巧