diff --git a/common/infra/0module.go b/common/infra/0module.go index 593fcd2..ab500d3 100644 --- a/common/infra/0module.go +++ b/common/infra/0module.go @@ -10,7 +10,6 @@ var tracer = otel.Tracer("github.com/AH-dark/gravatar-with-qq-avatar/internal/in func Module() fx.Option { return fx.Module( "internal.infra", - fx.Provide(NewCacheDriver), fx.Provide(NewPrometheusRegistry), fx.Invoke(InvokePrometheusGoCollector), fx.Provide(NewRedisClient), diff --git a/common/infra/cache.go b/common/infra/cache.go deleted file mode 100644 index db9c7d9..0000000 --- a/common/infra/cache.go +++ /dev/null @@ -1,10 +0,0 @@ -package infra - -import ( - "github.com/AH-dark/gravatar-with-qq-avatar/pkg/cache" - "github.com/redis/go-redis/v9" -) - -func NewCacheDriver(redisClient redis.UniversalClient) cache.Driver { - return cache.NewRedisDriver(redisClient) -} diff --git a/config.example.yaml b/config.example.yaml index 067b5ca..d159868 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -26,31 +26,6 @@ observability: type: prometheus listen: "0.0.0.0:9201" -redis: - mode: standalone - host: redis - port: 6379 - username: "" - password: "" - -mq: - host: localhost - port: 5672 - username: cecilia - password: cecilia - vhost: "" - -etcd: - endpoints: - - "http://localhost:2379" - username: "" - password: "" - tls: - ca_file: "" - cert_file: "" - key_file: "" - insecure_skip_verify: false - cassandra: hosts: - "localhost:9042" diff --git a/docker-compose.yml b/docker-compose.yml index 8f3f7c3..ac48876 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -name: gravatar-with-qq-support +name: gravatar-with-qq-avatar networks: app-network: @@ -10,40 +10,6 @@ volumes: cassandra-data: services: - redis: - image: redis:7 - ports: - - 6379:6379 - networks: - - app-network - volumes: - - redis-data:/data - - etcd: - image: quay.io/coreos/etcd:v3.5.9-arm64 - entrypoint: /usr/local/bin/etcd - command: - - --name=etcd - - --data-dir=/etcd_data - - --initial-advertise-peer-urls=http://etcd:2380 - - --listen-peer-urls=http://0.0.0.0:2380 - - --listen-client-urls=http://0.0.0.0:2379 - - --advertise-client-urls=http://etcd:2379 - - --initial-cluster-token=etcd-cluster-1 - - --initial-cluster=etcd=http://etcd:2380 - - --initial-cluster-state=new - - --heartbeat-interval=250 - - --election-timeout=1250 - - --experimental-enable-distributed-tracing=true - - --experimental-distributed-tracing-address='jaeger:4317' - ports: - - "2379:2379" - - "2380:2380" - networks: - - app-network - volumes: - - etcd-data:/etcd_data - jaeger: image: jaegertracing/all-in-one:latest ports: diff --git a/docker/application/Dockerfile b/docker/application/Dockerfile index cba3d4d..5044e13 100644 --- a/docker/application/Dockerfile +++ b/docker/application/Dockerfile @@ -26,7 +26,7 @@ WORKDIR /app RUN apk add --no-cache ca-certificates libwebp libwebp-tools # Copy the binary from the build stage -COPY --from=builder /go/src/app/bin/${COMPONENT} ./application +COPY --from=builder /go/src/app/bin/${COMPONENT} /app/application # Run the binary -ENTRYPOINT ["./application"] +ENTRYPOINT /app/application diff --git a/go.mod b/go.mod index ef39358..a86c0c6 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/hertz-contrib/obs-opentelemetry/tracing v0.3.1 github.com/imroc/req/v3 v3.42.3 github.com/kolesa-team/go-webp v1.0.4 - github.com/libi/dcron v0.5.4-0.20240105033402-68982ebda50e github.com/minio/md5-simd v1.1.2 github.com/minio/sha256-simd v1.0.1 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 @@ -31,7 +30,6 @@ require ( go.opentelemetry.io/otel/exporters/prometheus v0.44.0 go.opentelemetry.io/otel/sdk v1.21.0 go.opentelemetry.io/otel/sdk/metric v1.21.0 - go.opentelemetry.io/otel/trace v1.21.0 go.uber.org/fx v1.20.1 go.uber.org/zap v1.26.0 ) @@ -95,6 +93,7 @@ require ( github.com/uptrace/opentelemetry-go-extra/otelutil v0.2.3 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/dig v1.17.1 // indirect diff --git a/go.sum b/go.sum index 9654e87..e341df2 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/libi/dcron v0.5.4-0.20240105033402-68982ebda50e h1:eCPCFvnQfLfVyxHFjzHq++6AqWyODt+DyLtBnRxNwj0= -github.com/libi/dcron v0.5.4-0.20240105033402-68982ebda50e/go.mod h1:8LNNhedFzTl/xoKFgsASCx/TsmmU/XbsJ+f+yx0C3NY= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= diff --git a/pkg/cache/driver.go b/pkg/cache/driver.go deleted file mode 100644 index e21584c..0000000 --- a/pkg/cache/driver.go +++ /dev/null @@ -1,44 +0,0 @@ -package cache - -import ( - "context" - "time" - - "go.opentelemetry.io/otel" -) - -var tracer = otel.Tracer("github.com/AH-dark/gravatar-with-qq-avatar/internal/cache") - -type Driver interface { - Get(ctx context.Context, key string) (interface{}, bool) - MGet(ctx context.Context, keys []string) (map[string]interface{}, []string, error) - GetEX(ctx context.Context, key string) (interface{}, time.Duration, error) - Set(ctx context.Context, key string, value interface{}) error - MSet(ctx context.Context, values map[string]interface{}) error - SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) error - Del(ctx context.Context, key string) error - MDel(ctx context.Context, keys []string) error - Keys(ctx context.Context, pattern string) ([]string, error) - - NewHashMap(ctx context.Context, key string) HashMap - NewSet(ctx context.Context, key string) Set -} - -type HashMap interface { - Get(ctx context.Context, key string) (interface{}, bool) - MGet(ctx context.Context, keys []string) (map[string]interface{}, error) - Set(ctx context.Context, key string, value interface{}) error - MSet(ctx context.Context, values map[string]interface{}) error - Del(ctx context.Context, key string) error - MDel(ctx context.Context, keys []string) error - Keys(ctx context.Context, pattern string) ([]string, error) -} - -type Set interface { - Add(ctx context.Context, members ...interface{}) error - Card(ctx context.Context) (int64, error) - IsMember(ctx context.Context, member interface{}) (bool, error) - Members(ctx context.Context) ([]interface{}, error) - Pop(ctx context.Context) (interface{}, error) - Remove(ctx context.Context, members ...interface{}) error -} diff --git a/pkg/cache/redis.go b/pkg/cache/redis.go deleted file mode 100644 index 93c5d16..0000000 --- a/pkg/cache/redis.go +++ /dev/null @@ -1,218 +0,0 @@ -package cache - -import ( - "context" - "time" - - "github.com/AH-dark/bytestring" - "github.com/redis/go-redis/v9" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" -) - -const redisScanCount = 16 - -type redisDriver struct { - client redis.UniversalClient -} - -func NewRedisDriver(client redis.UniversalClient) Driver { - return &redisDriver{client: client} -} - -func (rdb *redisDriver) Get(ctx context.Context, key string) (interface{}, bool) { - ctx, span := tracer.Start(ctx, "RedisDriver.Get", trace.WithAttributes( - attribute.String("key", key), - )) - defer span.End() - - res, err := rdb.client.Get(ctx, key).Bytes() - if err != nil { - span.RecordError(err) - return nil, false - } - - item, err := decodeRedisItem(res) - if err != nil { - span.RecordError(err) - return nil, false - } - - return item.Value, true -} - -func (rdb *redisDriver) MGet(ctx context.Context, keys []string) (map[string]interface{}, []string, error) { - ctx, span := tracer.Start(ctx, "RedisDriver.MGet", trace.WithAttributes( - attribute.Int("count", len(keys)), - )) - defer span.End() - - res, err := rdb.client.MGet(ctx, keys...).Result() - if err != nil { - span.RecordError(err) - return nil, keys, err - } - - items := make(map[string]interface{}, len(res)) - missed := make([]string, 0, len(res)) - for i := range res { - if res[i] == nil { - missed = append(missed, keys[i]) - continue - } - - item, err := decodeRedisItem(bytestring.StringToBytes(res[i].(string))) - if err != nil { - span.RecordError(err) - return nil, keys, err - } - - items[keys[i]] = item.Value - } - - return items, missed, nil -} - -func (rdb *redisDriver) GetEX(ctx context.Context, key string) (interface{}, time.Duration, error) { - ctx, span := tracer.Start(ctx, "RedisDriver.GetEX", trace.WithAttributes( - attribute.String("key", key), - )) - defer span.End() - - res, err := rdb.client.Get(ctx, key).Bytes() - if err != nil { - span.RecordError(err) - return nil, 0, err - } - - item, err := decodeRedisItem(res) - if err != nil { - span.RecordError(err) - return nil, 0, err - } - - exp, err := rdb.client.TTL(ctx, key).Result() - if err != nil { - span.RecordError(err) - return nil, 0, err - } - - return item.Value, exp, nil -} - -func (rdb *redisDriver) Set(ctx context.Context, key string, value interface{}) error { - ctx, span := tracer.Start(ctx, "RedisDriver.Set", trace.WithAttributes( - attribute.String("key", key), - )) - defer span.End() - - item := redisItem{Value: value} - gob, err := encodeRedisItem(item) - if err != nil { - span.RecordError(err) - return err - } - - return rdb.client.Set(ctx, key, bytestring.BytesToString(gob), 0).Err() -} - -func (rdb *redisDriver) MSet(ctx context.Context, values map[string]interface{}) error { - ctx, span := tracer.Start(ctx, "RedisDriver.MSet", trace.WithAttributes( - attribute.Int("count", len(values)), - )) - defer span.End() - - args := make([]interface{}, 0, len(values)*2) - for k := range values { - gob, err := encodeRedisItem(redisItem{Value: values[k]}) - if err != nil { - span.RecordError(err) - return err - } - - args = append(args, k, bytestring.BytesToString(gob)) - } - - return rdb.client.MSet(ctx, args...).Err() -} - -func (rdb *redisDriver) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) error { - ctx, span := tracer.Start(ctx, "RedisDriver.SetEX", trace.WithAttributes( - attribute.String("key", key), - attribute.Int64("expiration", expiration.Milliseconds()), - )) - defer span.End() - - item := redisItem{Value: value} - gob, err := encodeRedisItem(item) - if err != nil { - span.RecordError(err) - return err - } - - return rdb.client.Set(ctx, key, bytestring.BytesToString(gob), expiration).Err() -} - -func (rdb *redisDriver) Del(ctx context.Context, key string) error { - ctx, span := tracer.Start(ctx, "RedisDriver.Del", trace.WithAttributes( - attribute.String("key", key), - )) - defer span.End() - - return rdb.client.Del(ctx, key).Err() -} - -func (rdb *redisDriver) MDel(ctx context.Context, keys []string) error { - ctx, span := tracer.Start(ctx, "RedisDriver.MDel", trace.WithAttributes( - attribute.StringSlice("keys", keys), - attribute.Int("count", len(keys)), - )) - defer span.End() - - return rdb.client.Del(ctx, keys...).Err() -} - -func (rdb *redisDriver) Keys(ctx context.Context, pattern string) ([]string, error) { - ctx, span := tracer.Start(ctx, "RedisDriver.Keys", trace.WithAttributes( - attribute.String("pattern", pattern), - )) - defer span.End() - - var keys []string - var pre uint64 - for { - var res []string - var err error - res, cur, err := rdb.client.Scan(ctx, pre, pattern, redisScanCount).Result() - if err != nil { - span.RecordError(err) - return nil, err - } - - keys = append(keys, res...) - if cur == 0 { - break - } - pre = cur - } - - return keys, nil -} - -func (rdb *redisDriver) NewHashMap(ctx context.Context, key string) HashMap { - ctx, span := tracer.Start(ctx, "RedisDriver.NewHashMap", trace.WithAttributes( - attribute.String("key", key), - )) - defer span.End() - - return &redisHashMap{client: rdb.client, key: key} -} - -func (rdb *redisDriver) NewSet(ctx context.Context, key string) Set { - ctx, span := tracer.Start(ctx, "RedisDriver.NewSet", trace.WithAttributes( - attribute.String("key", key), - )) - defer span.End() - - return &redisSet{client: rdb.client, key: key} -} diff --git a/pkg/cache/redis_hashmap.go b/pkg/cache/redis_hashmap.go deleted file mode 100644 index 4f38e0f..0000000 --- a/pkg/cache/redis_hashmap.go +++ /dev/null @@ -1,135 +0,0 @@ -package cache - -import ( - "context" - - "github.com/AH-dark/bytestring" - "github.com/redis/go-redis/v9" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/trace" -) - -type redisHashMap struct { - client redis.UniversalClient - key string -} - -var _ HashMap = (*redisHashMap)(nil) - -func (rhm *redisHashMap) Get(ctx context.Context, key string) (interface{}, bool) { - ctx, span := tracer.Start(ctx, "RedisHashMap.Get") - defer span.End() - - res, err := rhm.client.HGet(ctx, rhm.key, key).Bytes() - if err != nil { - span.RecordError(err) - return nil, false - } - - item, err := decodeRedisItem(res) - if err != nil { - span.RecordError(err) - return nil, false - } - - return item.Value, true -} - -func (rhm *redisHashMap) MGet(ctx context.Context, keys []string) (map[string]interface{}, error) { - ctx, span := tracer.Start(ctx, "RedisHashMap.MGet") - defer span.End() - - res, err := rhm.client.HMGet(ctx, rhm.key, keys...).Result() - if err != nil { - span.RecordError(err) - return nil, err - } - - items := make(map[string]interface{}, len(res)) - for i, v := range res { - if v == nil { - continue - } - - item, err := decodeRedisItem(bytestring.StringToBytes(v.(string))) - if err != nil { - span.RecordError(err) - return nil, err - } - - items[keys[i]] = item.Value - } - - return items, nil -} - -func (rhm *redisHashMap) Set(ctx context.Context, key string, value interface{}) error { - ctx, span := tracer.Start(ctx, "RedisHashMap.Set") - defer span.End() - - res, err := encodeRedisItem(redisItem{Value: value}) - if err != nil { - span.RecordError(err) - return err - } - - return rhm.client.HSet(ctx, rhm.key, key, res).Err() -} - -func (rhm *redisHashMap) MSet(ctx context.Context, values map[string]interface{}) error { - ctx, span := tracer.Start(ctx, "RedisHashMap.MSet") - defer span.End() - - args := make([]interface{}, 0, len(values)*2) - for k := range values { - res, err := encodeRedisItem(redisItem{Value: values[k]}) - if err != nil { - span.RecordError(err) - return err - } - - args = append(args, k, res) - } - - return rhm.client.HMSet(ctx, rhm.key, args...).Err() -} - -func (rhm *redisHashMap) Del(ctx context.Context, key string) error { - ctx, span := tracer.Start(ctx, "RedisHashMap.Del") - defer span.End() - - return rhm.client.HDel(ctx, rhm.key, key).Err() -} - -func (rhm *redisHashMap) MDel(ctx context.Context, keys []string) error { - ctx, span := tracer.Start(ctx, "RedisHashMap.MDel") - defer span.End() - - return rhm.client.HDel(ctx, rhm.key, keys...).Err() -} - -func (rhm *redisHashMap) Keys(ctx context.Context, pattern string) ([]string, error) { - ctx, span := tracer.Start(ctx, "RedisHashMap.Keys", trace.WithAttributes( - attribute.String("pattern", pattern), - )) - defer span.End() - - var keys []string - var pre uint64 - for { - res, cur, err := rhm.client.HScan(ctx, rhm.key, pre, pattern, 100).Result() - if err != nil { - span.RecordError(err) - return nil, err - } - - keys = append(keys, res...) - - if cur == 0 { - break - } - pre = cur - } - - return keys, nil -} diff --git a/pkg/cache/redis_item.go b/pkg/cache/redis_item.go deleted file mode 100644 index 0134ea9..0000000 --- a/pkg/cache/redis_item.go +++ /dev/null @@ -1,23 +0,0 @@ -package cache - -import ( - "encoding/gob" - "github.com/AH-dark/gravatar-with-qq-avatar/pkg/utils" -) - -type redisItem struct { - Value interface{} -} - -func init() { - gob.Register(&redisItem{}) -} - -func encodeRedisItem(item redisItem) ([]byte, error) { - return utils.GobEncode(item) -} - -func decodeRedisItem(b []byte) (item redisItem, err error) { - err = utils.GobDecode(b, &item) - return -} diff --git a/pkg/cache/redis_set.go b/pkg/cache/redis_set.go deleted file mode 100644 index a6aafa2..0000000 --- a/pkg/cache/redis_set.go +++ /dev/null @@ -1,124 +0,0 @@ -package cache - -import ( - "context" - - "github.com/AH-dark/bytestring" - "github.com/redis/go-redis/v9" -) - -type redisSet struct { - client redis.UniversalClient - key string -} - -var _ Set = (*redisSet)(nil) - -func (rs *redisSet) Add(ctx context.Context, members ...interface{}) error { - ctx, span := tracer.Start(ctx, "RedisSet.Add") - defer span.End() - - args := make([]interface{}, 0, len(members)) - for _, v := range members { - gob, err := encodeRedisItem(redisItem{Value: v}) - if err != nil { - span.RecordError(err) - return err - } - - args = append(args, gob) - } - - if _, err := rs.client.SAdd(ctx, rs.key, args...).Result(); err != nil { - span.RecordError(err) - return err - } - - return nil -} - -func (rs *redisSet) Card(ctx context.Context) (int64, error) { - ctx, span := tracer.Start(ctx, "RedisSet.Card") - defer span.End() - - return rs.client.SCard(ctx, rs.key).Result() -} - -func (rs *redisSet) IsMember(ctx context.Context, member interface{}) (bool, error) { - ctx, span := tracer.Start(ctx, "RedisSet.IsMember") - defer span.End() - - gob, err := encodeRedisItem(redisItem{Value: member}) - if err != nil { - span.RecordError(err) - return false, err - } - - return rs.client.SIsMember(ctx, rs.key, gob).Result() -} - -func (rs *redisSet) Members(ctx context.Context) ([]interface{}, error) { - ctx, span := tracer.Start(ctx, "RedisSet.Members") - defer span.End() - - res, err := rs.client.SMembers(ctx, rs.key).Result() - if err != nil { - span.RecordError(err) - return nil, err - } - - items := make([]interface{}, 0, len(res)) - for _, v := range res { - item, err := decodeRedisItem(bytestring.StringToBytes(v)) - if err != nil { - span.RecordError(err) - return nil, err - } - - items = append(items, item.Value) - } - - return items, nil -} - -func (rs *redisSet) Pop(ctx context.Context) (interface{}, error) { - ctx, span := tracer.Start(ctx, "RedisSet.Pop") - defer span.End() - - res, err := rs.client.SPop(ctx, rs.key).Result() - if err != nil { - span.RecordError(err) - return nil, err - } - - item, err := decodeRedisItem(bytestring.StringToBytes(res)) - if err != nil { - span.RecordError(err) - return nil, err - } - - return item.Value, nil -} - -func (rs *redisSet) Remove(ctx context.Context, members ...interface{}) error { - ctx, span := tracer.Start(ctx, "RedisSet.Remove") - defer span.End() - - args := make([]interface{}, 0, len(members)) - for _, v := range members { - gob, err := encodeRedisItem(redisItem{Value: v}) - if err != nil { - span.RecordError(err) - return err - } - - args = append(args, gob) - } - - if _, err := rs.client.SRem(ctx, rs.key, args...).Result(); err != nil { - span.RecordError(err) - return err - } - - return nil -} diff --git a/pkg/dcron_logger/zap_logger.go b/pkg/dcron_logger/zap_logger.go deleted file mode 100644 index 7802ac1..0000000 --- a/pkg/dcron_logger/zap_logger.go +++ /dev/null @@ -1,32 +0,0 @@ -package dcron_logger - -import ( - "github.com/libi/dcron/dlog" - "go.uber.org/zap" -) - -type ZapLoggerImpl struct { - log *zap.Logger -} - -var _ dlog.Logger = (*ZapLoggerImpl)(nil) - -func NewZapLogger(log *zap.Logger) *ZapLoggerImpl { - return &ZapLoggerImpl{log: log} -} - -func (l *ZapLoggerImpl) Printf(s string, a ...any) { - l.log.Sugar().Infof(s, a...) -} - -func (l *ZapLoggerImpl) Infof(s string, a ...any) { - l.log.Sugar().Infof(s, a...) -} - -func (l *ZapLoggerImpl) Warnf(s string, a ...any) { - l.log.Sugar().Warnf(s, a...) -} - -func (l *ZapLoggerImpl) Errorf(s string, a ...any) { - l.log.Sugar().Errorf(s, a...) -}