Служба REST с использованием Dubbo или SpringMVC?

Java
Служба REST с использованием Dubbo или SpringMVC?

И SpringMVC, и Dubbo поддерживают сервисы REST.Когда мы хотим разработать интерфейс сервиса REST, что нам следует выбрать? В этой статье будут рассмотрены следующие два аспекта:

  1. Как написать REST-сервис
  2. Сценарии применения служб REST

1. Как написать REST-сервис

Во-первых, давайте посмотрим, как SpringMVC реализует службу REST:

@RestController
@RequestMapping("/greetings")
public class SpringRestController {

    @RequestMapping(method = RequestMethod.GET,
                    value = "/{name}", 
                    produces = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<?> greeting(@PathVariable String name) {
        String greeting = "Hello " + name;
        return new ResponseEntity<>(greeting, HttpStatus.OK);
    }
}

Студенты, которые использовали SpringMVC, знакомы с этими аннотациями.@RestController,@RequestMapping,@PathVariable.

Прежде чем понять, как Dubbo реализует службы REST, давайте кратко поговорим об истории REST в Dubbo. Dubbo был открыт в 2011 году, а разработка остановилась в 2014 году. Ранее Dubbo не поддерживал REST, и если вы хотите реализовать службу REST, есть способ, вы можете объединить SpringMVC для настройки службы Dubbo в контроллере. Но REST настолько популярен, что, если вы хотите поддерживать REST непосредственно в Dubbo? В 2014 году Dangdang Fork начал поддерживать версию Dubbo под названием DubboX и добавил удаленные вызовы в стиле REST. Позже, после слияния Dubbo и DubboX, Dubbo объединила поддержку REST в DubboX.

После разговора об истории этого фреймворка давайте посмотрим, как Dubbo реализует службы REST:

@Path("/greetings")
public class DubboService {

    @GET
    @Path("/{name}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response greeting(@PathParam("name") String name) {
        String greeting = "Hello " + name;
        return Response.ok(greeting).build();
    }
}

Видно, что аннотации, используемые Dubbo, отличаются от SpringMVC.@Path,@GETа также@PathParam. Этот набор аннотаций определяется спецификацией JAX-RS. Что касается JAX-RS, это стандартный Java REST API.Конкретные реализации с открытым исходным кодом включают Джерси от Oracle, RestEasy от RedHat, CXF и Wink от Apache и Restlet. Dubbo использует RestEasy для поддержки служб REST.

Поскольку Java REST уже имеет стандарт JAX-RS, почему SpringMVC не использует этот стандарт? Я предполагаю, что основная причина должна заключаться в том, что сам SpringMVC имеет свой собственный набор аннотаций, таких как@RequestMappingОн использовался до REST, поэтому при поддержке REST по-прежнему рассмотрите возможность использования исходного стиля аннотаций.

2. Сценарии применения REST-сервисов

В разделе 1 представлены различия между написанием SpringMVC и Dubbo. Тогда как выбрать по сценарию применения. Давайте сначала рассмотрим некоторые сценарии REST-приложения Dubbo:

  1. (Многоязычные) вызовы между разнородными системами внутри предприятия. Система Dubbo служит поставщиком услуг, а системы на других языках (включая некоторые системы Java, не основанные на Dubbo) служат потребителем услуг.Общение между ними осуществляется посредством HTTP и текстовых сообщений. Даже по сравнению с бинарными схемами межъязыковых вызовов, такими как Thrift и ProtoBuf, REST имеет свои уникальные преимущества.
  2. Разработка внешнего открытого API (открытая платформа). Вы можете использовать Dubbo для разработки специализированных приложений Open API или напрямую «прозрачно» опубликовать исходную службу Dubbo, используемую внутри, в качестве внешнего Open REST API.
  3. Упрощение разработки мобильных (планшетных) приложений или настольных клиентов для ПК. Как и в пункте 2, Dubbo можно использовать для разработки серверной части, предназначенной для беспроводных сетей или настольных компьютеров, или служба Dubbo, используемая внутри, может быть напрямую «прозрачно» доступна для мобильных приложений или программ для настольных компьютеров.
  4. Упростите разработку браузерных AJAX-приложений. Как и в случае с пунктом 2, вы можете использовать Dubbo для разработки выделенного сервера AJAX, или вы можете напрямую «прозрачно» предоставить доступ к службе Dubbo, используемой внутри, для JavaScript в браузере. Конечно, многие AJAX-приложения больше подходят для работы с веб-фреймворками, поэтому прямой доступ к сервису Dubbo может быть не очень элегантной архитектурой во многих веб-проектах.
  5. Обеспечить текстовый, легко читаемый метод удаленного вызова между системами Dubbo внутри предприятия., то есть и поставщик услуг, и потребитель основаны на системах Dubbo.
  6. В определенной степени упростить вызовы системы Dubbo к другим разнородным системам.. Службы REST, предоставляемые системами, отличными от Dubbo, можно «прозрачно» вызывать удобным способом, аналогичным Dubbo (независимо от того, находится ли поставщик услуг внутри или вне предприятия). Это обновленная версия пункта 1.

Dubbo RESTful Remoting应用蓝图

Среди них пункты 1, 2 и 3 считаются тремя наиболее ценными сценариями применения служб Dubbo REST, предоставляя службы REST не-Dubbo (гетерогенным) потребителям.

а такжеSpringMVC больше подходит для REST-сервисов для веб-приложений., как в вызове AJAX в пункте 3. Это также соответствует концепции MVC, а служба REST является реализацией уровня представления.

Использование JAX-RSDubbo больше подходит для чисто сервисных приложений., публиковать Bean-компоненты, такие как Service, как сервисы REST.

Автор считает, что если это веб-ориентированное монолитное приложение, то следует использовать SpringMVC, а Dubbo вообще не следует рассматривать. Если это микросервисное приложение, которое использует Dubbo в качестве RPC-фреймворка и в настоящее время должно работать в Интернете, то Dubbo следует использовать непосредственно для публикации сервиса в режиме REST. Нет необходимости вводить SpringMVC для REST. слишком сложно и реализовано.Эффект тот же.

3. Ссылка

  1. Разработка RESTful Remoting в Dubbo
  2. Difference between JAX-RS and Spring Rest

公众号二维码