2011-11-02 16 views
5

Tengo una aplicación Grails bastante convencional. Es monolítico; aunque está algo dividido en complementos a lo largo de las líneas de funcionalidad, está integrado en una sola guerra para la implementación. Debido a las limitaciones arquitectónicas de la empresa, debo considerar aislar la persistencia de la aplicación en un servicio web (o una serie de servicios web). ¿Cuál es el mejor enfoque para dividir una aplicación de Grails en un servicio de persistencia y una aplicación de presentación?¿Cuál es la mejor manera de dividir una aplicación Grails en servicio (s) web y una presentación?

+0

ya ha respondido gran parte de su propia pregunta al afirmar que debe tener en cuenta los servicios web y un nivel de presentación :) ¿Está buscando más información sobre la arquitectura o las opciones tecnológicas?Supongo que la presentación se desplegará en una zona desmilitarizada y se separará del nivel de servicios por un cortafuegos ... ¿tiene alguna restricción arquitectónica adicional que influya materialmente en una respuesta? – darrend

+0

Estoy buscando una solución centrada en Grails. Me parece que la semántica ya existe para que la plataforma me ayude. Considere dos extremos: (1) señala un complemento de "bala mágica" que transforma instantáneamente mi controlador, taglib y código de servicio para que sea consciente remotamente, y produce una compilación de servicio web para mis clases de dominio, o (2) usted explique que Grails no es apto para separar la presentación y la persistencia de esta manera. Ninguno de los dos es sensato, por supuesto, pero en el medio, podrías sugerir una forma de aprovechar lo que tengo de una manera que se ajuste al paradigma de Grails con elegancia. –

+0

¿Cuál es la razón detrás del cortafuegos de la base de datos, pero que permite que las operaciones se realicen a través de un servicio web? ¿Esperas una seguridad mejorada? No veo cómo puede mejorar la seguridad. – Antoine

Respuesta

0

No tengo una solución lista para su problema, y ​​no creo que exista. Solo explicaré la solución que uso y lo que consideraría en su caso.

En mi organización, nuestro enfoque es separar nuestras aplicaciones en un back-end de Grails y un front-end en Flex. La razón es que tenemos muchos componentes Flex listos para usar que tomarían demasiado tiempo para volver a implementarlos utilizando tecnologías web puras, pero este no es mi punto.

La creación de un back-end REST en Grails es rápida, ya que las vistas tienen scaffolded cuando corresponde, los controladores son sencillos y la validación de entrada se simplifica enormemente por las restricciones de dominio.

El inconveniente de esta división es que la definición de objetos de dominio debe duplicarse en el front-end. Puede incluir la validación de objetos en el front-end o no, pero si los omite, influirá en la capacidad de respuesta de la interfaz de usuario (solicitudes al servidor REST en llamadas AJAX para validación en tiempo real para obtener los errores) . Al final, nuestra aplicación es bastante engorrosa porque la modificación de objetos en el back-end implica modificaciones en el front-end. Además, hacemos la validación tanto en el front-end como en el back-end, y este código no se comparte, por lo que debe mantenerse en fase y mantenerse en dos lugares.

Nuestras aplicaciones se dividen de una manera similar a dos aplicaciones Grails completamente distintas que no compartirían código. Una solución que funcionaría en su caso pero que no es lo que está buscando, de seguro.

En su caso, veo dos soluciones viables para la interfaz web:

  • utilizan el Groovy REST client library a buscar y enviar de vuelta a su dominio de objetos directamente desde el controlador. Si es necesario, agrúpelos en objetos de comando que reflejen los objetos de su dominio, de modo que pueda compartir el código de validación con el back-end.

  • crea algún tipo de REST GORM que reemplaza Hibernate con consultas a su servicio web REST. Puede ver el GORM for Mongo Plugin como un ejemplo de cómo crear dicho reemplazo GORM.

Me gusta la última idea, sería un plugin público útil. Todavía no existe, desafortunadamente.

+0

Me gusta tu última idea, también. Me gustaría tener la experiencia de rebuscar con GORM, y el beneficio para el público podría ser significativo si resulta bien. –

+1

Buena suerte con eso :) No hay un estándar universal para API REST y cada uno debe considerarse en cuanto al mérito. La calidad varía significativamente. A diferencia de la asignación de métodos de metaclase a un back-end de base de datos diferente donde la integración es fija, se debe proporcionar una forma para que el programador asigne los métodos a la API REST específica que desea utilizar. Cargado con una complejidad insoluble si es posible, pensé. Algunas buenas consideraciones de diseño RESTful en apigee.com por cierto, no menos importante esta: http://blog.apigee.com/detail/restful_api_design/ – darrend

1

Ponga sus clases de dominio en un plugin de Grails, y tenga dos aplicaciones distintas de Grails, una para su front-end web y otra para su servicio web. Ambos acceden a la base de datos directamente, pero el código de persistencia no está duplicado.

Aquí hay un blog post que tiene algunos detalles más sobre cómo darse cuenta de eso.

+0

La publicación del blog es excelente. Te agradezco que me hayas señalado. Sin embargo, no fui lo suficientemente explícito en la descripción de mi problema. Considera que * prohibited * tiene acceso a la base de datos directamente desde mi aplicación. En cambio, debo operar la presencia web desde una aplicación externa que no se comunique con la base de datos, guardar a través de un servicio web. Aún así, colocar todos los objetos de dominio en un complemento es una interesante línea de pensamiento. –

+0

Mantenemos nuestras clases de dominio en un plugin de Grails para que algunas de nuestras aplicaciones de Grails puedan usar la misma base de datos. Funciona bien. – erturne

Cuestiones relacionadas