public RpcEndpoint getOrCreateEndpoint(String nodeId, @Nullable TurmsConnection connection) {
        if (nodeId.equals(discoveryService.getLocalMember()
                .getNodeId())) {
            throw new IllegalArgumentException(
                    "The target node ID of RPC endpoint cannot be the local node ID: "
                            + nodeId);
        }
        RpcEndpoint endpoint = nodeIdToEndpoint.get(nodeId);
        if (endpoint != null && (connection == null || connection == endpoint.getConnection())) {
            return endpoint;
        }
        return nodeIdToEndpoint.computeIfAbsent(nodeId, id -> createEndpoint(id, connection));
    }
@implNote 1. We don't need to close the endpoint after removing them because they
          should be closed when "onConnectionClosed" invoked.
          <p>
          2. We only need to try to get the node ID from the connection because if
          its member exists, the connection should have bound with the node ID too.
turms-server-common/src/main/java/im/turms/server/common/infra/cluster/service/rpc/RpcService.java