From 14bef681add8d1acad99751d15b8a5d94a78654f Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Wed, 5 Mar 2025 18:23:08 +0800 Subject: [PATCH 1/6] feat(payment): add RocketMQ configuration to payment service --- app/payment/conf/conf.go | 5 +++++ app/payment/conf/conf.yaml | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/payment/conf/conf.go b/app/payment/conf/conf.go index fea8c92..c0fe297 100644 --- a/app/payment/conf/conf.go +++ b/app/payment/conf/conf.go @@ -54,6 +54,11 @@ type Config struct { CallBackUrl string `mapstructure:"callback_url"` NotifyBackUrl string `mapstructure:"notifyback_url"` } `mapstructure:"alipay"` + + RocketMQ struct { + NamesrvAddr string `mapstructure:"namesrv_addr"` + GroupID string `mapstructure:"group_id"` + } `mapstructure:"rocketmq"` } // GetConf gets configuration instance diff --git a/app/payment/conf/conf.yaml b/app/payment/conf/conf.yaml index 8321280..a77fefa 100644 --- a/app/payment/conf/conf.yaml +++ b/app/payment/conf/conf.yaml @@ -26,4 +26,8 @@ alipay: app_id: "202100011768" private_key: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQ5Q5Q" callback_url: "http://localhost:8888/payment/alipay/callback" - notifyback_url: "http://localhost:8888/payment/alipay/notify" \ No newline at end of file + notifyback_url: "http://localhost:8888/payment/alipay/notify" + +rocketmq: + namesrv_addr: "10.21.22.54:8081" + group_id: "payment_group" From 36bf4ccd2aa4a0f27a07d7d46ab264fd2f72949a Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Wed, 5 Mar 2025 18:37:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(payment):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=87=AA=E5=8A=A8=E5=8F=96=E6=B6=88=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 RocketMQ 相关代码,实现消息队列的初始化和自动取消订单的消息发送- 添加自动取消订单的服务和处理逻辑 - 在订单创建时发送延迟消息,用于自动取消未支付的订单 --- app/payment/biz/fsm/order.go | 15 +- app/payment/biz/mq/rocketmq.go | 141 ++++++++++++++++++ .../biz/service/auto_cancel_service.go | 57 +++++++ app/payment/main.go | 23 ++- 4 files changed, 228 insertions(+), 8 deletions(-) create mode 100644 app/payment/biz/mq/rocketmq.go create mode 100644 app/payment/biz/service/auto_cancel_service.go diff --git a/app/payment/biz/fsm/order.go b/app/payment/biz/fsm/order.go index e079fc0..a9e1aa9 100644 --- a/app/payment/biz/fsm/order.go +++ b/app/payment/biz/fsm/order.go @@ -3,19 +3,17 @@ package fsm import ( "context" "fmt" - - "github.com/doutokk/doutok/app/payment/biz/pay" - - //"github.com/doutokk/doutok/app/payment/infra/rpc" - //"github.com/doutokk/doutok/rpc_gen/kitex_gen/order" "time" + "github.com/doutokk/doutok/app/payment/biz/mq" + "github.com/doutokk/doutok/app/payment/biz/pay" "github.com/doutokk/doutok/app/payment/conf" "github.com/doutokk/doutok/common/lock" "github.com/doutokk/doutok/app/payment/biz/dal/model" "github.com/doutokk/doutok/app/payment/biz/dal/query" + "github.com/cloudwego/kitex/pkg/klog" "github.com/looplab/fsm" ) @@ -130,6 +128,13 @@ func NewOrder(req CreatePayOrderReq) (*PayOrderFSM, error) { return nil, fmt.Errorf("failed to create payment log: %w", err) } + // Send delayed message for auto-cancellation after 30 minutes + err = mq.SendOrderCancelDelayedMessage(req.OrderId, req.UserId, 30*time.Minute) + if err != nil { + klog.Warnf("Failed to schedule auto-cancellation for order %s: %v", req.OrderId, err) + // Don't fail the order creation if scheduling fails + } + return o, nil } diff --git a/app/payment/biz/mq/rocketmq.go b/app/payment/biz/mq/rocketmq.go new file mode 100644 index 0000000..42db6af --- /dev/null +++ b/app/payment/biz/mq/rocketmq.go @@ -0,0 +1,141 @@ +package mq + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/apache/rocketmq-client-go/v5" + "github.com/apache/rocketmq-client-go/v5/consumer" + "github.com/apache/rocketmq-client-go/v5/primitive" + "github.com/apache/rocketmq-client-go/v5/producer" + "github.com/cloudwego/kitex/pkg/klog" + "github.com/doutokk/doutok/app/payment/conf" +) + +const ( + TopicOrderAutoCancel = "topic_order_auto_cancel" +) + +// OrderCancelMessage represents the message structure for order cancellation +type OrderCancelMessage struct { + OrderID string `json:"order_id"` + UserID uint32 `json:"user_id"` +} + +var ( + rocketProducer rocketmq.Producer + rocketConsumer rocketmq.PushConsumer +) + +// Initialize sets up RocketMQ producer and consumer +func Initialize() error { + // Initialize producer + var err error + rocketProducer, err = rocketmq.NewProducer( + producer.WithNameServer([]string{conf.GetConf().RocketMQ.NamesrvAddr}), + producer.WithGroupName(conf.GetConf().RocketMQ.GroupID), + producer.WithRetry(2), + ) + if err != nil { + return fmt.Errorf("failed to create RocketMQ producer: %w", err) + } + + err = rocketProducer.Start() + if err != nil { + return fmt.Errorf("failed to start RocketMQ producer: %w", err) + } + + klog.Info("RocketMQ producer started successfully") + return nil +} + +// CleanUp properly shuts down RocketMQ clients +func CleanUp() { + if rocketProducer != nil { + err := rocketProducer.Shutdown() + if err != nil { + klog.Errorf("Error shutting down RocketMQ producer: %v", err) + } + } + + if rocketConsumer != nil { + err := rocketConsumer.Shutdown() + if err != nil { + klog.Errorf("Error shutting down RocketMQ consumer: %v", err) + } + } +} + +// SendOrderCancelDelayedMessage sends a delayed message to auto-cancel an order after the delay period +func SendOrderCancelDelayedMessage(orderID string, userID uint32, delay time.Duration) error { + msg := &OrderCancelMessage{ + OrderID: orderID, + UserID: userID, + } + + body, err := json.Marshal(msg) + if err != nil { + return fmt.Errorf("failed to marshal order cancel message: %w", err) + } + + message := primitive.NewMessage(TopicOrderAutoCancel, body) + + // Set the delay level (RocketMQ uses predefined delay levels) + // 1s, 5s, 10s, 30s, 1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 10m, 20m, 30m, 1h, 2h + // We want 30m, which is level 16 + message.WithDelayTimeLevel(16) // 30 minutes + + _, err = rocketProducer.SendSync(context.Background(), message) + if err != nil { + return fmt.Errorf("failed to send delayed message: %w", err) + } + + klog.Infof("Sent delayed message for order auto-cancellation: OrderID=%s, UserID=%d", orderID, userID) + return nil +} + +// StartOrderCancelConsumer initializes and starts the consumer for order auto-cancellation +func StartOrderCancelConsumer(handleOrderCancel func(context.Context, string, uint32) error) error { + var err error + rocketConsumer, err = rocketmq.NewPushConsumer( + consumer.WithNameServer([]string{conf.GetConf().RocketMQ.NamesrvAddr}), + consumer.WithGroupName(conf.GetConf().RocketMQ.GroupID), + consumer.WithConsumerModel(consumer.Clustering), + ) + if err != nil { + return fmt.Errorf("failed to create RocketMQ consumer: %w", err) + } + + err = rocketConsumer.Subscribe(TopicOrderAutoCancel, consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) { + for _, msg := range msgs { + var message OrderCancelMessage + err := json.Unmarshal(msg.Body, &message) + if err != nil { + klog.Errorf("Failed to unmarshal order cancel message: %v", err) + continue + } + + klog.Infof("Received order auto-cancellation message: OrderID=%s, UserID=%d", message.OrderID, message.UserID) + + err = handleOrderCancel(ctx, message.OrderID, message.UserID) + if err != nil { + klog.Errorf("Failed to auto-cancel order %s: %v", message.OrderID, err) + return consumer.ConsumeRetryLater, nil + } + } + return consumer.ConsumeSuccess, nil + }) + if err != nil { + return fmt.Errorf("failed to subscribe to topic: %w", err) + } + + err = rocketConsumer.Start() + if err != nil { + return fmt.Errorf("failed to start RocketMQ consumer: %w", err) + } + + klog.Info("RocketMQ consumer started successfully") + return nil +} diff --git a/app/payment/biz/service/auto_cancel_service.go b/app/payment/biz/service/auto_cancel_service.go new file mode 100644 index 0000000..db3068b --- /dev/null +++ b/app/payment/biz/service/auto_cancel_service.go @@ -0,0 +1,57 @@ +package service + +import ( + "context" + "fmt" + + "github.com/cloudwego/kitex/pkg/klog" + "github.com/doutokk/doutok/app/payment/biz/dal/query" + "github.com/doutokk/doutok/app/payment/biz/fsm" +) + +// AutoCancelOrderService handles automatic cancellation of orders +type AutoCancelOrderService struct { +} + +// NewAutoCancelOrderService creates a new instance of AutoCancelOrderService +func NewAutoCancelOrderService() *AutoCancelOrderService { + return &AutoCancelOrderService{} +} + +// HandleOrderCancel processes the auto-cancellation of an order +func (s *AutoCancelOrderService) HandleOrderCancel(ctx context.Context, orderID string, userID uint32) error { + klog.Infof("Processing auto-cancellation for order %s", orderID) + + // Check current order status in the database + l := query.Q.PaymentLog + paymentLog, err := l.Where(l.OrderId.Eq(orderID)).First() + if err != nil { + return fmt.Errorf("failed to find payment log for order %s: %w", orderID, err) + } + + // If the order is already in FINISH state, do nothing + if paymentLog.Status == string(fsm.FINISH) { + klog.Infof("Order %s is already in FINISH state, skipping auto-cancellation", orderID) + return nil + } + + // If order is in CANCELLED state, do nothing + if paymentLog.Status == string(fsm.CANCELLED) { + klog.Infof("Order %s is already in CANCELLED state, skipping auto-cancellation", orderID) + return nil + } + + // Restore the FSM and cancel the order + orderFSM, err := fsm.RestoreFromDB(orderID) + if err != nil { + return fmt.Errorf("failed to restore order FSM for auto-cancellation: %w", err) + } + + err = orderFSM.CancelPayment(ctx) + if err != nil { + return fmt.Errorf("failed to auto-cancel order %s: %w", orderID, err) + } + + klog.Infof("Successfully auto-cancelled order %s after timeout", orderID) + return nil +} diff --git a/app/payment/main.go b/app/payment/main.go index bf76b99..7d762a1 100644 --- a/app/payment/main.go +++ b/app/payment/main.go @@ -1,11 +1,16 @@ package main import ( + "net" + "os" + "github.com/cloudwego/kitex/pkg/klog" "github.com/cloudwego/kitex/server" "github.com/doutokk/doutok/app/payment/biz/dal" "github.com/doutokk/doutok/app/payment/biz/dal/mysql" "github.com/doutokk/doutok/app/payment/biz/dal/query" + "github.com/doutokk/doutok/app/payment/biz/mq" + "github.com/doutokk/doutok/app/payment/biz/service" "github.com/doutokk/doutok/app/payment/conf" "github.com/doutokk/doutok/app/payment/infra/rpc" "github.com/doutokk/doutok/common/mtl" @@ -13,8 +18,6 @@ import ( "github.com/doutokk/doutok/rpc_gen/kitex_gen/payment/paymentservice" "github.com/joho/godotenv" kitexlogrus "github.com/kitex-contrib/obs-opentelemetry/logging/logrus" - "net" - "os" ) var serviceName = conf.GetConf().Kitex.Service @@ -28,9 +31,23 @@ func main() { query.SetDefault(mysql.DB) opts := kitexInit() + // Initialize RocketMQ + err := mq.Initialize() + if err != nil { + klog.Fatalf("Failed to initialize RocketMQ: %v", err) + } + defer mq.CleanUp() + + // Start auto-cancellation consumer + autoCancelService := service.NewAutoCancelOrderService() + err = mq.StartOrderCancelConsumer(autoCancelService.HandleOrderCancel) + if err != nil { + klog.Fatalf("Failed to start order cancellation consumer: %v", err) + } + svr := paymentservice.NewServer(new(PaymentServiceImpl), opts...) - err := svr.Run() + err = svr.Run() if err != nil { klog.Error(err.Error()) } From 60eda9405aebbe8c558c00fcb491d7f3d45f851d Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Wed, 5 Mar 2025 19:44:35 +0800 Subject: [PATCH 3/6] refactor(payment): reorganize imports and update RocketMQ client version --- app/payment/biz/fsm/order.go | 8 +++----- app/payment/biz/mq/rocketmq.go | 8 ++++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/payment/biz/fsm/order.go b/app/payment/biz/fsm/order.go index a9e1aa9..7c4866e 100644 --- a/app/payment/biz/fsm/order.go +++ b/app/payment/biz/fsm/order.go @@ -5,15 +5,13 @@ import ( "fmt" "time" + "github.com/cloudwego/kitex/pkg/klog" + "github.com/doutokk/doutok/app/payment/biz/dal/model" + "github.com/doutokk/doutok/app/payment/biz/dal/query" "github.com/doutokk/doutok/app/payment/biz/mq" "github.com/doutokk/doutok/app/payment/biz/pay" "github.com/doutokk/doutok/app/payment/conf" "github.com/doutokk/doutok/common/lock" - - "github.com/doutokk/doutok/app/payment/biz/dal/model" - "github.com/doutokk/doutok/app/payment/biz/dal/query" - - "github.com/cloudwego/kitex/pkg/klog" "github.com/looplab/fsm" ) diff --git a/app/payment/biz/mq/rocketmq.go b/app/payment/biz/mq/rocketmq.go index 42db6af..0a95d42 100644 --- a/app/payment/biz/mq/rocketmq.go +++ b/app/payment/biz/mq/rocketmq.go @@ -6,10 +6,10 @@ import ( "fmt" "time" - "github.com/apache/rocketmq-client-go/v5" - "github.com/apache/rocketmq-client-go/v5/consumer" - "github.com/apache/rocketmq-client-go/v5/primitive" - "github.com/apache/rocketmq-client-go/v5/producer" + "github.com/apache/rocketmq-client-go/v2" + "github.com/apache/rocketmq-client-go/v2/consumer" + "github.com/apache/rocketmq-client-go/v2/primitive" + "github.com/apache/rocketmq-client-go/v2/producer" "github.com/cloudwego/kitex/pkg/klog" "github.com/doutokk/doutok/app/payment/conf" ) From f886f67b0f6f67754014fe303c4b71b08d831fd1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Mar 2025 11:45:15 +0000 Subject: [PATCH 4/6] chore: auto run go mod tidy --- app/payment/go.mod | 10 ++++++++ app/payment/go.sum | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/app/payment/go.mod b/app/payment/go.mod index f8d81eb..9ec18d1 100644 --- a/app/payment/go.mod +++ b/app/payment/go.mod @@ -5,6 +5,7 @@ go 1.23.4 replace github.com/apache/thrift => github.com/apache/thrift v0.13.0 require ( + github.com/apache/rocketmq-client-go/v2 v2.1.2 github.com/cloudwego/kitex v0.12.3 github.com/doutokk/doutok/common v0.0.0-20250305072307-bb11ca9f930e github.com/doutokk/doutok/rpc_gen v0.0.0-20250228054030-051e213e0282 @@ -48,6 +49,7 @@ require ( github.com/cloudwego/thriftgo v0.3.19 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/emirpasic/gods v1.12.0 // indirect github.com/fatih/color v1.18.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect @@ -55,8 +57,10 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-redsync/redsync/v4 v4.13.0 // indirect github.com/go-sql-driver/mysql v1.9.0 // indirect + github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/pprof v0.0.0-20250208200701-d0013a598941 // indirect + github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/hashicorp/consul/api v1.31.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -90,7 +94,9 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nyaruka/phonenumbers v1.5.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.21.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect @@ -103,6 +109,7 @@ require ( github.com/smartwalle/ncrypto v1.0.4 // indirect github.com/smartwalle/ngx v1.0.9 // indirect github.com/smartwalle/nsign v1.0.9 // indirect + github.com/smartystreets/assertions v1.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect @@ -126,6 +133,7 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect go.opentelemetry.io/otel/trace v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect + go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.14.0 // indirect @@ -141,8 +149,10 @@ require ( google.golang.org/grpc v1.70.0 // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/datatypes v1.2.5 // indirect gorm.io/driver/postgres v1.5.9 // indirect gorm.io/hints v1.1.2 // indirect + stathat.com/c/consistent v1.0.0 // indirect ) diff --git a/app/payment/go.sum b/app/payment/go.sum index 18bcd24..dbdca57 100644 --- a/app/payment/go.sum +++ b/app/payment/go.sum @@ -34,6 +34,8 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -41,6 +43,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/apache/rocketmq-client-go/v2 v2.1.2 h1:yt73olKe5N6894Dbm+ojRf/JPiP0cxfDNNffKwhpJVg= +github.com/apache/rocketmq-client-go/v2 v2.1.2/go.mod h1:6I6vgxHR3hzrvn+6n/4mrhS+UTulzK/X9LB2Vk1U5gE= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= @@ -135,6 +139,8 @@ github.com/doutokk/doutok/common v0.0.0-20250305072307-bb11ca9f930e h1:swudHaHJn github.com/doutokk/doutok/common v0.0.0-20250305072307-bb11ca9f930e/go.mod h1:LO/OoH5fCGPTcs5UfgF/Yrfi/ZfKERZQjKW/izNqyCI= github.com/doutokk/doutok/rpc_gen v0.0.0-20250228054030-051e213e0282 h1:4Djmmixkw8uP45lmRv2CVs1kSlzpVdI0gRbsMfQLVPM= github.com/doutokk/doutok/rpc_gen v0.0.0-20250228054030-051e213e0282/go.mod h1:rXEWsslDDfnh2H7CcpwJ4lL+XHhXfRjfOA0LrOBYC3I= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -147,6 +153,8 @@ github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -177,6 +185,7 @@ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9 github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= @@ -242,15 +251,19 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk= github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc= github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= @@ -298,9 +311,11 @@ github.com/hashicorp/serf v0.10.2 h1:m5IORhuNSjaxeljg5DeQVDlQyVkhRIjJDimbkCa8aAc github.com/hashicorp/serf v0.10.2/go.mod h1:T1CmSGfSeGfnfNy/w0odXQUR1rfECGd2Qdsp84DjOiY= github.com/hertz-contrib/obs-opentelemetry/provider v0.3.0 h1:qg2pljZC8Udaj7H1F/6H/8iDAG6BVucgWGQbFTGlnNI= github.com/hertz-contrib/obs-opentelemetry/provider v0.3.0/go.mod h1:aMTZ5ZTK/0caxQphajqtWC/520NqA+X2J1eXVPiXT5Y= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= @@ -328,6 +343,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -353,6 +370,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -398,11 +416,24 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nyaruka/phonenumbers v1.5.0 h1:0M+Gd9zl53QC4Nl5z1Yj1O/zPk2XXBUwR/vlzdXSJv4= github.com/nyaruka/phonenumbers v1.5.0/go.mod h1:gv+CtldaFz+G3vHHnasBSirAi3O2XLqZzVWz4V1pl2E= github.com/oleiade/lane v1.0.1/go.mod h1:IyTkraa4maLfjq/GmHR+Dxb4kCMtEGeb+qmhlrQ5Mk4= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -462,6 +493,7 @@ github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWR github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -474,6 +506,10 @@ github.com/smartwalle/ngx v1.0.9 h1:pUXDvWRZJIHVrCKA1uZ15YwNti+5P4GuJGbpJ4WvpMw= github.com/smartwalle/ngx v1.0.9/go.mod h1:mx/nz2Pk5j+RBs7t6u6k22MPiBG/8CtOMpCnALIG8Y0= github.com/smartwalle/nsign v1.0.9 h1:8poAgG7zBd8HkZy9RQDwasC6XZvJpDGQWSjzL2FZL6E= github.com/smartwalle/nsign v1.0.9/go.mod h1:eY6I4CJlyNdVMP+t6z1H6Jpd4m5/V+8xi44ufSTxXgc= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= @@ -506,6 +542,7 @@ github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKN github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -555,6 +592,9 @@ go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -614,6 +654,7 @@ golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -636,6 +677,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -644,6 +686,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -678,6 +721,7 @@ golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -688,7 +732,10 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -710,6 +757,7 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -761,6 +809,7 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -770,6 +819,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -798,6 +848,7 @@ golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -904,8 +955,12 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY= gopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -913,6 +968,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -951,3 +1007,5 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +stathat.com/c/consistent v1.0.0 h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c= +stathat.com/c/consistent v1.0.0/go.mod h1:QkzMWzcbB+yQBL2AttO6sgsQS/JSTapcDISJalmCDS0= From 1b777093e69f3f4b63e85ddc7bd9eb130ee47f82 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Mar 2025 11:45:48 +0000 Subject: [PATCH 5/6] chore: auto run go mod tidy --- app/payment/go.sum | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/payment/go.sum b/app/payment/go.sum index dbdca57..9ce143b 100644 --- a/app/payment/go.sum +++ b/app/payment/go.sum @@ -264,6 +264,7 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= @@ -508,6 +509,7 @@ github.com/smartwalle/nsign v1.0.9 h1:8poAgG7zBd8HkZy9RQDwasC6XZvJpDGQWSjzL2FZL6 github.com/smartwalle/nsign v1.0.9/go.mod h1:eY6I4CJlyNdVMP+t6z1H6Jpd4m5/V+8xi44ufSTxXgc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= +github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= From ebeec6cddf7b855d4fd12bd5b4ac004f275881a2 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Thu, 6 Mar 2025 00:11:41 +0800 Subject: [PATCH 6/6] docs: update README with project overview, features, and setup instructions --- README.md | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 224 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b517a4b..7bec650 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,224 @@ -# doutok -抖音电商项目 - -## 增加模块教程 -1. 在 app 包创建一个子模块包 -2. go mod init -进入子模块包,执行 go mod init -如 go mod init github.com/doutokk/doutok/app/auth -3. 在 go.work 加入子模块包 -4. 进入项目根目录 -make gen svc=auth + +
+

🎬 DouTok Shop(抖音电商)

+

基于 Kitex 和 Hertz 框架构建的高性能、易扩展的云原生商城项目

+

+ Go + MySQL + Kitex + Hertz + Redis +

+
+ +--- + +## 🌟 项目简介 + +DouTok Shop(抖音电商)是一个面向云原生时代的综合性电商平台,旨在提供高性能、易扩展的电商解决方案。项目基于字节跳动的 Kitex 作为 RPC 框架和 Hertz 作为 HTTP 框架,结合成熟的后端技术与现代 DevOps 工具链,构建用户、管理与运维多端统一的生态系统。 + +**主要功能:** + +- **用户端:** + - 浏览商品、商品搜索与筛选 + - 添加购物车、下单及订单管理 + - 跳转支付宝支付等集成 + +- **管理端:** + - 商品的新增、修改与删除 + - 图片直传至阿里云 OSS,实现高效媒体管理 + +- **运维端:** + - 自动化的 Pod 扩缩容与节点弹性扩容 + - 统一日志管理、性能监控(Metrics)及链路追踪 + - GitOps 工作流实现持续集成与持续部署 + +--- + +## 🔗 项目地址 + +- **展示地址:** [https://shopnext.kl.suyiiyii.top/](https://shopnext.kl.suyiiyii.top/) +- **CDN 地址:** [https://shopnext.suyiiyii.top/](https://shopnext.suyiiyii.top/) +- **后端仓库:** [https://github.com/doutokk/doutok](https://github.com/doutokk/doutok) +- **前端仓库:** [https://github.com/doutokk/doutok-frontend](https://github.com/doutokk/doutok-frontend) + +--- + +## 👥 项目分工 + +- **队长:** 杜家楷 + *主要负责流水线部署、运维、前端开发、OSS 文件直传及实现商品管理、购物车、订单和支付模块。* + +- **队员:** 钟宝骏 + *主要负责压测、搜索、缓存、测试、仓库管理以及用户、鉴权和网关模块的实现。* + +--- + +## 🛠 技术栈 + +### 后端 +- **语言:** Go +- **RPC & HTTP 框架:** Kitex & Hertz +- **鉴权:** JWT + Casbin(基于角色的权限控制) +- **数据库:** MySQL(关系型数据存储) +- **缓存与分布式锁:** Redis +- **搜索引擎:** Elasticsearch(商品搜索性能提升约10倍) +- **对象存储:** 阿里云 OSS + +### 前端 +- **框架:** React +- **静态资源托管:** Nginx 配合 CDN 加速 + +### 部署与运维 +- **容器化与编排:** Kubernetes +- **日志与监控:** Prometheus、Grafana、Loki、Promtail +- **链路追踪:** Jaeger +- **CI/CD:** GitHub Actions、GitHub Packages、ArgoCD(GitOps 模式) + +--- + +## 🏗 项目架构 + +DouTok Shop 的架构设计注重高可用与弹性扩展,主要包括以下层级: + +1. **客户端与内容分发** + - 浏览器访问 → 静态资源通过 CDN 加速 + +2. **接入层** + - Ingress(Traefik)统一入口,路由至网关或各微服务 + +3. **业务服务层** + - **Gateway:** 统一处理用户请求与服务间聚合 + - **微服务:** 拆分为用户、商品、订单、支付等独立模块,通过 RPC/HTTP 通信 + - **Redis:** 提供高频数据缓存及分布式锁支持 + +4. **数据与存储层** + - **MySQL:** 核心业务数据存储,确保数据一致性 + - **对象存储:** 阿里云 OSS 存储图片、视频等非结构化数据 + +5. **可观测性与监控** + - **日志:** Loki + Promtail 集中管理日志 + - **监控:** Prometheus + Grafana 实时监控关键指标 + - **链路追踪:** Jaeger 分布式调用链追踪 + +6. **基础设施层** + - Kubernetes 集群管理,支持自动扩缩容与高可用部署 + +--- + +## 🚀 快速开始 + +### 环境准备 + +- **Go 版本:** ≥ 1.18 +- **MySQL 版本:** ≥ 8.0 +- **Redis 版本:** ≥ 6.0 +- **Kubernetes 集群环境**(可选,用于生产部署) +- **阿里云 OSS 账户**(用于对象存储) + +### 本地部署步骤 + +1. **克隆仓库** + ```bash + git clone https://github.com/doutokk/doutok.git + cd doutok + ``` + +2. **安装依赖** + ```bash + go mod download + 或 + go mod tidy + ``` + +3. **数据库配置** + - 根据 `docs/database` 下的说明,创建并初始化 MySQL 数据库及数据表 + +4. **编辑配置文件** + - 在各微服务的 `conf` 目录下,使用您的数据库、Redis 和 OSS 凭证更新 YAML 配置文件 + +5. **使用 Docker 部署** + - 参考 `deploy/docker` 中各微服务的 `Dockerfile` + - 确保端口与配置文件中定义一致,设置环境变量 `GO_ENV=dev`(开发环境)或其它适配环境 + +6. **启动服务** + - 使用 Docker Compose 或 Kubernetes 清单文件进行服务启动和部署 + +--- + +## 📚 API 文档 + +API 文档位于项目文档目录中,方便您了解各微服务接口定义与调用方式: +```bash +cd docs/api +``` + +--- + +## 🚢 部署与 GitOps 工作流 + +DouTok Shop 完整采用 GitOps 工作流,通过 GitHub Actions 触发持续集成和镜像构建,再由 ArgoCD 实现 Kubernetes 集群的持续部署。主要步骤包括: + +1. **代码提交触发流水线** + - 自动化执行编译、单元测试、静态检查 + +2. **镜像构建与推送** + - Dockerfile 构建镜像,推送至 GitHub Container Registry + +3. **配置声明更新** + - 使用 kustomize/helm 更新 Kubernetes 清单,提交至 Manifest 仓库 + +4. **持续部署** + - ArgoCD 实时监控 Manifest 仓库变更,并同步至集群,实现滚动更新与零宕机部署 + +--- + +## 🤝 贡献指南 + +欢迎各路开发者共同参与 DouTok Shop 项目的建设! + +1. **Fork 本仓库** +2. **创建新分支** + ```bash + git checkout -b feature/YourFeature + ``` +3. **提交代码与更新文档** +4. **提交 Pull Request** + +请确保您的代码通过所有测试,并附上相关文档说明。 + +--- + +## 📄 许可证 + +本项目采用 [MIT 许可证](LICENSE)。 + +--- + +## 🙋‍♀ 作者 & 团队 + +- **杜家楷** + 邮箱:suyiiyii@gmail.com + *(流水线部署、运维、前端、OSS 直传、商品管理、购物车、订单、支付模块)* + +- **钟宝骏** + 邮箱:3168078770@qq.com + *(压测、搜索、缓存、测试、仓库管理、用户鉴权、网关模块)* + + +--- + +## 🔍 项目总结与展望 + +- **当前问题:** 部分业务场景仍需进一步优化,如高并发下的细粒度权限控制与缓存策略 +- **已识别优化点:** 架构性能瓶颈、日志监控精细化、微服务间通信优化 +- **未来方向:** 持续演进架构、引入更多自动化测试和监控手段、提升用户体验 + +--- + +
+
+ ⭐ 如果您觉得本项目有帮助,请给我们点个 star! + 📖 更多信息请查阅项目 Wiki 或提交 issue。 +
+``` \ No newline at end of file