1. Обзор
В этой краткой статье мы обсудим интеграцию Spring с Vertex и используем лучшее из обоих миров: мощную и хорошо известную функцию Spring и реактивный цикл с одним событием от Vert.x.
Чтобы узнать больше о Vert.x, пожалуйста, ознакомьтесь с нашей вступительной статьей здесь .
2. Настройка
Во-первых, давайте установим наши зависимости:
org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat io.vertx vertx-web 3.4.1
Обратите внимание, что мы исключили встроенную зависимость Tomcat из spring-boot-starter-web s , поскольку мы собираемся развернуть наши службы с помощью verticles.
Вы можете найти последние зависимости здесь .
3. Применение Spring Vert.x
Теперь мы построим пример приложения с двумя развернутыми вершинами.
Первая вертикаль направляет запросы обработчику, который отправляет их в виде сообщений на указанный адрес. Другая вертикаль слушает по заданному адресу.
Давайте посмотрим на это в действии.
3.1. Вершина отправителя
Сервер Verticle принимает HTTP-запросы и отправляет их в виде сообщений на указанный адрес. Давайте создадим Server Verticle класс, расширяющий AbstractVerticle, и переопределим метод start() для создания вашего HTTP-сервера:
@Override
public void start() throws Exception {
super.start();
Router router = Router.router(vertx);
router.get("/api/baeldung/articles")
.handler(this::getAllArticlesHandler);
vertx.createHttpServer()
.requestHandler(router::accept)
.listen(config().getInteger("http.port", 8080));
}В обработчике запросов сервера мы передали объект router , который перенаправляет любой входящий запрос в обработчик getAllArticlesHandler :
private void getAllArticlesHandler(RoutingContext routingContext) {
vertx.eventBus().send(ArticleRecipientVerticle.GET_ALL_ARTICLES, "",
result -> {
if (result.succeeded()) {
routingContext.response()
.putHeader("content-type", "application/json")
.setStatusCode(200)
.end(result.result()
.body());
} else {
routingContext.response()
.setStatusCode(500)
.end();
}
});
} В методе обработчика мы передаем событие на шину событий Vert.x с идентификатором события GET_ALL_ARTICLES. Затем мы обрабатываем обратный вызов соответственно для сценариев успеха и ошибок.
Сообщение из шины событий будет использоваться вершиной Получателя статьи , , обсуждаемой в следующем разделе.
3.2. Вертикаль получателя
Вершина получателя статьи прослушивает входящие сообщения и вводит компонент Spring . Он действует как точка встречи для Spring и Vert.x.
Мы введем компонент Spring service в вершину и вызовем соответствующие методы:
@Override
public void start() throws Exception {
super.start();
vertx.eventBus().consumer(GET_ALL_ARTICLES)
.handler(getAllArticleService(articleService));
}
Здесь/| article Service – это впрыснутый пружинный боб:
@Autowired private ArticleService articleService;
Эта вершина будет продолжать прослушивать шину событий по адресу GET_ALL_ARTICLES. Как только он получает сообщение, он делегирует его методу обработчика get All Article Service :
private Handler> getAllArticleService(ArticleService service) { return msg -> vertx. executeBlocking(future -> { try { future.complete( mapper.writeValueAsString(service.getAllArticle())); } catch (JsonProcessingException e) { future.fail(e); } }, result -> { if (result.succeeded()) { msg.reply(result.result()); } else { msg.reply(result.cause().toString()); } }); }
Это выполняет необходимую операцию обслуживания и отвечает на сообщение со статусом. Ответ на сообщение ссылается на Серверную вершину и обратный вызов результат , как мы видели в предыдущем разделе.
4. Класс обслуживания
Класс обслуживания-это простая реализация, предоставляющая методы для взаимодействия со слоем репозитория:
@Service
public class ArticleService {
@Autowired
private ArticleRepository articleRepository;
public List getAllArticle() {
return articleRepository.findAll();
}
} Репозиторий Article extends, org.springframework.data.repository.CrudRepository и предоставляет базовые функции CRUD.
5. Развертывание вершин
Мы будем развертывать приложение точно так же, как это было бы сделано для обычного приложения Spring Boot. Мы должны создать экземпляр Vert.X и развернуть в нем вершины после завершения инициализации контекста Spring:
public class VertxSpringApplication {
@Autowired
private ServerVerticle serverVerticle;
@Autowired
private ArticleRecipientVerticle articleRecipientVerticle;
public static void main(String[] args) {
SpringApplication.run(VertxSpringApplication.class, args);
}
@PostConstruct
public void deployVerticle() {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(serverVerticle);
vertx.deployVerticle(articleRecipientVerticle);
}
}Обратите внимание, что мы вводим экземпляры verticle в класс Spring application. Итак, нам придется аннотировать классы вершин,
Итак, нам придется аннотировать классы Verticle, Server Verticle и Article Recipient Verticle с помощью @Component.
Давайте протестируем приложение:
@Test
public void givenUrl_whenReceivedArticles_thenSuccess() {
ResponseEntity responseEntity = restTemplate
.getForEntity("http://localhost:8080/api/baeldung/articles", String.class);
assertEquals(200, responseEntity.getStatusCodeValue());
} 6. Заключение
В этой статье мы узнали о том, как создать веб-сервис RESTful с использованием Spring и Vert.x.
Как обычно, пример доступен на GitHub.