Giter Club home page Giter Club logo

zhibo's Introduction

架构简介

技术群: Alt

GitHub:https://github.com/DOUBLE-Baller/momo

博客地址https://blog.csdn.net/u012115197/article/details/108738066

注:本教程适用于 Go 1.13 版本,因为 Go 1.11 才正式引入了 Go Module 作为包管理器。

针对市面上现有的直播系统多为单机裸奔版本,系统臃肿,业务耦合 IM API 性能差,不可横向扩展等等诸多问题,所以采用高可用的分布式系统尤为必要,用到技术如下:

后台管理:laravel 分布式:go mirco + micro api + etcd + kafka等 前端:vue 移动端: ios+android+小程序等 数据库:mysql+redis 通讯框架:gprc 长连接通讯协议:protocol buffers

环境搭建

准备工具先,比如需要开发的东西,虚拟机镜像,工具等等。 网盘链接:https://pan.baidu.com/s/1WsfqcAZ8Ph6id39gbOMjbQ 提取码:7nq3 在这里插入图片描述 安装虚拟机

1.安装虚拟机 centos7 系统 镜像链接: https://www.centos.org/download/ 此处省略··

安装golang

wget http://www.golangtc.com/static/go/go1.3.linux-amd64.tar.gz
tar -C /usr/local -zxvf  go1.3.linux-amd64.tar.gz 
vim /etc/profile	
// 在最后添加
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH="$HOME/go
export GO111MODULE=on
export GOPROXY=https://goproxy.io

成功 在这里插入图片描述 安装etcd

curl -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
tar -zxf etcd-v3.3.2-linux-amd64.tar.gz
解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端。
mv etcd-v3.3.2-linux-amd64/etcd* /$GOPATH/bin
./etcd 

成功 在这里插入图片描述 安装 Protobuf 相关工具

先创建项目文件 mkdir /www/go/live
cd /www/go/live
go mod init live
#自动生成go.mod文件

Go Micro是Go开发微服务的RPC框架

go get github.com/micro/go-micro

安装 protoc

可以从这里 https://github.com/protocolbuffers/protobuf/releases 下载`最新`版的 protoc 截止教程结束本人下载最新的是protobuf-all-3.13.0.tar:
./configure
make && make install
注意:没有c++ 的提前安一下,否则编译不过去,这种问题就不用赘述了,这个都不懂也没必要继续往下看了
protoc --version

成功 安装 protoc-gen-micro

go get -u github.com/micro/protoc-gen-micro

安装 protoc-gen-go

go get -u github.com/golang/protobuf/protoc-gen-go

cp protoc-gen-* /usr/local/bin/

至此你的$GOPATH/bin下有如下文件 复制一份到/usr/local/bin 下 在这里插入图片描述 编写dome测试一把

mkdir /www/go/live/proto
然后在 proto 目录下创建一个 Protobuf 格式的服务接口声明文件 live.proto
syntax = "proto3";

service Live {
rpc Call(LiveRequest) returns (LiveResponse) {}
}

message LiveRequest {
string name = 1; 
}

message liveResponse {
string result = 1;
}
protoc自动生成代码
protoc --proto_path=. --micro_out=. --go_out=. proto/live.proto

此时proto文件下多出几个文件: 在这里插入图片描述

编写GO服务实现代码 live 目录下 创建 mian.go

package main

import (
	"context"
	"fmt"
	"github.com/micro/go-micro"
	proto "live/proto"
)

type LiveServiceHandler struct{}

func (g *LiveServiceHandler)Call(ctx context.Context, req *proto.LiveRequest, rsp *proto.LiveResponse) error {
	rsp.Result = "我的github:https://github.com/DOUBLE-Baller/" + req.Name
	return nil
}

func main()  {
	// 创建新的服务
	service := micro.NewService(
		micro.Name("go.micro.api.Live"), //go.micro.api 命名空间
	)

	// 初始化,会解析命令行参数
	service.Init()

	// 注册处理器,调用 Live 服务接口处理请求
	proto.RegisterLiveHandler(service.Server(), new(LiveServiceHandler))

	// 启动服务
	if err := service.Run(); err != nil {
		fmt.Println(err)
	}
}
go run main.go
如图表示成功启动服务 注意:添加环境变量 MICRO_REGISTRY=etcd 来统一设置 或者使用go run main.go --registry=etcd 命令手动注册服务

在这里插入图片描述 失败如下图 在这里插入图片描述

如遇此错误:添加go.mod最后一行即可!
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0

在这里插入图片描述

利用 go micro 提供 HTTP 服务接口

go get github.com/micro/micro/v2

安装完成后,会在 $GOPATH/bin 目录下创建一个 micro 可执行文件,cp 到/user/local/bin 下即可
micro api --handler=rpc
如下表示启动成功 默认端口8080 

在这里插入图片描述

访问IP:8080 如图 有防火墙的请添加规则放开8080端口即可访问!在这里插入图片描述 **ok 到此基础环境搭建完成 下面运行远程调用 api **

micro call go.micro.api.Live Live.Call '{"name": "momo"}'

在这里插入图片描述

编写代码

项目目录: 在这里插入图片描述

server: 服务启动入口 config: 服务配置 app: 每个服务私有代码 comm: 服务共有代码 sql: 项目sql文件 test: 长连接测试脚本

app服务介绍 在这里插入图片描述

1.tcp_conn
维持与客户端的TCP长连接,心跳,以及TCP拆包粘包,消息编解码
2.ws_conn
维持与客户端的WebSocket长连接,心跳,消息编解码
3.logic
设备信息,好友信息,群组信息管理,消息转发逻辑
4.user
可以根据自己的业务需求,进行扩展,也可以替换成自己的业务服务器

客户端接入流程

1.调用LogicExt.RegisterDevice接口,完成设备注册,获取设备ID(device_id),注意,一个设备只需完成一次注册即可,后续如果本地有device_id,就不需要注册了,举个例子,如果是APP第一次安装,就需要调用这个接口,后面即便是换账号登录,也不需要重新注册。
2.调用UserExt.SignIn接口,完成账户登录,获取账户登录的token。
3.建立长连接,使用步骤2拿到的token,完成长连接登录。
如果是web端,需要调用建立WebSocket时,将user_id,device_id,token,以URL参数的形式传递到服务器,完成长连接登录,例如:ws://localhost:8081/ws?user_id={user_id}&device_id={device_id}&token={token}
如果是APP端,就需要建立TCP长连接,在完成建立TCP长连接时,第一个包应该是长连接登录包(SignInInput),如果信息无误,客户端就会成功建立长连接。
4.使用长连接发送消息同步包(SyncInput),完成离线消息同步,注意:seq字段是客户端接收到消息的最大同步序列号,如果用户是换设备登录或者第一次登录,seq应该传0。
接下来,用户可以使用LogicExt.SendMessage接口来发送消息,消息接收方可以使用长连接接收到对应的消息。

未完待续

zhibo's People

Contributors

qmcloud avatar qmcloud123 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.