Create & Init Project...
This commit is contained in:
23
app/service/bbq/sys-msg/BUILD
Normal file
23
app/service/bbq/sys-msg/BUILD
Normal file
@ -0,0 +1,23 @@
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [
|
||||
":package-srcs",
|
||||
"//app/service/bbq/sys-msg/api/v1:all-srcs",
|
||||
"//app/service/bbq/sys-msg/cmd:all-srcs",
|
||||
"//app/service/bbq/sys-msg/internal/conf:all-srcs",
|
||||
"//app/service/bbq/sys-msg/internal/dao:all-srcs",
|
||||
"//app/service/bbq/sys-msg/internal/model:all-srcs",
|
||||
"//app/service/bbq/sys-msg/internal/server/grpc:all-srcs",
|
||||
"//app/service/bbq/sys-msg/internal/server/http:all-srcs",
|
||||
"//app/service/bbq/sys-msg/internal/service:all-srcs",
|
||||
],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
2
app/service/bbq/sys-msg/CHANGELOG.md
Normal file
2
app/service/bbq/sys-msg/CHANGELOG.md
Normal file
@ -0,0 +1,2 @@
|
||||
### v1.0.0
|
||||
1. 上线功能xxx
|
6
app/service/bbq/sys-msg/CONTRIBUTORS.md
Normal file
6
app/service/bbq/sys-msg/CONTRIBUTORS.md
Normal file
@ -0,0 +1,6 @@
|
||||
# Owner
|
||||
luxiaowei
|
||||
|
||||
# Author
|
||||
|
||||
# Reviewer
|
10
app/service/bbq/sys-msg/OWNERS
Normal file
10
app/service/bbq/sys-msg/OWNERS
Normal file
@ -0,0 +1,10 @@
|
||||
# See the OWNERS docs at https://go.k8s.io/owners
|
||||
|
||||
approvers:
|
||||
- luxiaowei
|
||||
labels:
|
||||
- bbq
|
||||
- service
|
||||
- service/bbq/sys-msg
|
||||
options:
|
||||
no_parent_owners: true
|
12
app/service/bbq/sys-msg/README.md
Normal file
12
app/service/bbq/sys-msg/README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# sys-msg-service
|
||||
|
||||
## 项目简介
|
||||
1.
|
||||
|
||||
## 编译环境
|
||||
|
||||
|
||||
## 依赖包
|
||||
|
||||
|
||||
## 编译执行
|
65
app/service/bbq/sys-msg/api/v1/BUILD
Normal file
65
app/service/bbq/sys-msg/api/v1/BUILD
Normal file
@ -0,0 +1,65 @@
|
||||
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 = ["api.proto"],
|
||||
tags = ["automanaged"],
|
||||
deps = [
|
||||
"@com_google_protobuf//:empty_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/service/bbq/sys-msg/api/v1",
|
||||
proto = ":v1_proto",
|
||||
tags = ["automanaged"],
|
||||
deps = [
|
||||
"//library/time:go_default_library",
|
||||
"@com_github_gogo_protobuf//gogoproto:go_default_library",
|
||||
"@io_bazel_rules_go//proto/wkt:empty_go_proto",
|
||||
],
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [],
|
||||
embed = [":v1_go_proto"],
|
||||
importpath = "go-common/app/service/bbq/sys-msg/api/v1",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//library/time:go_default_library",
|
||||
"@com_github_gogo_protobuf//gogoproto:go_default_library",
|
||||
"@com_github_gogo_protobuf//proto:go_default_library",
|
||||
"@io_bazel_rules_go//proto/wkt:empty_go_proto",
|
||||
"@org_golang_google_grpc//:go_default_library",
|
||||
"@org_golang_x_net//context: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"],
|
||||
)
|
1147
app/service/bbq/sys-msg/api/v1/api.pb.go
Normal file
1147
app/service/bbq/sys-msg/api/v1/api.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
57
app/service/bbq/sys-msg/api/v1/api.proto
Normal file
57
app/service/bbq/sys-msg/api/v1/api.proto
Normal file
@ -0,0 +1,57 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package bbq.service.sysmsg.v1;
|
||||
|
||||
import "google/protobuf/empty.proto";
|
||||
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
|
||||
|
||||
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
|
||||
option go_package = "v1";
|
||||
option (gogoproto.goproto_getters_all) = false;
|
||||
|
||||
|
||||
|
||||
message ListSysMsgReq {
|
||||
repeated int64 ids = 1 [(gogoproto.jsontag) = "ids", (gogoproto.moretags)='form:"ids" validate:"required"'];
|
||||
}
|
||||
|
||||
message ListSysMsgReply {
|
||||
// 用户mid
|
||||
int64 mid = 1 [(gogoproto.jsontag) = "mid"];
|
||||
repeated SysMsg list = 2[(gogoproto.jsontag) = "list,omitempty"];
|
||||
}
|
||||
|
||||
message SysMsg {
|
||||
int64 id = 1 [(gogoproto.jsontag) = "id"];
|
||||
int32 type = 2 [(gogoproto.jsontag) = "type", (gogoproto.moretags)='form:"type" validate:"required"'];
|
||||
int64 sender = 3 [(gogoproto.jsontag) = "sender", (gogoproto.moretags)='form:"sender" validate:"required"'];
|
||||
int64 receiver = 4 [(gogoproto.jsontag) = "receiver", (gogoproto.moretags)='form:"receiver" validate:"required"'];
|
||||
string jump_url = 5 [(gogoproto.jsontag) = "jump_url", (gogoproto.moretags)='form:"jump_url"'];
|
||||
string text = 6 [(gogoproto.jsontag) = "text", (gogoproto.moretags)='form:"text" validate:"required"'];
|
||||
int32 state = 7 [(gogoproto.jsontag) = "state", (gogoproto.moretags)='form:"state"'];
|
||||
int64 ctime = 8 [(gogoproto.jsontag) = "ctime", (gogoproto.casttype) = "go-common/library/time.Time"];
|
||||
}
|
||||
|
||||
|
||||
//还记得那年大明湖畔的东起吗
|
||||
//还记得那年大明湖畔的东起吗
|
||||
|
||||
service SysMsgService {
|
||||
// 获取系统通知
|
||||
rpc ListSysMsg(ListSysMsgReq) returns (ListSysMsgReply);
|
||||
// 创建消息
|
||||
rpc CreateSysMsg(SysMsg) returns (.google.protobuf.Empty);
|
||||
// 更新,一般是状态更新
|
||||
rpc UpdateSysMsg(SysMsg) returns (.google.protobuf.Empty);
|
||||
|
||||
}
|
||||
|
45
app/service/bbq/sys-msg/cmd/BUILD
Normal file
45
app/service/bbq/sys-msg/cmd/BUILD
Normal file
@ -0,0 +1,45 @@
|
||||
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"],
|
||||
data = ["test.toml"],
|
||||
importpath = "go-common/app/service/bbq/sys-msg/cmd",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/service/bbq/sys-msg/internal/conf:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/server/grpc:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/server/http:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/service:go_default_library",
|
||||
"//library/ecode/tip:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/trace: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"],
|
||||
)
|
51
app/service/bbq/sys-msg/cmd/main.go
Normal file
51
app/service/bbq/sys-msg/cmd/main.go
Normal file
@ -0,0 +1,51 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"go-common/app/service/bbq/sys-msg/internal/conf"
|
||||
"go-common/app/service/bbq/sys-msg/internal/server/grpc"
|
||||
"go-common/app/service/bbq/sys-msg/internal/server/http"
|
||||
"go-common/app/service/bbq/sys-msg/internal/service"
|
||||
ecode "go-common/library/ecode/tip"
|
||||
"go-common/library/log"
|
||||
"go-common/library/net/trace"
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
if err := conf.Init(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
log.Init(conf.Conf.Log)
|
||||
defer log.Close()
|
||||
log.Info("sys-msg-service start")
|
||||
trace.Init(conf.Conf.Tracer)
|
||||
defer trace.Close()
|
||||
ecode.Init(conf.Conf.Ecode)
|
||||
svc := service.New(conf.Conf)
|
||||
grpcServ := grpc.New(conf.Conf.GRPC, svc)
|
||||
http.Init(conf.Conf, 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:
|
||||
svc.Close()
|
||||
grpcServ.Shutdown(context.Background())
|
||||
log.Info("sys-msg-service exit")
|
||||
time.Sleep(time.Second)
|
||||
return
|
||||
case syscall.SIGHUP:
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
36
app/service/bbq/sys-msg/cmd/test.toml
Normal file
36
app/service/bbq/sys-msg/cmd/test.toml
Normal file
@ -0,0 +1,36 @@
|
||||
[log]
|
||||
stdout = true
|
||||
# dir = "./log/bbq"
|
||||
v = 5
|
||||
|
||||
[grpc]
|
||||
addr = "0.0.0.0:9004"
|
||||
timeout = "1s"
|
||||
|
||||
[bm]
|
||||
addr = "0.0.0.0:8804"
|
||||
timeout = "2s"
|
||||
|
||||
[mysql]
|
||||
addr = "172.16.38.91:3306"
|
||||
dsn = "root:123456@tcp(172.16.38.91:3306)/bbq?allowNativePasswords=true&timeout=800ms&readTimeout=1200ms&writeTimeout=800ms&parseTime=true&loc=Local&charset=utf8,utf8mb4"
|
||||
readDSN = ["root:123456@tcp(172.16.38.91:3306)/bbq?allowNativePasswords=true&timeout=800ms&readTimeout=1200ms&writeTimeout=800ms&parseTime=true&loc=Local&charset=utf8,utf8mb4"]
|
||||
active = 20
|
||||
idle = 10
|
||||
idleTimeout ="4h"
|
||||
queryTimeout = "800ms"
|
||||
execTimeout = "800ms"
|
||||
tranTimeout = "1000ms"
|
||||
|
||||
[redis]
|
||||
name = "bbq-web"
|
||||
proto = "tcp"
|
||||
addr = "172.16.38.91:6379"
|
||||
idle = 10
|
||||
active = 10
|
||||
dialTimeout = "1s"
|
||||
readTimeout = "1s"
|
||||
writeTimeout = "1s"
|
||||
idleTimeout = "10s"
|
||||
expire = "1m"
|
||||
|
40
app/service/bbq/sys-msg/internal/conf/BUILD
Normal file
40
app/service/bbq/sys-msg/internal/conf/BUILD
Normal file
@ -0,0 +1,40 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["conf.go"],
|
||||
importpath = "go-common/app/service/bbq/sys-msg/internal/conf",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//library/cache/redis:go_default_library",
|
||||
"//library/conf:go_default_library",
|
||||
"//library/database/sql:go_default_library",
|
||||
"//library/ecode/tip:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/http/blademaster:go_default_library",
|
||||
"//library/net/http/blademaster/middleware/verify:go_default_library",
|
||||
"//library/net/rpc/warden:go_default_library",
|
||||
"//library/net/trace:go_default_library",
|
||||
"//vendor/github.com/BurntSushi/toml: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"],
|
||||
)
|
88
app/service/bbq/sys-msg/internal/conf/conf.go
Normal file
88
app/service/bbq/sys-msg/internal/conf/conf.go
Normal file
@ -0,0 +1,88 @@
|
||||
package conf
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"flag"
|
||||
"go-common/library/net/rpc/warden"
|
||||
|
||||
"go-common/library/cache/redis"
|
||||
"go-common/library/conf"
|
||||
"go-common/library/database/sql"
|
||||
ecode "go-common/library/ecode/tip"
|
||||
"go-common/library/log"
|
||||
bm "go-common/library/net/http/blademaster"
|
||||
"go-common/library/net/http/blademaster/middleware/verify"
|
||||
"go-common/library/net/trace"
|
||||
|
||||
"github.com/BurntSushi/toml"
|
||||
)
|
||||
|
||||
var (
|
||||
confPath string
|
||||
client *conf.Client
|
||||
// Conf config
|
||||
Conf = &Config{}
|
||||
)
|
||||
|
||||
// Config .
|
||||
type Config struct {
|
||||
Log *log.Config
|
||||
BM *bm.ServerConfig
|
||||
Verify *verify.Config
|
||||
Tracer *trace.Config
|
||||
Redis *redis.Config
|
||||
MySQL *sql.Config
|
||||
Ecode *ecode.Config
|
||||
GRPC *warden.ServerConfig
|
||||
}
|
||||
|
||||
func init() {
|
||||
flag.StringVar(&confPath, "conf", "", "default config path")
|
||||
}
|
||||
|
||||
// Init init conf
|
||||
func Init() error {
|
||||
if confPath != "" {
|
||||
return local()
|
||||
}
|
||||
return remote()
|
||||
}
|
||||
|
||||
func local() (err error) {
|
||||
_, err = toml.DecodeFile(confPath, &Conf)
|
||||
return
|
||||
}
|
||||
|
||||
func remote() (err error) {
|
||||
if client, err = conf.New(); err != nil {
|
||||
return
|
||||
}
|
||||
if err = load(); err != nil {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
for range client.Event() {
|
||||
log.Info("config reload")
|
||||
if load() != nil {
|
||||
log.Error("config reload error (%v)", err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
return
|
||||
}
|
||||
|
||||
func load() (err error) {
|
||||
var (
|
||||
s string
|
||||
ok bool
|
||||
tmpConf *Config
|
||||
)
|
||||
if s, ok = client.Toml2(); !ok {
|
||||
return errors.New("load config center error")
|
||||
}
|
||||
if _, err = toml.Decode(s, &tmpConf); err != nil {
|
||||
return errors.New("could not decode config")
|
||||
}
|
||||
*Conf = *tmpConf
|
||||
return
|
||||
}
|
41
app/service/bbq/sys-msg/internal/dao/BUILD
Normal file
41
app/service/bbq/sys-msg/internal/dao/BUILD
Normal 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 = [
|
||||
"dao.cache.go",
|
||||
"dao.go",
|
||||
],
|
||||
importpath = "go-common/app/service/bbq/sys-msg/internal/dao",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/service/bbq/sys-msg/api/v1:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/conf:go_default_library",
|
||||
"//library/cache:go_default_library",
|
||||
"//library/cache/redis:go_default_library",
|
||||
"//library/database/sql:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/metadata:go_default_library",
|
||||
"//library/stat/prom: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"],
|
||||
)
|
80
app/service/bbq/sys-msg/internal/dao/dao.cache.go
Normal file
80
app/service/bbq/sys-msg/internal/dao/dao.cache.go
Normal file
@ -0,0 +1,80 @@
|
||||
// Code generated by $GOPATH/src/go-common/app/tool/cache/gen. DO NOT EDIT.
|
||||
|
||||
/*
|
||||
Package dao is a generated cache proxy package.
|
||||
It is generated from:
|
||||
type _cache interface {
|
||||
// cache: -batch=50 -batch_err=break -nullcache=&v1.SysMsg{Id:0} -check_null_code=$==nil||$.Id==0
|
||||
SysMsg(c context.Context, ids []int64) (map[int64]*v1.SysMsg, error)
|
||||
}
|
||||
*/
|
||||
|
||||
package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go-common/app/service/bbq/sys-msg/api/v1"
|
||||
"go-common/library/net/metadata"
|
||||
"go-common/library/stat/prom"
|
||||
)
|
||||
|
||||
var _ _cache
|
||||
|
||||
// SysMsg get data from cache if miss will call source method, then add to cache.
|
||||
func (d *Dao) SysMsg(c context.Context, keys []int64) (res map[int64]*v1.SysMsg, err error) {
|
||||
if len(keys) == 0 {
|
||||
return
|
||||
}
|
||||
addCache := true
|
||||
res, err = d.CacheSysMsg(c, keys)
|
||||
if err != nil {
|
||||
addCache = false
|
||||
res = nil
|
||||
err = nil
|
||||
}
|
||||
var miss []int64
|
||||
for _, key := range keys {
|
||||
if (res == nil) || (res[key] == nil) {
|
||||
miss = append(miss, key)
|
||||
}
|
||||
}
|
||||
prom.CacheHit.Add("SysMsg", int64(len(keys)-len(miss)))
|
||||
defer func() {
|
||||
for k, v := range res {
|
||||
if v == nil || v.Id == 0 {
|
||||
delete(res, k)
|
||||
}
|
||||
}
|
||||
}()
|
||||
if len(miss) == 0 {
|
||||
return
|
||||
}
|
||||
var missData map[int64]*v1.SysMsg
|
||||
prom.CacheMiss.Add("SysMsg", int64(len(miss)))
|
||||
missData, err = d.RawSysMsg(c, miss)
|
||||
if res == nil {
|
||||
res = make(map[int64]*v1.SysMsg)
|
||||
}
|
||||
for k, v := range missData {
|
||||
res[k] = v
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for _, key := range keys {
|
||||
if res[key] == nil {
|
||||
if missData == nil {
|
||||
missData = make(map[int64]*v1.SysMsg, len(keys))
|
||||
}
|
||||
missData[key] = &v1.SysMsg{Id: 0}
|
||||
}
|
||||
}
|
||||
if !addCache {
|
||||
return
|
||||
}
|
||||
d.cache.Save(func() {
|
||||
d.AddCacheSysMsg(metadata.WithContext(c), missData)
|
||||
})
|
||||
return
|
||||
}
|
163
app/service/bbq/sys-msg/internal/dao/dao.go
Normal file
163
app/service/bbq/sys-msg/internal/dao/dao.go
Normal file
@ -0,0 +1,163 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-common/library/cache"
|
||||
"strconv"
|
||||
|
||||
"go-common/library/cache/redis"
|
||||
xsql "go-common/library/database/sql"
|
||||
"go-common/library/log"
|
||||
|
||||
"go-common/app/service/bbq/sys-msg/api/v1"
|
||||
"go-common/app/service/bbq/sys-msg/internal/conf"
|
||||
)
|
||||
|
||||
const (
|
||||
_selectSQL = "select id, type, sender, receiver, jump_url, text, ctime, state from sys_msg where id in (%s)"
|
||||
_insertSQL = "insert into sys_msg (`type`,`sender`,`receiver`,`jump_url`,`text`) values (?,?,?,?)"
|
||||
_redisKey = "sys:msg:%d"
|
||||
_redisExpireS = 600
|
||||
)
|
||||
|
||||
//go:generate $GOPATH/src/go-common/app/tool/cache/gen
|
||||
type _cache interface {
|
||||
// cache: -batch=50 -max_group=10 -batch_err=break -nullcache=&v1.SysMsg{Id:0} -check_null_code=$==nil||$.Id==0
|
||||
SysMsg(c context.Context, ids []int64) (map[int64]*v1.SysMsg, error)
|
||||
}
|
||||
|
||||
// Dao dao
|
||||
type Dao struct {
|
||||
c *conf.Config
|
||||
cache *cache.Cache
|
||||
redis *redis.Pool
|
||||
db *xsql.DB
|
||||
}
|
||||
|
||||
// New init mysql db
|
||||
func New(c *conf.Config) (dao *Dao) {
|
||||
dao = &Dao{
|
||||
c: c,
|
||||
cache: cache.New(1, 1024),
|
||||
redis: redis.NewPool(c.Redis),
|
||||
db: xsql.NewMySQL(c.MySQL),
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Close close the resource.
|
||||
func (d *Dao) Close() {
|
||||
d.redis.Close()
|
||||
d.db.Close()
|
||||
}
|
||||
|
||||
// Ping dao ping
|
||||
func (d *Dao) Ping(ctx context.Context) error {
|
||||
// TODO: add mc,redis... if you use
|
||||
return d.db.Ping(ctx)
|
||||
}
|
||||
|
||||
// RawSysMsg 获取系统消息
|
||||
func (d *Dao) RawSysMsg(ctx context.Context, ids []int64) (res map[int64]*v1.SysMsg, err error) {
|
||||
if len(ids) == 0 {
|
||||
return
|
||||
}
|
||||
res = make(map[int64]*v1.SysMsg)
|
||||
|
||||
querySQL := fmt.Sprintf(_selectSQL, intJoin(ids, ","))
|
||||
log.V(1).Infov(ctx, log.KV("sql", querySQL))
|
||||
rows, err := d.db.Query(ctx, querySQL)
|
||||
if err != nil {
|
||||
log.Errorv(ctx, log.KV("log", "query mysql sys msg fail"), log.KV("sql", querySQL))
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
//"select id, type, sender, receiver, text, ctime from sys_msg where state = 0 and id in (%s)"
|
||||
for rows.Next() {
|
||||
var msg v1.SysMsg
|
||||
if err = rows.Scan(&msg.Id, &msg.Type, &msg.Sender, &msg.Receiver, &msg.JumpUrl, &msg.Text, &msg.Ctime, &msg.State); err != nil {
|
||||
log.Errorv(ctx, log.KV("log", "scan mysql sys msg fail"), log.KV("sql", querySQL))
|
||||
return
|
||||
}
|
||||
res[msg.Id] = &msg
|
||||
}
|
||||
|
||||
log.V(1).Infov(ctx, log.KV("log", "get sys msg from mysql"), log.KV("req_size", len(ids)), log.KV("rsp_size", len(res)))
|
||||
return
|
||||
}
|
||||
|
||||
// CreateSysMsg 创建系统消息
|
||||
func (d *Dao) CreateSysMsg(ctx context.Context, msg *v1.SysMsg) (err error) {
|
||||
result, err := d.db.Exec(ctx, _insertSQL, msg.Type, msg.Sender, msg.Receiver, msg.JumpUrl, msg.Text)
|
||||
if err != nil {
|
||||
log.Errorv(ctx, log.KV("log", "exec mysql fail: create sys msg"), log.KV("sql", _insertSQL), log.KV("msg", msg.String()))
|
||||
return
|
||||
}
|
||||
msgID, _ := result.LastInsertId()
|
||||
d.DelCacheSysMsg(ctx, msgID)
|
||||
return
|
||||
}
|
||||
|
||||
func intJoin(raw []int64, split string) (res string) {
|
||||
for i, v := range raw {
|
||||
if i != 0 {
|
||||
res += split
|
||||
}
|
||||
res += strconv.FormatInt(v, 10)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// CacheSysMsg .
|
||||
func (d *Dao) CacheSysMsg(ctx context.Context, ids []int64) (res map[int64]*v1.SysMsg, err error) {
|
||||
res = make(map[int64]*v1.SysMsg)
|
||||
conn := d.redis.Get(ctx)
|
||||
defer conn.Close()
|
||||
|
||||
for _, id := range ids {
|
||||
conn.Send("GET", fmt.Sprintf(_redisKey, id))
|
||||
}
|
||||
conn.Flush()
|
||||
for _, id := range ids {
|
||||
var by []byte
|
||||
by, err = redis.Bytes(conn.Receive())
|
||||
if err == redis.ErrNil {
|
||||
err = nil
|
||||
log.V(1).Infov(ctx, log.KV("log", "get sys msg nil from redis"), log.KV("id", id))
|
||||
continue
|
||||
}
|
||||
var msg v1.SysMsg
|
||||
if err = json.Unmarshal(by, &msg); err != nil {
|
||||
log.Errorv(ctx, log.KV("log", "unmarshal sys msg fail: str="+string(by)))
|
||||
return
|
||||
}
|
||||
res[id] = &msg
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DelCacheSysMsg 删除sys_msg缓存
|
||||
func (d *Dao) DelCacheSysMsg(ctx context.Context, msgID int64) {
|
||||
conn := d.redis.Get(ctx)
|
||||
defer conn.Close()
|
||||
redisKey := fmt.Sprintf(_redisKey, msgID)
|
||||
conn.Do("DEL", redisKey)
|
||||
log.V(1).Infov(ctx, log.KV("log", "del redis_key: "+redisKey))
|
||||
}
|
||||
|
||||
// AddCacheSysMsg 添加sys_msg缓存
|
||||
func (d *Dao) AddCacheSysMsg(ctx context.Context, msg map[int64]*v1.SysMsg) {
|
||||
conn := d.redis.Get(ctx)
|
||||
defer conn.Close()
|
||||
for id, val := range msg {
|
||||
b, _ := json.Marshal(val)
|
||||
conn.Send("SETEX", fmt.Sprintf(_redisKey, id), _redisExpireS, b)
|
||||
}
|
||||
conn.Flush()
|
||||
for range msg {
|
||||
conn.Receive()
|
||||
}
|
||||
}
|
28
app/service/bbq/sys-msg/internal/model/BUILD
Normal file
28
app/service/bbq/sys-msg/internal/model/BUILD
Normal 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/service/bbq/sys-msg/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"],
|
||||
)
|
1
app/service/bbq/sys-msg/internal/model/model.go
Normal file
1
app/service/bbq/sys-msg/internal/model/model.go
Normal file
@ -0,0 +1 @@
|
||||
package model
|
33
app/service/bbq/sys-msg/internal/server/grpc/BUILD
Normal file
33
app/service/bbq/sys-msg/internal/server/grpc/BUILD
Normal file
@ -0,0 +1,33 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["server.go"],
|
||||
importpath = "go-common/app/service/bbq/sys-msg/internal/server/grpc",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/service/bbq/sys-msg/api/v1:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/service:go_default_library",
|
||||
"//library/net/rpc/warden: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"],
|
||||
)
|
18
app/service/bbq/sys-msg/internal/server/grpc/server.go
Normal file
18
app/service/bbq/sys-msg/internal/server/grpc/server.go
Normal file
@ -0,0 +1,18 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
pb "go-common/app/service/bbq/sys-msg/api/v1"
|
||||
"go-common/app/service/bbq/sys-msg/internal/service"
|
||||
"go-common/library/net/rpc/warden"
|
||||
)
|
||||
|
||||
// New new warden rpc server
|
||||
func New(c *warden.ServerConfig, svc *service.Service) *warden.Server {
|
||||
ws := warden.NewServer(c)
|
||||
pb.RegisterSysMsgServiceServer(ws.Server(), svc)
|
||||
ws, err := ws.Start()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return ws
|
||||
}
|
38
app/service/bbq/sys-msg/internal/server/http/BUILD
Normal file
38
app/service/bbq/sys-msg/internal/server/http/BUILD
Normal file
@ -0,0 +1,38 @@
|
||||
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/service/bbq/sys-msg/internal/server/http",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/service/bbq/sys-msg/api/v1:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/conf:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/service:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/http/blademaster:go_default_library",
|
||||
"//library/net/http/blademaster/binding:go_default_library",
|
||||
"//library/net/http/blademaster/middleware/verify:go_default_library",
|
||||
"//vendor/github.com/pkg/errors: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"],
|
||||
)
|
84
app/service/bbq/sys-msg/internal/server/http/http.go
Normal file
84
app/service/bbq/sys-msg/internal/server/http/http.go
Normal file
@ -0,0 +1,84 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
"net/http"
|
||||
|
||||
"go-common/library/log"
|
||||
bm "go-common/library/net/http/blademaster"
|
||||
"go-common/library/net/http/blademaster/binding"
|
||||
"go-common/library/net/http/blademaster/middleware/verify"
|
||||
|
||||
"go-common/app/service/bbq/sys-msg/api/v1"
|
||||
"go-common/app/service/bbq/sys-msg/internal/conf"
|
||||
"go-common/app/service/bbq/sys-msg/internal/service"
|
||||
)
|
||||
|
||||
var (
|
||||
vfy *verify.Verify
|
||||
svc *service.Service
|
||||
)
|
||||
|
||||
// Init init
|
||||
func Init(c *conf.Config, s *service.Service) {
|
||||
svc = s
|
||||
vfy = verify.New(c.Verify)
|
||||
engine := bm.DefaultServer(c.BM)
|
||||
route(engine)
|
||||
if err := engine.Start(); err != nil {
|
||||
log.Error("bm Start error(%v)", err)
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func route(e *bm.Engine) {
|
||||
e.Ping(ping)
|
||||
e.Register(register)
|
||||
g := e.Group("/x/sys-msg")
|
||||
{
|
||||
g.GET("/msg/list", listSysMsg)
|
||||
g.POST("/msg/create", createSysMsg)
|
||||
g.POST("/msg/update", updateSysMsg)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
func createSysMsg(c *bm.Context) {
|
||||
arg := &v1.SysMsg{}
|
||||
if err := c.BindWith(arg, binding.JSON); err != nil {
|
||||
errors.Wrap(err, "参数验证失败")
|
||||
return
|
||||
}
|
||||
resp, err := svc.CreateSysMsg(c, arg)
|
||||
c.JSON(resp, err)
|
||||
}
|
||||
|
||||
func updateSysMsg(c *bm.Context) {
|
||||
arg := &v1.SysMsg{}
|
||||
if err := c.BindWith(arg, binding.JSON); err != nil {
|
||||
errors.Wrap(err, "参数验证失败")
|
||||
return
|
||||
}
|
||||
resp, err := svc.UpdateSysMsg(c, arg)
|
||||
c.JSON(resp, err)
|
||||
}
|
||||
|
||||
func listSysMsg(c *bm.Context) {
|
||||
arg := &v1.ListSysMsgReq{}
|
||||
if err := c.BindWith(arg, binding.Query); err != nil {
|
||||
errors.Wrap(err, "参数验证失败")
|
||||
return
|
||||
}
|
||||
resp, err := svc.ListSysMsg(c, arg)
|
||||
c.JSON(resp, err)
|
||||
}
|
35
app/service/bbq/sys-msg/internal/service/BUILD
Normal file
35
app/service/bbq/sys-msg/internal/service/BUILD
Normal file
@ -0,0 +1,35 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["service.go"],
|
||||
importpath = "go-common/app/service/bbq/sys-msg/internal/service",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/service/bbq/sys-msg/api/v1:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/conf:go_default_library",
|
||||
"//app/service/bbq/sys-msg/internal/dao:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"@io_bazel_rules_go//proto/wkt:empty_go_proto",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
80
app/service/bbq/sys-msg/internal/service/service.go
Normal file
80
app/service/bbq/sys-msg/internal/service/service.go
Normal file
@ -0,0 +1,80 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/golang/protobuf/ptypes/empty"
|
||||
"go-common/library/log"
|
||||
|
||||
"go-common/app/service/bbq/sys-msg/api/v1"
|
||||
"go-common/app/service/bbq/sys-msg/internal/conf"
|
||||
"go-common/app/service/bbq/sys-msg/internal/dao"
|
||||
)
|
||||
|
||||
// Service struct
|
||||
type Service struct {
|
||||
c *conf.Config
|
||||
dao *dao.Dao
|
||||
}
|
||||
|
||||
// New init
|
||||
func New(c *conf.Config) (s *Service) {
|
||||
s = &Service{
|
||||
c: c,
|
||||
dao: dao.New(c),
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// Ping Service
|
||||
func (s *Service) Ping(ctx context.Context) (err error) {
|
||||
return s.dao.Ping(ctx)
|
||||
}
|
||||
|
||||
// Close Service
|
||||
func (s *Service) Close() {
|
||||
s.dao.Close()
|
||||
}
|
||||
|
||||
// ListSysMsg 获取系统通知
|
||||
func (s *Service) ListSysMsg(ctx context.Context, req *v1.ListSysMsgReq) (res *v1.ListSysMsgReply, err error) {
|
||||
res = new(v1.ListSysMsgReply)
|
||||
if len(req.Ids) == 0 {
|
||||
return
|
||||
}
|
||||
msgMap, err := s.dao.SysMsg(ctx, req.Ids)
|
||||
if err != nil {
|
||||
log.Errorv(ctx, log.KV("log", "list sys msg fail: req="+req.String()))
|
||||
}
|
||||
for _, id := range req.Ids {
|
||||
val, exists := msgMap[id]
|
||||
if !exists {
|
||||
log.Errorv(ctx)
|
||||
continue
|
||||
}
|
||||
// 只返回状态可见的msg,当id=0时表示穿透,也就是无效id
|
||||
if val.Id != 0 && val.State == 0 {
|
||||
res.List = append(res.List, val)
|
||||
} else {
|
||||
log.V(1).Infov(ctx, log.KV("log", "no show msg"), log.KV("id", id), log.KV("msg", val.String()))
|
||||
}
|
||||
}
|
||||
log.V(1).Infov(ctx, log.KV("req_size", len(req.Ids)), log.KV("rsp_size", len(res.List)))
|
||||
return
|
||||
}
|
||||
|
||||
// CreateSysMsg 创建消息
|
||||
func (s *Service) CreateSysMsg(ctx context.Context, req *v1.SysMsg) (res *empty.Empty, err error) {
|
||||
res = new(empty.Empty)
|
||||
err = s.dao.CreateSysMsg(ctx, req)
|
||||
if err != nil {
|
||||
log.Errorv(ctx, log.KV("log", "create sys msg fail: req="+req.String()))
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// UpdateSysMsg 更新,一般是状态更新
|
||||
func (s *Service) UpdateSysMsg(ctx context.Context, req *v1.SysMsg) (res *empty.Empty, err error) {
|
||||
res = new(empty.Empty)
|
||||
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user