{"id":18635898,"url":"https://github.com/qmcloud/zhibo","last_synced_at":"2025-08-20T16:32:17.832Z","repository":{"id":65184000,"uuid":"100686565","full_name":"qmcloud/zhibo","owner":"qmcloud","description":"直播系统微服务架构方案","archived":false,"fork":false,"pushed_at":"2021-04-25T08:00:15.000Z","size":94946,"stargazers_count":138,"open_issues_count":0,"forks_count":104,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-12-08T22:13:00.328Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.onionnews.cn","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qmcloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-18T07:40:41.000Z","updated_at":"2024-11-29T04:54:34.000Z","dependencies_parsed_at":"2023-01-08T10:33:34.279Z","dependency_job_id":null,"html_url":"https://github.com/qmcloud/zhibo","commit_stats":null,"previous_names":["qmcloud/zhibo","double-baller/zhibo"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmcloud%2Fzhibo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmcloud%2Fzhibo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmcloud%2Fzhibo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmcloud%2Fzhibo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qmcloud","download_url":"https://codeload.github.com/qmcloud/zhibo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230438185,"owners_count":18225870,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T05:27:11.481Z","updated_at":"2024-12-19T13:08:01.669Z","avatar_url":"https://github.com/qmcloud.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\r\n## 架构简介\r\n\r\n技术群: ![Alt](https://img-blog.csdnimg.cn/20200623093238797.png)\r\n\r\n**GitHub**:https://github.com/DOUBLE-Baller/momo\r\n\r\n**博客地址**：https://blog.csdn.net/u012115197/article/details/108738066\r\n\r\n\r\n\t注：本教程适用于 Go 1.13 版本，因为 Go 1.11 才正式引入了 Go Module 作为包管理器。\r\n\r\n**针对市面上现有的直播系统多为单机裸奔版本，系统臃肿，业务耦合 IM API 性能差，不可横向扩展等等诸多问题，所以采用高可用的分布式系统尤为必要，用到技术如下：**\r\n\r\n后台管理：**laravel**\r\n分布式：**go mirco + micro api + etcd + kafka**等 \r\n前端：**vue**\r\n移动端： **ios+android+小程序**等\r\n数据库：**mysql+redis**\r\n通讯框架：**gprc**\r\n长连接通讯协议：**protocol buffers**\r\n\r\n\r\n## 环境搭建\r\n  **准备工具先，比如需要开发的东西，虚拟机镜像，工具等等。**\r\n网盘链接：https://pan.baidu.com/s/1WsfqcAZ8Ph6id39gbOMjbQ \r\n提取码：7nq3\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922185921775.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxMTUxOTc=,size_16,color_FFFFFF,t_70#pic_center)\r\n**安装虚拟机**\r\n\u003e 1.安装虚拟机 centos7 系统  镜像链接: [https://www.centos.org/download/](https://www.centos.org/download/)\t此处省略··\r\n\r\n**安装golang** \r\n```bash\r\nwget http://www.golangtc.com/static/go/go1.3.linux-amd64.tar.gz\r\n```\r\n```bash\r\ntar -C /usr/local -zxvf  go1.3.linux-amd64.tar.gz \r\n```\r\n\r\n```bash\r\nvim /etc/profile\t\r\n// 在最后添加\r\nexport GOROOT=/usr/local/go\r\nexport PATH=$PATH:$GOROOT/bin\r\nexport GOPATH=\"$HOME/go\r\nexport GO111MODULE=on\r\nexport GOPROXY=https://goproxy.io\r\n```\r\n**成功**\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922210610471.png#pic_center)\r\n**安装etcd**\r\n```bash\r\ncurl -L https://github.com/coreos/etcd/releases/download/v3.3.2/etcd-v3.3.2-linux-amd64.tar.gz -o etcd-v3.3.2-linux-amd64.tar.gz\r\n```\r\n```bash\r\ntar -zxf etcd-v3.3.2-linux-amd64.tar.gz\r\n```\r\n```bash\r\n解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端，etcdctl是客户端。\r\n```\r\n```bash\r\nmv etcd-v3.3.2-linux-amd64/etcd* /$GOPATH/bin\r\n```\r\n```bash\r\n./etcd \r\n```\r\n**成功**\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922213137699.png#pic_center)\r\n**安装 Protobuf 相关工具**\r\n\r\n```bash\r\n先创建项目文件 mkdir /www/go/live\r\n```\r\n```bash\r\ncd /www/go/live\r\n```\r\n```bash\r\ngo mod init live\r\n#自动生成go.mod文件\r\n```\r\n**Go Micro是Go开发微服务的RPC框架**\r\n```bash\r\ngo get github.com/micro/go-micro\r\n```\r\n**安装 protoc**\r\n```bash\r\n可以从这里 https://github.com/protocolbuffers/protobuf/releases 下载`最新`版的 protoc 截止教程结束本人下载最新的是protobuf-all-3.13.0.tar：\r\n./configure\r\nmake \u0026\u0026 make install\r\n注意：没有c++ 的提前安一下，否则编译不过去，这种问题就不用赘述了，这个都不懂也没必要继续往下看了\r\n```\r\n```bash\r\nprotoc --version\r\n```\r\n![成功](https://img-blog.csdnimg.cn/20200922221355356.png#pic_center)\r\n**安装 protoc-gen-micro**\r\n```bash\r\ngo get -u github.com/micro/protoc-gen-micro\r\n```\r\n**安装 protoc-gen-go**\r\n```bash\r\ngo get -u github.com/golang/protobuf/protoc-gen-go\r\n\r\ncp protoc-gen-* /usr/local/bin/\r\n```\r\n至此你的$GOPATH/bin下有如下文件 复制一份到/usr/local/bin 下\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922222247686.png#pic_center)\r\n**编写dome测试一把**\r\n```golang\r\nmkdir /www/go/live/proto\r\n然后在 proto 目录下创建一个 Protobuf 格式的服务接口声明文件 live.proto：\r\n```\r\n```proto3\r\nsyntax = \"proto3\";\r\n\r\nservice Live {\r\nrpc Call(LiveRequest) returns (LiveResponse) {}\r\n}\r\n\r\nmessage LiveRequest {\r\nstring name = 1; \r\n}\r\n\r\nmessage liveResponse {\r\nstring result = 1;\r\n}\r\n```\r\n```bash\r\nprotoc自动生成代码\r\nprotoc --proto_path=. --micro_out=. --go_out=. proto/live.proto\r\n```\r\n\u003e此时proto文件下多出几个文件：\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922224029282.png#pic_center)\r\n\r\n**编写GO服务实现代码 live 目录下 创建 mian.go**\r\n```golang\r\npackage main\r\n\r\nimport (\r\n\t\"context\"\r\n\t\"fmt\"\r\n\t\"github.com/micro/go-micro\"\r\n\tproto \"live/proto\"\r\n)\r\n\r\ntype LiveServiceHandler struct{}\r\n\r\nfunc (g *LiveServiceHandler)Call(ctx context.Context, req *proto.LiveRequest, rsp *proto.LiveResponse) error {\r\n\trsp.Result = \"我的github：https://github.com/DOUBLE-Baller/\" + req.Name\r\n\treturn nil\r\n}\r\n\r\nfunc main()  {\r\n\t// 创建新的服务\r\n\tservice := micro.NewService(\r\n\t\tmicro.Name(\"go.micro.api.Live\"), //go.micro.api 命名空间\r\n\t)\r\n\r\n\t// 初始化，会解析命令行参数\r\n\tservice.Init()\r\n\r\n\t// 注册处理器，调用 Live 服务接口处理请求\r\n\tproto.RegisterLiveHandler(service.Server(), new(LiveServiceHandler))\r\n\r\n\t// 启动服务\r\n\tif err := service.Run(); err != nil {\r\n\t\tfmt.Println(err)\r\n\t}\r\n}\r\n```\r\n```golang\r\ngo run main.go\r\n```\r\n```bash\r\n如图表示成功启动服务 注意：添加环境变量 MICRO_REGISTRY=etcd 来统一设置 或者使用go run main.go --registry=etcd 命令手动注册服务\r\n```\r\n\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/2020092223034366.png#pic_center)\r\n失败如下图\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922225010494.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxMTUxOTc=,size_16,color_FFFFFF,t_70#pic_center)\r\n```bash\r\n如遇此错误：添加go.mod最后一行即可！\r\nreplace google.golang.org/grpc =\u003e google.golang.org/grpc v1.26.0\r\n```\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923092941557.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxMTUxOTc=,size_16,color_FFFFFF,t_70#pic_center)\r\n\r\n\r\n**利用 go micro 提供 HTTP 服务接口**\r\n```bash\r\ngo get github.com/micro/micro/v2\r\n\r\n安装完成后，会在 $GOPATH/bin 目录下创建一个 micro 可执行文件，cp 到/user/local/bin 下即可\r\n```\r\n```bash\r\nmicro api --handler=rpc\r\n```\r\n```bash\r\n如下表示启动成功 默认端口8080 \r\n```\r\n\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922233014118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxMTUxOTc=,size_16,color_FFFFFF,t_70#pic_center)\r\n\r\n访问IP:8080 如图 有防火墙的请添加规则放开8080端口即可访问！![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922233410216.png#pic_center)\r\n**ok 到此基础环境搭建完成 下面运行远程调用 api **\r\n```bash\r\nmicro call go.micro.api.Live Live.Call '{\"name\": \"momo\"}'\r\n```\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923111240482.png#pic_center)\r\n\r\n\r\n## 编写代码\r\n**项目目录：**\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923112617559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxMTUxOTc=,size_16,color_FFFFFF,t_70#pic_center)\r\n\r\n\u003e server:       服务启动入口 \r\n\u003e config:       服务配置\r\n\u003e app:     每个服务私有代码 \r\n\u003e comm:   服务共有代码 \r\n\u003e sql:          项目sql文件\r\n\u003e test:         长连接测试脚本\r\n\r\n\r\n**app服务介绍**\r\n![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923113249111.png#pic_center)\r\n\r\n```bash\r\n1.tcp_conn\r\n维持与客户端的TCP长连接，心跳，以及TCP拆包粘包，消息编解码\r\n2.ws_conn\r\n维持与客户端的WebSocket长连接，心跳，消息编解码\r\n3.logic\r\n设备信息，好友信息，群组信息管理，消息转发逻辑\r\n4.user\r\n可以根据自己的业务需求，进行扩展,也可以替换成自己的业务服务器\r\n```\r\n**客户端接入流程**\r\n```bash\r\n1.调用LogicExt.RegisterDevice接口，完成设备注册，获取设备ID（device_id）,注意，一个设备只需完成一次注册即可，后续如果本地有device_id,就不需要注册了，举个例子，如果是APP第一次安装，就需要调用这个接口，后面即便是换账号登录，也不需要重新注册。\r\n2.调用UserExt.SignIn接口，完成账户登录，获取账户登录的token。\r\n3.建立长连接，使用步骤2拿到的token，完成长连接登录。\r\n如果是web端,需要调用建立WebSocket时,将user_id,device_id,token，以URL参数的形式传递到服务器，完成长连接登录，例如：ws://localhost:8081/ws?user_id={user_id}\u0026device_id={device_id}\u0026token={token}\r\n如果是APP端，就需要建立TCP长连接，在完成建立TCP长连接时，第一个包应该是长连接登录包（SignInInput），如果信息无误，客户端就会成功建立长连接。\r\n4.使用长连接发送消息同步包（SyncInput），完成离线消息同步，注意：seq字段是客户端接收到消息的最大同步序列号，如果用户是换设备登录或者第一次登录，seq应该传0。\r\n接下来，用户可以使用LogicExt.SendMessage接口来发送消息，消息接收方可以使用长连接接收到对应的消息。\r\n```\r\n\r\n\r\n----\r\n未完待续\r\n----\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmcloud%2Fzhibo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqmcloud%2Fzhibo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmcloud%2Fzhibo/lists"}