Cách cài đặt Vertx trong Spring
NỘI DUNG BÀI VIẾT
Tổng quan
Trong bài viết nhanh này, chúng ta sẽ thảo luận về việc tích hợp Spring với Vert-x và tận dụng những gì tốt nhất của cả hai thế giới: tính năng Spring mạnh mẽ và nổi tiếng cũng như vòng lặp sự kiện đơn phản ứng từ Vert.x.
Setup
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>3.4.1</version>
</dependency>
Code language: HTML, XML (xml)
Lưu ý rằng chúng ta đã loại trừ sự phụ thuộc Tomcat được nhúng khỏi spring-boot-starter-web vì chúng ta sẽ triển khai các dịch vụ của mình bằng cách sử dụng các đỉnh.
Spring Vert.x Application
Bây giờ, chúng ta sẽ xây dựng một ứng dụng mẫu với hai đỉnh được triển khai.
Verticle đầu tiên định tuyến các yêu cầu tới trình xử lý gửi chúng dưới dạng thông điệp đến địa chỉ đã cho. Verticle khác lắng nghe tại một địa chỉ nhất định.
Hãy xem xét những điều này trong hành động.
3.1. Sender Verticle
ServerVerticle chấp nhận các yêu cầu HTTP và gửi chúng dưới dạng tin nhắn đến một địa chỉ được chỉ định. Hãy tạo một lớp ServerVerticle mở rộng AbstractVerticle và ghi đè phương thức start () để tạo Máy chủ HTTP của chúng ta:
@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));
}
Code language: PHP (php)
Trong trình xử lý yêu cầu máy chủ, chúng ta đã chuyển một đối tượng bộ định tuyến, đối tượng này chuyển hướng bất kỳ yêu cầu nào đến trình xử lý getAllArticlesHandler:
private void getAllArticlesHandler(RoutingContext routingContext) {
vertx.eventBus().<String>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();
}
});
}
Code language: JavaScript (javascript)
Trong phương thức trình xử lý, chúng ta đang chuyển một sự kiện tới bus Sự kiện Vert.x, với id sự kiện là GET_ALL_ARTICLES. Sau đó, chúng ta xử lý lệnh gọi lại tương ứng cho các trường hợp thành công và lỗi.
Thông báo từ bus sự kiện sẽ được ArticleRecipientVerticle sử dụng, sẽ được thảo luận trong phần sau.
3.2. Recipient Verticle
ArticleRecipientVerticle lắng nghe các thông báo đến và đưa vào một Spring bean. Nó đóng vai trò là điểm hẹn của Spring và Vert.x
Chúng ta sẽ đưa bean dịch vụ Spring vào một Verticle và gọi các phương thức tương ứng:
@Override
public void start() throws Exception {
super.start();
vertx.eventBus().<String>consumer(GET_ALL_ARTICLES)
.handler(getAllArticleService(articleService));
}
Code language: CSS (css)
Đây, articleService là một Spring bean được tiêm vào:
@Autowired
private ArticleService articleService;
Code language: CSS (css)
Mục này sẽ tiếp tục lắng nghe bus sự kiện trên một địa chỉ GET_ALL_ARTICLES. Khi nhận được thông báo, nó sẽ ủy quyền cho phương thức xử lý getAllArticleService:
private Handler<Message<String>> getAllArticleService(ArticleService service) {
return msg -> vertx.<String> 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());
}
});
}
Code language: JavaScript (javascript)
Thao tác này thực hiện thao tác dịch vụ được yêu cầu và trả lời tin nhắn kèm theo trạng thái. Thư trả lời đang được tham chiếu tại ServerVerticle và kết quả gọi lại như chúng ta đã thấy trong phần trước.
Service Class
@Service
public class ArticleService {
@Autowired
private ArticleRepository articleRepository;
public List<Article> getAllArticle() {
return articleRepository.findAll();
}
}
Code language: PHP (php)
Deploying Verticles
Chúng ta sẽ triển khai ứng dụng, giống như cách chúng ta sẽ làm cho một ứng dụng Spring Boot thông thường. Chúng ta phải tạo một cá thể Vert.X và triển khai các đỉnh trong đó, sau khi hoàn thành khởi tạo ngữ cảnh 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);
}
}
Code language: JavaScript (javascript)
Lưu ý rằng, chúng ta đang đưa các thể hiện verticle vào lớp ứng dụng Spring. Vì vậy, chúng ta sẽ phải chú thích các lớp Verticle,
Vì vậy, chúng ta sẽ phải chú thích các lớp Verticle, ServerVerticle và ArticleRecipientVerticle bằng @Component.
Hãy thử nghiệm ứng dụng:
@Test
public void givenUrl_whenReceivedArticles_thenSuccess() {
ResponseEntity<String> responseEntity = restTemplate
.getForEntity("http://localhost:8080/api/baeldung/articles", String.class);
assertEquals(200, responseEntity.getStatusCodeValue());
}
Code language: JavaScript (javascript)
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu về cách xây dựng RESTful WebService bằng Spring và Vert.x.
Happy Learning!!!
Leave a Reply