十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
目前websocket技术已经很成熟,选型Go语言,当然是敏册悄为了节省成本以及它强大的高并发性能。我使用的是第三方开源的websocket库即gorilla/websocket。
成都创新互联公司专注于硚口企业网站建设,自适应网站建设,商城网站建设。硚口网站建设公司,为硚口等地区提供建站服务。全流程按需定制设计,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
由于我们线上推送的量不小,推送后端需要部署多节点保持高可用,所以需要自己做集群,具体架构方案如图:
Auth Service:鉴权服务,根据Token验证用户权限。
Collect Service:消息采集服务,负责收集业务系统消息,存入MongoDB后,发送给消息分发服务。
Dispatch Service:消息分发服务,根据路由规则分发至对应消息推送服务节点上。
Push Service:消息推送服务,通过websocket将消息推送给用户。
集群推送的关键点在于,web端与服务端建立长连接之后,具体跟哪个推送节点保持长连接的,如果我们能够找到对应的连接节点,那么我们就可以将消息推送出去。下面讲解一下集群的大致流程:
1. web端用户登录之后,带上token与后端推送服务(Push Service)保持长连接。
2. 推送服务收到连接请求之后,携带token去鉴权服务(Auth Service)验证此token权限,并返回用户ID。
3. 把返回的用户ID与长连接存入本地缓存,保持用户ID与长连接绑定关系。
4. 再将用户ID与本推送节点桥渣IP存入redis,建立用户(即长连接)与节点绑定关系,并设置失效时间。
5. 采集服务(Collect Service)收集业务消息,首先存入mongodb,然后将消息透传给分发服务(Dispatch Service)。
6. 分发服务收到消息之后,根据消息体中的用户ID,从redis中获取对应的推送服务节点IP,然后转发给对应的姿碧推送节点。
7. 推送服务节点收到消息之后,根据用户ID,从本地缓存中取出对应的长连接,将消息推送给客户端。
其他注意事项:
当您对外部模块的存储库进行了 fork (例如修复模块代码中的问题或添加功能)时,您可以让 Go 工具将您的 fork 用于模块的源代码。这对于测试您自己的代码的更改很有用。
为此,您可以使用go.mod 文件中的replace指令将外部模块的原始模块路径替换为存储库中 fork 的路径。这指示 Go 工具在编译时使用替换路径(fork 的位置),例如,同时允许您保留import 原始模块路径中的语句不变。
在以下 go.mod 文件示例中,当前模块需要外部模块example点抗 /theirmodule。然后该replace指令将原始模块路径替换为example点抗 /myfork/theirmodule模块自己的存储库的分支。
设置require/replace对时,使用 Go 工具命令确保文件描述的需求保持一致。使用go list命令获取当前模块正在使用的版本。然后使用go mod edit命令将需要的模块替换为fork:
注意: 当您使用该replace指令时,Go 工具不会像添加依赖项中所述对外部模块进行身份验证。
您可以使用go get命令从其存储库中的特定提交为模块添加未发布的代码。
为此,您使用go get命令,用符号@指定您想要的代码 。当您使用go get时,该命令将向您的 go.mod 文件添加一个 需要外部模块的require指令,使用基于有关提交的详细信息的伪版芦逗败本号。
以下示例提供了一些说明。这些基于源位于 git 存储库中的模块。
当您的代码不再使用模块中的任何包时,您可以停止将该模块作为依赖项进行跟踪。
要停止跟踪所有未使用的模块,请运行go mod tidy 命令。此命令还可能添加在模块中构建包所需的缺失依赖指梁项。
要删除特定依赖项,请使用go get,指定模块的模块路径并附加 @none,如下例所示:
go get命令还将降级或删除依赖于已删除模块的其他依赖项。
当您使用 Go 工具处理模块时,这些工具默认从 proxy.golang.org(一个公共的 Google 运行的模块镜像)或直接从模块的存储库下载模块。您可以指定 Go 工具应该使用另一个代理服务器来下载和验证模块。
如果您(或您的团队)已经设置或选择了您想要使用的不同模块代理服务器,您可能想要这样做。例如,有些人设置了模块代理服务器,以便更好地控制依赖项的使用方式。
要为 Go 工具指定另一个模块代理服务器,请将GOPROXY 环境变量设置为一个或多个服务器的 URL。Go 工具将按照您指定的顺序尝试每个 URL。默认情况下,GOPROXY首先指定一个公共的 Google 运行模块代理,然后从模块的存储库直接下载(在其模块路径中指定):
您可以将变量设置为其他模块代理服务器的 URL,用逗号或管道陪颤分隔 URL。
Go 模块经常在公共互联网上不可用的版本控制服务器和模块代理上开发和分发。您可以设置 GOPRIVATE环境变量。您可以设置GOPRIVATE环境变量来配置go命令以从私有源下载和构建模块。然后 go 命令可以从私有源下载和构建模块。
GOPRIVATE或环境变量可以设置为匹配模块前缀的全局模式列表,这些GONOPROXY前缀是私有的,不应从任何代理请求。例如: