diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index f347dbee..ba73f4af 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -1419,6 +1419,82 @@ func (this *ServerDAO) FindLatestServers(tx *dbs.Tx, size int64) (result []*Serv return } +// FindNearbyServersInGroup 查找所属分组附近的服务 +func (this *ServerDAO) FindNearbyServersInGroup(tx *dbs.Tx, groupId int64, serverId int64, size int64) (result []*Server, err error) { + // 之前的 + ones, err := SharedServerDAO.Query(tx). + Result("id", "name", "isOn"). + State(ServerStateEnabled). + Where("JSON_CONTAINS(groupIds, :groupId)"). + Param("groupId", numberutils.FormatInt64(groupId)). + Gte("id", serverId). + Limit(size). + AscPk(). + FindAll() + if err != nil { + return nil, err + } + lists.Reverse(ones) + for _, one := range ones { + result = append(result, one.(*Server)) + } + + // 之后的 + ones, err = SharedServerDAO.Query(tx). + Result("id", "name", "isOn"). + State(ServerStateEnabled). + Where("JSON_CONTAINS(groupIds, :groupId)"). + Param("groupId", numberutils.FormatInt64(groupId)). + Lt("id", serverId). + Limit(size). + DescPk(). + FindAll() + if err != nil { + return nil, err + } + for _, one := range ones { + result = append(result, one.(*Server)) + } + return +} + +// FindNearbyServersInCluster 查找所属集群附近的服务 +func (this *ServerDAO) FindNearbyServersInCluster(tx *dbs.Tx, clusterId int64, serverId int64, size int64) (result []*Server, err error) { + // 之前的 + ones, err := SharedServerDAO.Query(tx). + Result("id", "name", "isOn"). + State(ServerStateEnabled). + Attr("clusterId", clusterId). + Gte("id", serverId). + Limit(size). + AscPk(). + FindAll() + if err != nil { + return nil, err + } + lists.Reverse(ones) + for _, one := range ones { + result = append(result, one.(*Server)) + } + + // 之后的 + ones, err = SharedServerDAO.Query(tx). + Result("id", "name", "isOn"). + State(ServerStateEnabled). + Attr("clusterId", clusterId). + Lt("id", serverId). + Limit(size). + DescPk(). + FindAll() + if err != nil { + return nil, err + } + for _, one := range ones { + result = append(result, one.(*Server)) + } + return +} + // FindFirstHTTPOrHTTPSPortWithClusterId 获取集群中第一个HTTP或者HTTPS端口 func (this *ServerDAO) FindFirstHTTPOrHTTPSPortWithClusterId(tx *dbs.Tx, clusterId int64) (int, error) { one, _, err := this.Query(tx). diff --git a/internal/rpc/services/service_server.go b/internal/rpc/services/service_server.go index 3f7330f1..18beee13 100644 --- a/internal/rpc/services/service_server.go +++ b/internal/rpc/services/service_server.go @@ -1434,3 +1434,90 @@ func (this *ServerService) FindLatestServers(ctx context.Context, req *pb.FindLa } return &pb.FindLatestServersResponse{Servers: pbServers}, nil } + +// FindNearbyServers 查找某个服务附近的服务 +func (this *ServerService) FindNearbyServers(ctx context.Context, req *pb.FindNearbyServersRequest) (*pb.FindNearbyServersResponse, error) { + _, err := this.ValidateAdmin(ctx, 0) + if err != nil { + return nil, err + } + + var tx = this.NullTx() + + // 查询服务的Group + groupIds, err := models.SharedServerDAO.FindServerGroupIds(tx, req.ServerId) + if err != nil { + return nil, err + } + if len(groupIds) > 0 { + var pbGroups = []*pb.FindNearbyServersResponse_GroupInfo{} + for _, groupId := range groupIds { + group, err := models.SharedServerGroupDAO.FindEnabledServerGroup(tx, groupId) + if err != nil { + return nil, err + } + if group == nil { + continue + } + + var pbGroup = &pb.FindNearbyServersResponse_GroupInfo{ + Name: group.Name, + } + servers, err := models.SharedServerDAO.FindNearbyServersInGroup(tx, groupId, req.ServerId, 10) + if err != nil { + return nil, err + } + for _, server := range servers { + pbGroup.Servers = append(pbGroup.Servers, &pb.Server{ + Id: int64(server.Id), + Name: server.Name, + IsOn: server.IsOn == 1, + }) + } + pbGroups = append(pbGroups, pbGroup) + } + + if len(pbGroups) > 0 { + return &pb.FindNearbyServersResponse{ + Scope: "group", + Groups: pbGroups, + }, nil + } + } + + // 集群 + clusterId, err := models.SharedServerDAO.FindServerClusterId(tx, req.ServerId) + if err != nil { + return nil, err + } + servers, err := models.SharedServerDAO.FindNearbyServersInCluster(tx, clusterId, req.ServerId, 10) + if err != nil { + return nil, err + } + if len(servers) == 0 { + return &pb.FindNearbyServersResponse{ + Scope: "cluster", + Groups: nil, + }, nil + } + + clusterName, err := models.SharedNodeClusterDAO.FindNodeClusterName(tx, clusterId) + if err != nil { + return nil, err + } + var pbGroup = &pb.FindNearbyServersResponse_GroupInfo{ + Name: clusterName, + } + for _, server := range servers { + pbGroup.Servers = append(pbGroup.Servers, &pb.Server{ + Id: int64(server.Id), + Name: server.Name, + IsOn: server.IsOn == 1, + }) + } + + return &pb.FindNearbyServersResponse{ + Scope: "group", + Groups: []*pb.FindNearbyServersResponse_GroupInfo{pbGroup}, + }, nil +}