All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alibaba.spring.boot.rsocket.broker.impl.DiscoveryServiceImpl Maven / Gradle / Ivy

package com.alibaba.spring.boot.rsocket.broker.impl;

import com.alibaba.rsocket.ServiceLocator;
import com.alibaba.rsocket.discovery.DiscoveryService;
import com.alibaba.rsocket.discovery.RSocketServiceInstance;
import com.alibaba.rsocket.events.AppStatusEvent;
import com.alibaba.rsocket.metadata.AppMetadata;
import com.alibaba.spring.boot.rsocket.broker.responder.RSocketBrokerHandlerRegistry;
import com.alibaba.spring.boot.rsocket.broker.responder.RSocketBrokerResponderHandler;
import com.alibaba.spring.boot.rsocket.broker.route.ServiceRoutingSelector;
import com.alibaba.spring.boot.rsocket.broker.supporting.RSocketLocalService;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * discovery service implementation
 *
 * @author leijuan
 */
@RSocketLocalService(serviceInterface = DiscoveryService.class)
public class DiscoveryServiceImpl implements DiscoveryService {
    @Autowired
    private RSocketBrokerHandlerRegistry handlerRegistry;
    @Autowired
    private ServiceRoutingSelector routingSelector;

    @Override
    public Flux getInstances(String serviceId) {
        return findServiceInstances(serviceId);
    }

    @Override
    public Flux getAllServices() {
        return Flux.fromIterable(routingSelector.findAllServices()).map(ServiceLocator::getGsv);
    }

    @NotNull
    private Flux findServiceInstances(String serviceId) {
        Integer serviceHashCode = ServiceLocator.serviceHashCode(serviceId);
        Collection instanceIdList = routingSelector.findHandlers(serviceHashCode);
        if (instanceIdList.isEmpty()) {
            return findServiceInstancesByAppName(serviceId);
        }
        List serviceInstances = new ArrayList<>();
        for (Integer handlerId : instanceIdList) {
            RSocketBrokerResponderHandler handler = handlerRegistry.findById(handlerId);
            if (handler != null) {
                serviceInstances.add(constructServiceInstance(handler));
            }
        }
        return Flux.fromIterable(serviceInstances);
    }

    @NotNull
    private Flux findServiceInstancesByAppName(String appName) {
        return Flux.fromIterable(handlerRegistry.findAll())
                .filter(handler -> handler.getAppMetadata().getName().equalsIgnoreCase(appName))
                .filter(handler -> handler.getAppStatus().equals(AppStatusEvent.STATUS_SERVING))
                .map(this::constructServiceInstance);
    }

    @NotNull
    private RSocketServiceInstance constructServiceInstance(RSocketBrokerResponderHandler handler) {
        AppMetadata appMetadata = handler.getAppMetadata();
        RSocketServiceInstance serviceInstance = new RSocketServiceInstance();
        serviceInstance.setInstanceId(appMetadata.getUuid());
        serviceInstance.setServiceId(appMetadata.getName());
        serviceInstance.setHost(appMetadata.getIp());
        serviceInstance.setPort(appMetadata.getPort());
        serviceInstance.setSchema(appMetadata.getSchema());
        serviceInstance.setSecure(appMetadata.isSecure());
        serviceInstance.setUri(appMetadata.getUri());
        serviceInstance.setMetadata(appMetadata.getMetadata());
        return serviceInstance;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy