2010-11-18 9 views
8

Nuestra empresa comenzó con un solo producto, una aplicación de rieles respaldada por algunos servicios de Java, y luego decidió que querían otro producto inicialmente bastante diferente al primero, pero a medida que pasaba el tiempo nos hemos dado cuenta de que están empezando a converger, y para que un código cambie a uno, se requiere un cambio de código similar al otro para una nueva corrección de error/función. Esto obviamente se está convirtiendo en un dolor.Combinando 2 aplicaciones de rieles con una única base de código

En algunos casos tenemos gemas que comparten algunas de esta funcionalidad pero va más allá de rubí en JavaScript, CSS, etc ..

Así que estoy encargado de la fusión de estas dos aplicaciones en una sola base de código. Creo que finalmente nos gustaría que sea una aplicación única con permiso de acceso basado en roles, pero eso vendrá mucho más tarde.

Mi primer pensamiento para unirlos rápidamente es crear dos motores de rieles y compartir libs comunes entre ellos. Creo que esta es la forma más rápida de combinar el código, buscar secciones comunes y comenzar a compartir.

Mi primer problema es cómo enrutar entre las aplicaciones. Una aplicación utiliza un único nombre de dominio que nunca cambia, la otra aplicación tiene muchos dominios. ¿Puede alguien sugerir cómo podría enrutar una solicitud particular a una aplicación en particular para que puedan permanecer separadas para comenzar mientras comparten una base de código común de libs?

O, si alguien tiene otras sugerencias sobre cómo combinar estas aplicaciones, soy todo oídos.

Son los dos rieles 2.3.10 aplicaciones en ejecución jruby 1.5.3, pero estamos abiertos a la posibilidad de actualizar a Rails3 si eso haría las cosas mucho más fácil o más limpio (es decir, con una mejor integración Rack)

I no hemos hecho ninguna programación de Rack, pero nunca nos duele saber si eso nos hará la vida más fácil.

+0

estante sería una solución de implementación y, probablemente, no es la solución aquí. – Chirantan

+0

rack es el middleware ¿verdad? Estaba pensando que podría interceptar la solicitud y la ruta de manera apropiada? pero de nuevo no sé mucho al respecto – brad

Respuesta

1

Su idea de usar motores es lo que yo sugeriría.

Para el enrutamiento, lo manejaría fuera de Rails.

Por ejemplo, usted haría lo siguiente en 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

¿Puedes explicar la parte anterior? Nunca he usado esto con nginx. Además, entiendo que coincidan el dominio y el proxy de manera apropiada, pero quiero que mis dos aplicaciones estén contenidas en una aplicación de rieles, así que de acuerdo con esto, supongo que mis rutas entre los dos motores de rieles deben ser únicas. Esperaba que pudieran compartir ciertas rutas, pero serían enrutados a la acción correcta en función del dominio. – brad

+0

Supongo que fui por la ruta nginx b/c de lo que decías sobre dominios, que es algo que normalmente manejaría fuera de Rails. En cuanto a la cadena ascendente, solo define un punto final (o más de uno) que maneja las solicitudes. En nginx + pasajero: "upstream my_rails_app {server 10.1.2.3:8000;} server {listen 10.1.2.3:8000 etc. etc." –

+0

esto es esencialmente lo que terminamos haciendo – brad

2

Debe evitar compartir el código en el nivel del servidor, lo mejor sería crear bibliotecas que incluyan una base de código común y usarlas durante el desarrollo. Probablemente, la mejor toma sería utilizar ayudantes, ya que es la forma más fácil de proporcionar módulos que proporcionan funcionalidades en todo su código.

En cuanto a la reescritura de funcionalidades para una aplicación, elija aquella con un conjunto mayor de código listo como base. Debería ser posible migrar código por método usando un servidor web que soporte la reescritura de url. Pensé en usar apache con mod_rewrite. Por lo tanto, el plan sería:

  1. Configure ambas aplicaciones para que sean accesibles a través de un apache.
  2. Elija un método que sea similar en ambos y vuelva a escribirlo en una aplicación para admitir ambos requisitos de las aplicaciones.
  3. En apache, agregue una regla mod_rewrite para redirigir el tráfico a una aplicación solo en esta acción.
  4. Vaya al punto dos hasta que todo se reescriba.
  5. quitar aplicación de edad y ajuste de enrutamiento/mod_rewrite para utilizar la aplicación de una

Usted no tiene que utilizar Apache, debe haber otros servidores web que apoyan la reescritura de URL.

Estaba pensando en usar este algoritmo para reescribir nuestra aplicación en rieles 3.0.

Cuestiones relacionadas