Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
### v1.0.0
1. 上线功能xxx

View File

@@ -0,0 +1,6 @@
# Owner
houjin
# Author
# Reviewer

View File

@@ -0,0 +1,10 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- houjin
labels:
- interface
- interface/live/open-interface
- live
options:
no_parent_owners: true

View File

@@ -0,0 +1,12 @@
# open-interface-interface
## 项目简介
1.
## 编译环境
## 依赖包
## 编译执行

View File

@@ -0,0 +1,63 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "v1_proto",
srcs = ["dm.proto"],
tags = ["automanaged"],
deps = [
"@go_googleapis//google/api:annotations_proto",
"@gogo_special_proto//github.com/gogo/protobuf/gogoproto",
],
)
go_proto_library(
name = "v1_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/open-interface/api/http/v1",
proto = ":v1_proto",
tags = ["automanaged"],
deps = [
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@go_googleapis//google/api:annotations_go_proto",
],
)
go_library(
name = "go_default_library",
srcs = ["dm.bm.go"],
embed = [":v1_go_proto"],
importpath = "go-common/app/interface/live/open-interface/api/http/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"//vendor/google.golang.org/genproto/googleapis/api/annotations:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,72 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: dm.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
dm.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathDmSendmsg = "/xlive/open-interface/v1/dm/sendmsg"
var PathDmGetConf = "/xlive/open-interface/v1/dm/getConf"
// ============
// Dm Interface
// ============
type DmBMServer interface {
// `method:"POST"`
Sendmsg(ctx context.Context, req *SendMsgReq) (resp *SendMsgResp, err error)
GetConf(ctx context.Context, req *GetConfReq) (resp *GetConfResp, err error)
}
var v1DmSvc DmBMServer
func dmSendmsg(c *bm.Context) {
p := new(SendMsgReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1DmSvc.Sendmsg(c, p)
c.JSON(resp, err)
}
func dmGetConf(c *bm.Context) {
p := new(GetConfReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1DmSvc.GetConf(c, p)
c.JSON(resp, err)
}
// RegisterV1DmService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1DmService(e *bm.Engine, svc DmBMServer, midMap map[string]bm.HandlerFunc) {
v1DmSvc = svc
e.POST("/xlive/open-interface/v1/dm/sendmsg", dmSendmsg)
e.GET("/xlive/open-interface/v1/dm/getConf", dmGetConf)
}
// RegisterDmBMServer Register the blademaster route
func RegisterDmBMServer(e *bm.Engine, server DmBMServer) {
v1DmSvc = server
e.POST("/xlive/open-interface/v1/dm/sendmsg", dmSendmsg)
e.GET("/xlive/open-interface/v1/dm/getConf", dmGetConf)
}

View File

@@ -0,0 +1,70 @@
<!-- package=live.openinterface.v1 -->
- [/xlive/open-interface/v1/dm/sendmsg](#xliveopen-interfacev1dmsendmsg)
- [/xlive/open-interface/v1/dm/getConf](#xliveopen-interfacev1dmgetConf)
## /xlive/open-interface/v1/dm/sendmsg
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|Msg|是|string||
|Ts|是|string||
|RoomID|是|integer||
|Group|是|string||
|Sign|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/open-interface/v1/dm/getConf
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|Ts|是|string||
|Sign|是|string||
|Group|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"ws_port": [
0
],
"wss_port": [
0
],
"tcp_port": [
0
],
"ip_list": [
""
],
"domain_list": [
""
]
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
syntax = "proto3";
package live.openinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "google/api/annotations.proto";
service dm {
// `method:"POST"`
rpc sendmsg (SendMsgReq) returns (SendMsgResp) {
option (google.api.http) = {
post:"/xlive/open-interface/v1/dm/sendmsg"
};
};
rpc getConf (GetConfReq) returns (GetConfResp) {
option (google.api.http) = {
get:"/xlive/open-interface/v1/dm/getConf"
};
};
}
message SendMsgReq {
string Msg = 1 [(gogoproto.moretags) = 'form:"msg" validate:"required"'];
string Ts = 2 [(gogoproto.moretags) = 'form:"ts" validate:"required"'];
int64 RoomID = 3 [(gogoproto.moretags) = 'form:"room_id" validate:"required"'];
string Group = 4 [(gogoproto.moretags) = 'form:"group" validate:"required"'];
string Sign = 5 [(gogoproto.moretags) = 'form:"sign" validate:"required"'];
}
message SendMsgResp {
}
message GetConfReq {
string Ts = 1 [(gogoproto.moretags) = 'form:"ts" validate:"required"'];
string Sign = 2 [(gogoproto.moretags) = 'form:"sign" validate:"required"'];
string Group = 3 [(gogoproto.moretags) = 'form:"group" validate:"required"'];
}
message GetConfResp {
repeated int64 WSPort = 1 [(gogoproto.jsontag) = 'ws_port'];
repeated int64 WSSPort = 2 [(gogoproto.jsontag) = 'wss_port'];
repeated int64 TCPPort = 3 [(gogoproto.jsontag) = 'tcp_port'];
repeated string IPList = 4 [(gogoproto.jsontag) = 'ip_list'];
repeated string DomianList = 5 [(gogoproto.jsontag) = 'domain_list'];
}

View File

@@ -0,0 +1,42 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
importpath = "go-common/app/interface/live/open-interface/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/open-interface/internal/server/http:go_default_library",
"//app/interface/live/open-interface/internal/service:go_default_library",
"//library/conf/paladin:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,48 @@
package main
import (
"context"
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/interface/live/open-interface/internal/server/http"
"go-common/app/interface/live/open-interface/internal/service"
"go-common/library/conf/paladin"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
)
func main() {
flag.Parse()
if err := paladin.Init(); err != nil {
panic(err)
}
log.Init(nil) // debug flag: log.dir={path}
defer log.Close()
log.Info("open-interface-interface start")
ecode.Init(nil)
svc := service.New()
httpSrv := http.New(svc)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
ctx, cancel := context.WithTimeout(context.Background(), 35*time.Second)
defer cancel()
httpSrv.Shutdown(ctx)
log.Info("open-interface-interface exit")
svc.Close()
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,2 @@
# This is a TOML document. Boom

View File

@@ -0,0 +1,4 @@
[server]
addr = "0.0.0.0:8000"
timeout = "1s"

View File

@@ -0,0 +1,13 @@
demoExpire = "24h"
[demo]
name = "open-interface"
proto = "tcp"
addr = "127.0.0.1:11211"
active = 50
idle = 10
dialTimeout = "100ms"
readTimeout = "200ms"
writeTimeout = "300ms"
idleTimeout = "80s"

View File

@@ -0,0 +1,11 @@
[demo]
addr = "127.0.0.1:3306"
dsn = "{user}:{password}@tcp(127.0.0.1:3306)/{database}?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"
readDSN = ["{user}:{password}@tcp(127.0.0.2:3306)/{database}?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8","{user}:{password}@tcp(127.0.0.3:3306)/{database}?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8,utf8mb4"]
active = 20
idle = 10
idleTimeout ="4h"
queryTimeout = "200ms"
execTimeout = "300ms"
tranTimeout = "400ms"

View File

@@ -0,0 +1,13 @@
demoExpire = "24h"
[demo]
name = "open-interface"
proto = "tcp"
addr = "127.0.0.1:6389"
idle = 10
active = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"grpc.go",
],
importpath = "go-common/app/interface/live/open-interface/internal/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//app/service/live/broadcast-proxy/api/v1:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,88 @@
package dao
import (
"context"
)
// Dao dao.
type Dao struct {
// db *sql.DB
// redis *redis.Pool
// redisExpire int32
// mc *memcache.Pool
// mcExpire int32
}
// func checkErr(err error) {
// if err != nil {
// panic(err)
// }
// }
// New new a dao and return.
func New() (dao *Dao) {
// var (
// dc struct {
// Demo *sql.Config
// }
// rc struct {
// Demo *redis.Config
// DemoExpire xtime.Duration
// }
// mc struct {
// Demo *memcache.Config
// DemoExpire xtime.Duration
// }
// )
// checkErr(paladin.Get("mysql.toml").UnmarshalTOML(&dc))
// checkErr(paladin.Get("redis.toml").UnmarshalTOML(&rc))
// checkErr(paladin.Get("memcache.toml").UnmarshalTOML(&mc))
dao = &Dao{
// // mysql
// db: sql.NewMySQL(dc.Demo),
// // redis
// redis: redis.NewPool(rc.Demo),
// redisExpire: int32(time.Duration(rc.DemoExpire) / time.Second),
// // memcache
// mc: memcache.NewPool(mc.Demo),
// mcExpire: int32(time.Duration(mc.DemoExpire) / time.Second),
}
return
}
// Close close the resource.
func (d *Dao) Close() {
// d.mc.Close()
// d.redis.Close()
// d.db.Close()
}
// Ping ping the resource.
func (d *Dao) Ping(ctx context.Context) (err error) {
// if err = d.pingMC(ctx); err != nil {
// return
// }
// if err = d.pingRedis(ctx); err != nil {
// return
// }
// return d.db.Ping(ctx)
return nil
}
// func (d *Dao) pingMC(ctx context.Context) (err error) {
// conn := d.mc.Get(ctx)
// defer conn.Close()
// if err = conn.Set(&memcache.Item{Key: "ping", Value: []byte("pong"), Expiration: 0}); err != nil {
// log.Error("conn.Set(PING) error(%v)", err)
// }
// return
// }
// func (d *Dao) pingRedis(ctx context.Context) (err error) {
// conn := d.redis.Get(ctx)
// defer conn.Close()
// if _, err = conn.Do("SET", "ping", "pong"); err != nil {
// log.Error("conn.Set(PING) error(%v)", err)
// }
// return
// }

View File

@@ -0,0 +1,19 @@
package dao
import (
broadcasrtService "go-common/app/service/live/broadcast-proxy/api/v1"
)
var (
//BcastClient 弹幕服务
BcastClient *broadcasrtService.Client
)
//InitGrpc 初始化grpcclient
func InitGrpc() {
var err error
BcastClient, err = broadcasrtService.NewClient(nil)
if err != nil {
panic(err)
}
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["model.go"],
importpath = "go-common/app/interface/live/open-interface/internal/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1 @@
package model

View File

@@ -0,0 +1,36 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["http.go"],
importpath = "go-common/app/interface/live/open-interface/internal/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/open-interface/api/http/v1:go_default_library",
"//app/interface/live/open-interface/internal/service:go_default_library",
"//library/conf/paladin:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,63 @@
package http
import (
"net/http"
dmv1pb "go-common/app/interface/live/open-interface/api/http/v1"
"go-common/app/interface/live/open-interface/internal/service"
"go-common/library/conf/paladin"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
svc *service.Service
)
// New new a bm server.
func New(s *service.Service) (engine *bm.Engine) {
var (
hc struct {
Server *bm.ServerConfig
}
)
if err := paladin.Get("http.toml").UnmarshalTOML(&hc); err != nil {
if err != paladin.ErrNotExist {
panic(err)
}
}
svc = s
engine = bm.DefaultServer(hc.Server)
initRouter(engine, verify.New(nil))
if err := engine.Start(); err != nil {
panic(err)
}
return
}
func initRouter(e *bm.Engine, v *verify.Verify) {
e.Ping(ping)
e.Register(register)
g := e.Group("/x/open-interface")
{
g.GET("/start", v.Verify, howToStart)
}
dmv1pb.RegisterDmBMServer(e, svc)
}
func ping(ctx *bm.Context) {
if err := svc.Ping(ctx); err != nil {
log.Error("ping error(%v)", err)
ctx.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func register(c *bm.Context) {
c.JSON(map[string]interface{}{}, nil)
}
// example for http request handler.
func howToStart(c *bm.Context) {
c.String(0, "Golang 大法好 !!!")
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dm.go",
"service.go",
],
importpath = "go-common/app/interface/live/open-interface/internal/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/live/open-interface/api/http/v1:go_default_library",
"//app/interface/live/open-interface/internal/dao:go_default_library",
"//app/service/live/broadcast-proxy/api/v1:go_default_library",
"//app/service/live/resource/sdk:go_default_library",
"//library/conf/paladin:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,101 @@
package service
import (
"context"
"crypto/md5"
"encoding/json"
"fmt"
"math"
"strconv"
"time"
dmv1pb "go-common/app/interface/live/open-interface/api/http/v1"
"go-common/app/interface/live/open-interface/internal/dao"
broadcasrtService "go-common/app/service/live/broadcast-proxy/api/v1"
titansSdk "go-common/app/service/live/resource/sdk"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
)
func checksign(ts string, sign string, group string) bool {
sts := time.Now().Unix()
cts, _ := strconv.ParseInt(ts, 10, 64)
dv := sts - cts
if math.Abs(float64(dv)) > 5 {
log.Info("[dm] ts err: %+d", dv)
return false
}
userSecrets, terr := titansSdk.Get("dmUser")
if terr != nil {
log.Error("[dm] get titan conf err: %+v", terr)
return false
}
juserSecrets := make(map[string]string)
if jerr := json.Unmarshal([]byte(userSecrets), &juserSecrets); jerr != nil {
log.Error("[dm] JSON decode titan conf err: %+v", terr)
return false
}
secret, ok := juserSecrets[group]
if !ok {
log.Info("[dm] unknow group: %+v", group)
return false
}
newSign := fmt.Sprintf("%x", md5.Sum([]byte(group+secret+ts)))
if newSign != sign {
log.Info("[dm] check sign err sign: %+s service sign: %s", sign, newSign)
return false
}
return true
}
//Sendmsg 发送弹幕消息
func (s *Service) Sendmsg(ctx context.Context, req *dmv1pb.SendMsgReq) (resp *dmv1pb.SendMsgResp, err error) {
if ok := checksign(req.GetTs(), req.GetSign(), req.GetGroup()); !ok {
return nil, ecode.Error(-403, "sign or ts error")
}
var dmString = "{\"cmd\":\"DANMU_MSG\",\"info\":[[0,1,25,16777215,%d,0,0,\"\",0,0,0],\"%s\",[0,\"\",0,0,0,0,0,\"\"],[],[0,0,0,\"\"],[\"\",\"\"],0,0]}"
breq := &broadcasrtService.RoomMessageRequest{
RoomId: int32(req.GetRoomID()),
Message: fmt.Sprintf(dmString, time.Now().Unix(), req.GetMsg()),
}
_, berr := dao.BcastClient.DanmakuClient.RoomMessage(ctx, breq)
if berr != nil {
log.Error("[dm] SendBroadCastGrpc err: %+v", berr)
return nil, ecode.Error(-400, "send msg err")
}
return
}
//GetConf 获取弹幕配置
func (s *Service) GetConf(ctx context.Context, req *dmv1pb.GetConfReq) (resp *dmv1pb.GetConfResp, err error) {
if ok := checksign(req.GetTs(), req.GetSign(), req.GetGroup()); !ok {
return nil, ecode.Error(-403, "sign or ts error")
}
resp = &dmv1pb.GetConfResp{
WSPort: []int64{2244},
WSSPort: []int64{443},
TCPPort: []int64{2243, 80},
DomianList: []string{},
}
breq := &broadcasrtService.DispatchRequest{
UserIp: metadata.String(ctx, metadata.RemoteIP),
}
bresp, berr := dao.BcastClient.Dispatch(ctx, breq)
if berr != nil {
resp.IPList = []string{"broadcastlv.chat.bilibili.com"}
resp.DomianList = []string{"broadcastlv.chat.bilibili.com"}
log.Error("[dm] get IPList by BcastClient Dispatch err:%+v", berr)
} else {
resp.IPList = bresp.Ip
resp.DomianList = bresp.Host
}
return resp, nil
}

View File

@@ -0,0 +1,50 @@
package service
import (
"context"
"go-common/app/interface/live/open-interface/internal/dao"
titansSdk "go-common/app/service/live/resource/sdk"
"go-common/library/conf/paladin"
)
// Service service.
type Service struct {
ac *paladin.Map
dao *dao.Dao
}
// New new a service and return.
func New() (s *Service) {
var ac = new(paladin.TOML)
if err := paladin.Watch("application.toml", ac); err != nil {
panic(err)
}
s = &Service{
ac: ac,
dao: dao.New(),
}
dao.InitGrpc()
InitTitan()
return s
}
//InitTitan 初始化kv配置
func InitTitan() {
conf := &titansSdk.Config{
TreeId: 82686,
Expire: 1,
}
titansSdk.Init(conf)
}
// Ping ping the resource.
func (s *Service) Ping(ctx context.Context) (err error) {
return s.dao.Ping(ctx)
}
// Close close the resource.
func (s *Service) Close() {
s.dao.Close()
}