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?
Respuesta
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.
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. –
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
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.
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. –
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
- 1. ¿Cuál es la mejor manera de hacer una solicitud de servicio web POST en Grails?
- 2. ¿Cuál es la mejor manera de crear una cola para trabajos de larga duración en una aplicación de Grails?
- 3. ¿Cuál es la mejor manera de implementar una aplicación Pylons?
- 4. ¿Cuál es la mejor manera de migrar una aplicación web desordenada existente a MVC elegante?
- 5. ¿Cuál es la mejor manera de perfilar una aplicación Sinatra?
- 6. ¿Cuál es la mejor manera de dividir dos objetos TimeSpan?
- 7. ¿Cuál es la mejor manera de dividir una cadena por un delimitador de manera funcional?
- 8. ¿Cuál es una buena manera de dividir cadenas aquí?
- 9. ¿Cuál es la mejor manera de dividir una cadena para obtener todas las subcadenas de Ruby?
- 10. La mejor manera de autenticar usuarios en una aplicación web
- 11. ¿Cuál es la mejor manera de escribir una aplicación web para raspar?
- 12. ¿Cuál es la mejor manera de hacer una aplicación web java modular
- 13. ¿Cómo seleccionar una implementación de servicio en una aplicación Grails?
- 14. ¿Cuál es la mejor manera de implementar servicios en segundo plano para una aplicación ASP.NET?
- 15. ¿Cuál es la mejor manera de implementar una función de "última vez que se ve" en una aplicación web django?
- 16. ¿Cuál es la mejor manera de almacenar datos como 'Favoritos' en una aplicación de Android?
- 17. ¿Cuál es la mejor manera de controlar una aplicación de escritorio?
- 18. ¿Cuál es la mejor manera de configurar una descripción del servicio de Windows en .net
- 19. ¿Cuál es la mejor herramienta para pruebas funcionales de una aplicación web compleja?
- 20. ¿Cuál es la mejor manera de implementar inicio de sesión para un servicio web?
- 21. ¿Cuál es la mejor manera de dividir una cadena en una matriz de caracteres Unicode en PHP?
- 22. ¿Cuál es la mejor manera de transferir una imagen a través de un servicio web en C#?
- 23. ¿Cuál es la mejor manera de Versión un servicio web ASP.NET 2.0?
- 24. Cuál es la mejor manera de tener Autenticación para un servicio web
- 25. ¿Cuál es la mejor manera de analizar una gramática simple?
- 26. ¿Cuál es la mejor manera de devolver grandes cantidades de datos binarios de un servicio web?
- 27. La mejor manera de burlarse del servicio web de Java
- 28. ¿Cuál es la mejor manera de incrementar una enumeración?
- 29. ¿Cuál es la diferencia entre una aplicación de servicio WCF y una biblioteca de servicios WCF?
- 30. ¿Cuál sería considerada la mejor manera de diseñar el correo electrónico desde una aplicación web C#?
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
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. –
¿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