blog/BlogFileService/cloud/DistributedService.go

108 lines
2.5 KiB
Go

package cloud
import (
"BlogFile/bootstrap"
"BlogFile/third_party/database"
"context"
"fmt"
"log"
"sync"
"time"
"github.com/redis/go-redis/v9"
)
var (
// serviceName string = "BlogAdminService"
// host string = "192.168.0.50"
// port string = "8081"
countMap sync.Map
)
type distributedService struct {
}
var DistributedService distributedService
var redisClient *redis.Client
var down bool
func init() {
registerCenter := bootstrap.Config.Cloud.RegisterCenter
db := bootstrap.Config.Cloud.RegisterCenterDb
redisClient = redis.NewClient(&redis.Options{
Addr: registerCenter,
DB: db, // 默认DB 0
})
// RedisTemplate = redis.NewClient(&redis.Options{
// Addr: "localhost:6379",
// Password: "", // 没有密码,默认值
// DB: 0, // 默认DB 0
// })
ctx := context.Background()
sc := redisClient.Ping(ctx)
pong := sc.Val()
if pong == "PONG" {
log.Println("注册中心Redis连接成功")
// RedisTemplate.FlushAll(ctx)
}
}
func addReqCount(service string) int64 {
val, _ := countMap.Load(service)
i := val.(int64)
countMap.Store(service, i+1)
return i
}
func (*distributedService) Req(service string, url string) {
ctx := context.Background()
key := fmt.Sprintf("distributed:%v", service)
total := database.RedisTemplate.SCard(ctx, key).Val()
if total == 0 {
log.Println(service, "服务不存在")
return
}
results := database.RedisTemplate.SMembers(ctx, key).Val()
current := addReqCount(service)
addr := results[total%current]
// r, err := http.NewRequest("", addr+url, nil)
log.Println(addr)
}
func (*distributedService) ServiceUp() {
go func() {
log.Println("心跳开始")
ctx := context.Background()
serviceName := bootstrap.Config.Cloud.ServiceName
host := bootstrap.Config.Cloud.Host
heartbeat := bootstrap.Config.Cloud.Heartbeat
for {
if down {
break
}
time.Sleep(time.Second * time.Duration(heartbeat))
key := fmt.Sprintf("distributed:%v", serviceName)
// addr := fmt.Sprintf("%v:%v", host, port)
redisClient.SAdd(ctx, key, host)
}
}()
// keys, _ := database.RedisTemplate.Scan(ctx, 0, keyPerfix, 0).Val()
// i := len(keys)
// key := keys[0/i]
// result := database.RedisTemplate.Get(ctx, key).Val()
// log.Println(result)
}
func (*distributedService) ServiceDown() {
down = true
ctx := context.Background()
serviceName := bootstrap.Config.Cloud.ServiceName
host := bootstrap.Config.Cloud.Host
key := fmt.Sprintf("distributed:%v", serviceName)
// addr := fmt.Sprintf("%v:%v", host, port)
redisClient.SRem(ctx, key, host)
}