2010-11-18 12 views
8

La nostra azienda ha iniziato con un singolo prodotto, un'applicazione di binari supportata da alcuni servizi java, quindi ha deciso di volere un altro prodotto inizialmente notevolmente diverso rispetto al primo, ma con il passare del tempo ci siamo resi conto che stanno iniziando a convergere, e fare un cambio di codice in uno richiede un cambio di codice simile all'altro per una nuova funzionalità/correzione di bug. Questo sta ovviamente diventando un dolore.Combinazione di 2 app per binari a una singola base di codici

In alcuni casi abbiamo gemme che condividono alcune di queste funzionalità, ma va oltre rubino in javascript, css, ecc ..

così sto con il compito di fondere queste due applicazioni in una sola base di codice. Penso che alla fine ci piacerebbe che fosse un'unica app con accesso al ruolo basato sui permessi, ma che arriverà molto più tardi.

Il mio primo pensiero per unirli rapidamente è quello di creare due motori di rotaie e condividere le librerie comuni tra di loro. Penso che questo sia il modo più veloce per combinare il codice, trovare sezioni comuni e iniziare a condividere.

Il mio primo problema è come instradare tra le app. Un'app utilizza un singolo nome di dominio che non cambia mai, l'altra app ha molti domini. Qualcuno può suggerire come posso indirizzare una particolare richiesta ad una particolare app in modo che possano rimanere separate per iniziare mentre condividono una base di codice comune di libs?

Oppure, se qualcuno ha altri suggerimenti su come combinare queste applicazioni, sono tutto orecchie.

Sono entrambi Rails 2.3.10 applicazioni in esecuzione JRuby 1.5.3, ma siamo aperti a possibilmente aggiornamento a Rails3 se che renderebbe le cose molto più facile o più pulito (cioè con una migliore integrazione Rack)

I non ho fatto alcuna programmazione in Rack ma non mi fa mai male imparare se questo renderà la nostra vita più facile.

+0

Rack sarebbe una soluzione di distribuzione e, probabilmente, non è la soluzione qui. – Chirantan

+0

rack è il middleware giusto? stavo pensando che potrebbe intercettare la richiesta e indirizzare in modo appropriato? ma di nuovo non ne so molto – brad

risposta

1

L'idea di utilizzare i motori è ciò che suggerirei.

Per il routing, lo gestisco al di fuori di Rails.

Per esempio, si dovrebbe fare quanto segue in nginx:

server { 
    # Match only one host.              
    listen 80 default; 
    server_name YOUR_SINGLE_APP_DOMAIN; 

    location/{ 
     upstream YOUR_SINGLE_APP_RAILS; 
    } 
} 


server { 
    # Fall thru and match any other host.              
    listen 80 default; 
    server_name ~^.*$; 

    location/{ 
     upstream YOUR_MULTI_DOMAIN_APP_RAILS; 
    } 
} 
+0

Puoi spiegare la parte a monte? Non l'ho mai usato con nginx. Inoltre, capisco la corrispondenza del dominio e il proxying in modo appropriato, ma voglio che le mie due app siano contenute in un'unica app per i binari, quindi secondo questo suppongo che i miei percorsi tra i due motori delle rotaie debbano essere unici? Speravo che potessero condividere determinati percorsi, ma sarebbero stati indirizzati all'azione corretta basata sul dominio. – brad

+0

Suppongo di aver seguito il percorso nginx b/c di quello che stavi dicendo riguardo ai domini, che di solito gestisco al di fuori di Rails. Per quanto riguarda l'upstream, basta definire un endpoint (o più di uno) che gestisce le richieste. In nginx + passenger: "upstream my_rails_app {server 10.1.2.3:8000;} server {ascolta 10.1.2.3:8000 ecc. Ecc." –

+0

questo è essenzialmente ciò che abbiamo finito per fare – brad

2

È consigliabile evitare la condivisione del codice a livello del server, il modo migliore per farlo sarebbe creare librerie con codice comune e utilizzarle durante lo sviluppo. Probabilmente il miglior servizio fotografico sarebbe utilizzare gli helper in quanto è il modo più semplice per fornire moduli che forniscano funzionalità in tutto il codice.

Per quanto riguarda le funzionalità di riscrittura di una sola applicazione, scegliere quella con un set più grande di codice pronto come base. Dovrebbe essere possibile migrare il codice per metodo usando il web server che supporta la riscrittura dell'URL. Ho pensato di usare Apache con mod_rewrite. Quindi il piano sarebbe:

  1. Impostare entrambe le applicazioni per essere accessibili tramite un apache.
  2. Scegli un metodo simile in entrambi e riscrivilo in un'applicazione per supportare entrambi i requisiti delle applicazioni.
  3. In Apache aggiungere una regola mod_rewrite per reindirizzare il traffico a un'applicazione solo su questa azione.
  4. Passare al punto due finché tutto è stato riscritto.
  5. Rimuovere vecchia applicazione e regolare di routing/mod_rewrite di utilizzare la sola applicazione

Non è necessario utilizzare Apache, ci dovrebbe essere altri server web che supportano la riscrittura degli URL.

Stavo pensando di utilizzare questo algoritmo per riscrivere la nostra applicazione su rails 3.0.

Problemi correlati