2011-02-05 14 views
32

Estoy planeando una nueva aplicación y he estado experimentando con GWT como una posible interfaz. La pregunta de diseño que estoy enfrentando es esta.¿Debo construir un backend REST para la aplicación GWT?

¿Debo usar Opción A: GWT-RPC y construir la aplicación rápida

Opción B: Construir un motor RESTO utilizando Spring MVC 3.0 con toda la gran @Controller, @Service, anotaciones @Repository y construir una la biblioteca del lado del cliente para hablar con el back-end utilizando las características de superposición GWT y el generador de solicitudes GWT?

Me interesan todos los pros y contras y las experiencias de las personas con este tipo de diseño?

+0

Algunas aclaraciones adicionales: 1) Me gustaría tener otras interfaces para esta aplicación, la palabra clave podría así que hay un patrón de diseño para diseñar cosas con GWT-RPC de tal manera que se implemente una capa de interfaz REST en el futuro no requiere gran refactorización? – ams

Respuesta

28

Hazte la pregunta: "¿Tendré que volver a utilizar la interfaz del lado del servidor con un front-end que no sea de GWT?"

Si la respuesta es "no, voy a tener un cliente GWT": Puede utilizar GWT-RPC, y aprovechar el hecho de que se puede utilizar objetos de Java, tanto en el servidor y el cliente -lado. Esto también puede hacer que la comunicación sea un poco más eficiente, al menos cuando se usa con <inherits name="com.google.gwt.user.RemoteServiceObfuscateTypeNames" />, lo que acorta los nombres de tipo a pequeños valores numéricos. También obtendrá la ventaja de un mejor manejo de errores (usando Excepciones), escriba seguridad, etc.

Si la respuesta es "sí, haré que mi servicio sea accesible para múltiples tipos de interfaces": Puede usar REST con JSON (o XML), que también puede ser entendido por clientes que no son de GWT. Además de cambiar clientes, esto también le permitiría cambiar a una implementación de servidor diferente (tal vez no Java) en el futuro más fácilmente. La desventaja es que probablemente tendrá que escribir wrappers (JavaScript Overlay Types) o código de transformación en el lado del cliente GWT para construir objetos Java agradables a partir de los objetos JSON. Deberá tener especial cuidado cuando implemente una nueva versión del servicio, lo que nos devuelve a la falta de seguridad de tipo.

La tercera opción, por supuesto, sería construir ambas. Elegiría esta opción, si la interfaz REST pública fuera diferente de la interfaz GWT-RPC de todos modos, tal vez proporcionando solo un subconjunto de servicios fáciles de usar.

+1

Ahora mismo no necesito construir una interfaz REST por separado, pero tal vez quiera hacerlo en el futuro. No creo en hacer las cosas genéricas solo porque las necesite, no me gusta pagar por adelantado las cosas genéricas. ¿Conoces algún patrón que me permita implementar GWT-RPC para comenzar de tal manera que agregar un REST sería trivial en la misma base de código? – ams

+2

@ams: Absolutamente. Probablemente pueda introducir un mapeador entre los objetos Java y JSON tan pronto como lo necesite, y luego podrá elegir entre ofrecer ambos servicios o desaprobar el GWT-RPC. No me preocuparía anticipar interfaces Java genéricas para esto demasiado, porque de todos modos un cambio de este tipo producirá cambios (pequeños) en el código. Simplemente realice una prueba de realidad de vez en cuando: "¿Dónde será más difícil hacerlo en JSON más tarde?" (Por ejemplo, los gráficos de objetos que hacen referencia a las mismas instancias varias veces o incluso contienen círculos) son más fáciles de enviar con GWT-RPC. . –

0

Yo diría que esto depende del alcance de su aplicación total. Si su back-end debe ser utilizado por otros clientes, debe ser extensible, etc. luego, cree un módulo por separado utilizando REST. Si el backend solo debe ser utilizado por este cliente, entonces elija la solución GWT-RPC.

3

Yo diría construir un backend REST. En mi último proyecto comenzamos desarrollando usando GWT-RPC durante los primeros meses, queríamos un rápido arranque. Más adelante, cuando necesitábamos la API REST, era tan costoso hacer la refactorización que terminamos con dos API de back-end (REST y RPC)

Si construyes un backend REST apropiado, y una infraestructuralización infra en el lado del cliente (para transformar el json \ xml en objetos GWT Java), entonces el beneficio del RPC es casi nulo.

Otra ventaja a veces olvidada del enfoque REST es que es más natural para el navegador que ejecuta el cliente, RPC es un protocolo propiciatorio, donde todas las solicitudes usan POST. Puede beneficiarse del almacenamiento en caché del lado del cliente al leer recursos de la manera estándar.

Contestación comentarios AMS: con respecto al protocolo RPC, última vez que "olieron" usando Firebug que no se veía como JSON, por lo que no saben de eso.Sin embargo, incluso si está basado en json, todavía utiliza solo el método HTTP POST para comunicarse con el servidor, por lo que mi punto aquí sobre el almacenamiento en caché sigue siendo válido, el navegador no almacenará en caché las solicitudes POST.

En cuanto a la retrospectiva y lo que podría haber sido mejor, escribir el servicio RPC en una arquitectura orientada a recursos podría llevar más tarde a una migración más fácil a REST. recuerde que en REST normalmente se exponen los recursos con las operaciones CRUD básicas, si se enfoca en ese enfoque al escribir el servicio RPC, entonces debería estar bien.

+0

De las presentaciones de Google IO el protocolo GWT-RPC es JSON en el camino de regreso al navegador, y algún otro formato más eficiente en el camino hacia el servidor, por lo que no veo la naturaleza propiciatoria del protocolo RPC como un problema en decidir sobre REST vs. GWT-RPC. – ams

+0

En Retrospect, después de tener que construir estos dos backends, ¿vio alguna forma de construir los servicios GWT-RPC de tal forma que agregar el extremo posterior REST hubiera sido trivial? ¿Puede compartir las lecciones aprendidas si desea tener tanto GWT-RPC como REST – ams

3

El estilo arquitectónico REST promueve mensajes inspeccionables (que ayudan a la depuración y la seguridad), evolución API, plataformas múltiples, interfaces simples, recuperación de fallas, alta escalabilidad y (opcionalmente) sistemas extensibles mediante código bajo demanda. Negocia el rendimiento por interacción para la eficiencia general de la red. Reduce el control del servidor sobre el comportamiento consistente de la aplicación.

El "estilo RPC" (como decimos en oposición a REST) ​​promueve uniformidad de plataforma, variabilidad de interfaz, generación de código (y por lo tanto la capacidad de simular que la red no existe, pero vea Fallacies), y interacciones personalizadas. Negocia la eficiencia general de la red para un alto rendimiento por interacción. Aumenta el control del servidor sobre el comportamiento consistente de la aplicación.

Si su aplicación desea las cualidades anteriores, utilice el estilo REST. Si desea lo último, use el estilo RPC.

+0

? Desde las cosas GWT-RPC con las que he jugado realmente no pretende que la red no esté allí, tiene que escribir explícitamente el código de manejo de errores en cualquier momento usted crea una implementación del lado del cliente Asyc de una interfaz de servicio remoto. Entiendo lo que dices sobre RPC vs. REST como una opción arquitectónica. – ams

23

Puede hacer ambas cosas si también utiliza el proyecto RestyGWT. Hará que llamar a los recursos JSON basados ​​en REST sea tan fácil como usar GWT-RPC. Además, normalmente puede reutilizar las mismas DTO de respuesta de solicitud del lado del servidor en el lado del cliente.

+3

+1 ¡Esta es la verdadera respuesta! – HDave

9

Nos encontramos con el mismo problema cuando creamos el Spiffy UI Framework. Elegimos REST y nunca volvería. Incluso diría que GWT-RPC es un GWT Anti-pattern.

REST es una buena idea, incluso si nunca tiene la intención de exponer sus puntos finales REST. Crear una API REST hará que su UI sea más rápida, su API sea mejor y toda su aplicación sea más fácil de mantener.

1

Si está planeando usar Hibernate/JPA en el servidor y enviar los POJO resultantes con datos relacionales al cliente (es decir, un objeto Empleado con una colección de Teléfonos), definitivamente vaya con el Implementación de REST.

Empecé mi proyecto GWT hace un mes usando GWT RPC. Todo estuvo bien hasta que intenté serializar un objeto del archivo base subyacente con una relación One-To-Many. Y consiguió la temida:

com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentList' was not included in the set of types which can be serialized by this SerializationPolicy 

Si se encuentra con esto y quiere quedarse con GWT de RPC que tendrá que usar algo como:

  • GWT Solicitud de fábrica (www.gwtproject.org/doc/latest /DevGuideRequestFactory.html) - lo cual obliga a escribir 3+ clases/interfaces por POJO que desee compartir con el cliente. ¡OUCH!
  • Gilead (sourceforge.net/projects/gilead/) - que parece un proyecto muerto.

Ahora estoy usando RestyGWT. El cambio fue bastante sencillo y mi POJO se serializa sin problemas.

Cuestiones relacionadas