108 lines
2.5 KiB
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)
|
|
}
|