@Override
    public String offline(final String selectorName, final List<URIRegisterDTO> offlineList, final String namespaceId) {
        String pluginName = PluginNameAdapter.rpcTypeAdapter(rpcType());
        SelectorService selectorService = getSelectorService();
        SelectorDO selectorDO = selectorService.findByNameAndPluginNameAndNamespaceId(selectorName, pluginName, namespaceId);
        if (Objects.isNull(selectorDO)) {
            return Constants.SUCCESS;
        }
        List<URIRegisterDTO> validOfflineUrl = offlineList.stream()
                .filter(dto -> Objects.nonNull(dto.getPort()) && StringUtils.isNotBlank(dto.getHost()))
                .collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(validOfflineUrl)) {
            for (URIRegisterDTO offlineUrl : validOfflineUrl) {
                GrpcUpstream grpcUpstream = CommonUpstreamUtils.buildDefaultGrpcUpstream(offlineUrl.getHost(), offlineUrl.getPort(), offlineUrl.getNamespaceId());
                removeDiscoveryUpstream(selectorDO.getId(), grpcUpstream.getUpstreamUrl());
            }
            DiscoverySyncData discoverySyncData = fetch(selectorDO.getId(), selectorDO.getName(), pluginName, selectorDO.getNamespaceId());
            if (LOG.isDebugEnabled()) {
                LOG.debug("grpc offline discoverySyncData:{}", GsonUtils.getInstance().toJson(discoverySyncData));
            }
            getEventPublisher().publishEvent(new DataChangedEvent(ConfigGroupEnum.DISCOVER_UPSTREAM, DataEventTypeEnum.UPDATE, Collections.singletonList(discoverySyncData)));
        }
        return Constants.SUCCESS;
    }
Build handle string.

@param uriList    the uri list
@param selectorDO the selector do
@return the string
shenyu-admin/src/main/java/org/apache/shenyu/admin/service/register/ShenyuClientRegisterGrpcServiceImpl.java