Minh họa ứng dụng Hello World với embedding Jetty

Chào mừng các bạn đã trở lại với thachleblog, thời gian gần đây mình có làm việc với embedding Jetty server, dùng trong các ứng dụng microservice. Bản thân mình thấy khá là hay, vì khác hoàn toàn so với các loại ứng dụng trước đây mình đã từng làm qua.

Do đó hôm nay mình sẽ viết bài chia sẻ về embedding Jetty với ứng dụng hello world (ứng dụng thần thánh đối với tất cả các loại ngôn ngữ, framework :D). Với mục đích chia sẻ với các bạn một vài khái niệm và microservice cũng như có thể làm quen với Jetty. Nào chúng ta cùng bắt đầu nhé.

Embedding Jetty

Embedding Jetty có một slogan là “Don’t deploy your application in Jetty, deploy Jetty in your application!” đại ý là thay vì chúng ta có đóng gói ứng dụng của chúng ta dưới dạng war và deploy vào một web server, chúng ta có thể sử dụng Jetty server như một component của ứng dụng. Hay nói cách khác, chúng ta sử dụng HTTP module vào trong ứng dụng, thay vì đặt ứng dụng vào HTTP server.

Sử dụng Embeding Jetty mang lại lợi ích gì?

Trong lập trình micro-service, ta sẽ xem mỗi ứng dụng như một component của toàn bộ hệ thống micro-service, nếu chúng ta deploy chung tất cả ứng dụng vào một web server, khi web server gặp sự cố, toàn bộ ứng dụng sẽ cũng “die” hoặc khi 1 ứng dụng cần restart server, tất cả các ứng dụng khác cũng sẽ “bị” restart theo.

Cũng sẽ rất khó khăn nếu chúng ta deploy mỗi ứng dụng vào 1 web server riêng vì gây lãng phí và khó quản lý. Embedding server sẽ giải quyết vấn đề này bằng cách “nhúng” trực tiếp một web server vào ứng dụng.

Chúng ta sẽ cùng xem ví dụ cách tạo một server bên trong ứng dụng:

Pom.xml sẽ chứa thông tin gói jar jetty-server và jetty-servlet

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>thach.le</groupId>
  5. <artifactId>EmbeddingPuttySample</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <name>EmbeddingPuttySample</name>
  8.  
  9. <dependencies>
  10. <!--Jetty dependencies start here -->
  11. <dependency>
  12. <groupId>org.eclipse.jetty</groupId>
  13. <artifactId>jetty-server</artifactId>
  14. <version>9.3.13.v20161014</version>
  15. </dependency>
  16.  
  17. <dependency>
  18. <groupId>org.eclipse.jetty</groupId>
  19. <artifactId>jetty-servlet</artifactId>
  20. <version>9.3.13.v20161014</version>
  21. </dependency>
  22. <!--Jetty dependencies end here -->
  23. </dependencies>
  24.  
  25. </project>

HelloWorldServlet: implement HttpServlet

  1. package thach.le.embedding.putty;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.eclipse.jetty.http.HttpStatus;
  8. public class HelloWorldServlet extends HttpServlet {
  9. private static final long serialVersionUID = 1L;
  10. @Override
  11. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12. resp.setStatus(HttpStatus.OK_200);
  13. resp.getWriter().println("Hello World");
  14. }
  15. }

EmbeddingServer: tạo server Jetty với port 7070 và chạy servlet

  1. package thach.le.embedding.putty;
  2. import org.eclipse.jetty.server.Server;
  3. import org.eclipse.jetty.servlet.ServletContextHandler;
  4. public class EmbeddingServer {
  5. public static void main(String[] args) throws Exception {
  6. Server server = new Server(7070);
  7. ServletContextHandler handler = new ServletContextHandler(server, "/example");
  8. handler.addServlet(HelloWorldServlet.class, "/");
  9. server.start();
  10. }
  11. }

Ở đây mình có khởi tạo một Server Jetty bên trong hàm main, sau đó sẽ add 1 ServletContextHandler vào để sử lý Servlet. Server này sẽ được start mỗi khi chương trình chạy, do đó được gọi là embbeding (nhúng vào ứng dụng).

Kết quả:

hello world embedding jetty

Các bạn đã làm qua các ứng dụng web app, web service sẽ thấy ứng dụng này khá thú vị, vì không hề có các bước config server, deploy… Các bạn có thể thử nhé.

Vừa rồi là bài giới thiệu của mình về embedding Jetty, thật đơn giản phải không. Đến đây, các bạn cũng đã hiểu được khái niệm microservice và có thể tự tạo một ứng dụng “nhỏ nhỏ” với embbeding jetty rồi đấy. Chúc các bạn thành công.

Rất mong nhận được ý kiến đóng góp của tất cả các bạn.
Xin cảm ơn.

Tham khảo thêm
https://www.eclipse.org/jetty/documentation/current/embedding-jetty.html
https://examples.javacodegeeks.com/enterprise-java/jetty/jetty-tutorial-beginners/