Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Java
Code

Xây dựng một ứng dụng Chat thời gian thực với Modulus và Spring Boot

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Getting Started with Modulus.
Build a Real-Time Chat Application With Modulus and Python
The Hitchhiker's Guide to Docker and Modulus
Sponsored Content

This sponsored post features a product relevant to our readers while meeting our editorial guidelines for being objective and educational.

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article)

Trong hướng dẫn này, chúng ta sẽ sử dụng Spring Boot cho môi trường phát triển web, Websockets cho giao tiếp thời gian thực, Tomcat cho thùng chứa ứng dụng Java, Gradle để xây dựng và quản lý các phụ thuộc, Thymeleaf để tạo mẫu, MongoDB để lưu trữ dữ liệu và cuối cùng là sẽ không có XML cho cấu hình bean. Chỉ để làm cho bạn cảm hứng, ở phần cuối của bài viết này, bạn sẽ thấy một ứng dụng hoạt động hoàn toàn giống như ứng dụng được hiển thị bên dưới.

Realtime Chat Application Chat Screen

1. Kịch bản

  1. Doe mở trang trò chuyện để giao tiếp với bạn bè của mình.
  2. Anh ta được nhắc chọn một biệt hiệu.
  3. Anh ấy vào trang trò chuyện và gửi tin nhắn. Tin nhắn được gửi đến điểm cuối Spring MVC sẽ được lưu vào cơ sở dữ liệu và phát sóng.
  4. Điểm cuối đã chỉ định xử lý thông báo và phát tin nhắn đó tới tất cả các máy khách được kết nối với hệ thống trò chuyện.

2. Xây dựng Dependencies và Gradle Configuration

Trước khi tiếp tục với cấu trúc bên trong của dự án, hãy để tôi giải thích thư viện nào chúng tôi sẽ sử dụng cho các tính năng của dự án được liệt kê ở trên và quản lý chúng bằng cách sử dụng Gradle. Khi bạn sao chép dự án từ GitHub, bạn sẽ thấy một tệp có tên build.gradle trong thư mục gốc của dự án như dưới đây.

Tôi sẽ không đi sâu vào bên trong Gradle, nhưng hãy để tôi giải thích những phần mà chúng tôi cần cho dự án của mình. Spring Boot được xây dựng chủ yếu để phát triển các ứng dụng độc lập theo định dạng jar. Trong dự án của chúng tôi, chúng tôi sẽ tạo ra một dự án chiến tranh thay vì jar. Đó là vì Modulus cần một tập tin chiến tranh để triển khai dự án tự động lên đám mây của nó.

Để tạo ra một tập tin chiến tranh, chúng tôi đã sử dụng áp dụng plugin: 'chiến tranh'. Modulus cũng dự kiến ​​tên chiến tranh là ROOT.war theo mặc định, và đó là lý do tại sao chúng tôi đã sử dụng:

Khi bạn chạy tác vụ Gradle build, nó sẽ tạo ra một tệp war để triển khai tới thùng chứa Tomcat. Và cuối cùng, như bạn có thể đoán, phần phụ thuộc dành cho các thư viện của bên thứ ba cho các hành động cụ thể.

Đó là tất cả cho phần phụ thuộc dự án và bạn có thể tham khảo hướng dẫn sử dụng Gradle để biết thêm về Gradle.

3. Thiết kế phần mềm

Nếu bạn muốn phát triển một ứng dụng tốt, cách tốt nhất là xác định cấu trúc dự án của bạn theo từng phần nhỏ. Bạn có thể thấy các phần của toàn bộ kiến ​​trúc của ứng dụng của chúng tôi.

3.1. Mô hình

Chúng tôi đang phát triển một ứng dụng trò chuyện, vì vậy chúng tôi có thể nói rằng chúng tôi có một mô hình ChatMessageModel (ví dụ: đối tượng tên miền). Trong khi chúng tôi đang lưu hoặc xem chi tiết tin nhắn trò chuyện, chúng tôi có thể truyền đối tượng trò chuyện từ hoặc tới mô hình ChatMessageModel này. Ngoài ra, chúng tôi có thể sử dụng mô hình Người dùng cho người dùng trò chuyện, nhưng để làm cho ứng dụng đơn giản hơn, chúng tôi sẽ chỉ sử dụng biệt hiệu làm văn bản. Mô hình ChatMessageModel có các trường sau: văn bản, tác giả và createDate. Biểu diễn lớp của mô hình này như sau:

Đối tượng miền này giúp chúng tôi đại diện cho tin nhắn trò chuyện dưới dạng JSON khi cần. Mô hình của chúng tôi là OK, vì vậy hãy tiếp tục với các bộ điều khiển.

3.2. Bộ điều khiển

Bộ điều khiển là hành vi của ứng dụng của bạn. Điều này có nghĩa là bạn cần phải giữ cho bộ điều khiển của bạn đơn giản và có khả năng tương tác dễ dàng với các mô hình miền và các dịch vụ khác. Chúng tôi hy vọng các bộ điều khiển của chúng tôi sẽ xử lý:

  1. Yêu cầu lưu tin nhắn trò chuyện
  2. Liệt kê các tin nhắn trò chuyện mới nhất
  3. Phục vụ trang ứng dụng trò chuyện
  4. Cung cấp trang đăng nhập
  5. Truyền phát tin nhắn trò chuyện cho khách hàng

Ở đây bạn có thể thấy các điểm cuối tổng thể:

Điểm đầu tiên và thứ hai chỉ dành cho việc phục vụ trang đăng nhập và trò chuyện chính. Hành động thứ ba là xử lý lưu trữ và phát sóng tin nhắn trò chuyện mới. Sau khi tin nhắn được lưu trữ, nó sẽ được thông báo cho khách hàng thông qua kênh / topic / message. Để lưu trữ dữ liệu tin nhắn vào MongoDB, chúng ta sẽ sử dụng kho lưu trữ MongoDB.

Như bạn thấy, có hai loại endpoint / messages: GET và POST. Khi bạn thực hiện một yêu cầu POST tới điểm cuối / thư với tải trọng thư thích hợp, nó sẽ tự động được đưa vào lớp ChatMessageModel và thông báo sẽ được lưu vào MongoDB. Sau khi lưu thành công, nó sẽ được tự động đẩy cho khách hàng. Nhưng bằng cách nào? Trong hành động đó, có một chú thích @SendTo ("/ topic / newMessage"). Thao tác này sẽ gửi nội dung được trả về từ hàm đến máy khách. Và nội dung trả về giống như dưới đây:

Đây là thông điệp mới nhất từ ​​cơ sở dữ liệu:

Sample JSON message

Thông báo trên sẽ được chuyển thành định dạng cho giao tiếp WebSocket. Thông báo kênh này sẽ được xử lý ở phía máy khách với thư viện JavaScript của bên thứ ba và nó sẽ được xử lý trong các phần sau.

Đối với các hoạt động của thông điệp db, spring-boot-starter-data-mongodb được sử dụng. Thư viện này giúp chúng ta cho các hoạt động kho lưu trữ, và để tạo một đối tượng kho lưu trữ cho MongoDB rất đơn giản. Bạn có thể xem ví dụ ChatMessageRepository dưới đây:

Nếu bạn tạo một giao diện và mở rộng MongoRepository , bạn sẽ có thể tự động sử dụng các hoạt động CRUD như find (), findAll (), save (), v.v.

Như bạn có thể thấy, MongoRepository mong đợi một đối tượng miền. Chúng ta đã định nghĩa mô hình này trong phần Model của hướng dẫn. Trong kho lưu trữ này, chúng tôi đã định nghĩa một hàm tùy chỉnh có tên findAllByOrderByCreateDateAsc ().

Nếu bạn đã từng sử dụng JPA trước khi bạn có thể hiểu điều này một cách dễ dàng, nhưng hãy để tôi giải thích điều này một thời gian ngắn. Nếu bạn định nghĩa một tên hàm trong một giao diện mở rộng MongoRepository, tên hàm này sẽ được phân tích cú pháp thành truy vấn trên đầu cuối bởi Spring một cách tự động. Nó sẽ là một cái gì đó như:

Trong ChatMessageController, chúng ta đã sử dụng hàm này, và chúng ta cũng đã sử dụng các hàm mặc định của MongoRepository:

findAll được sử dụng một tham số để sắp xếp và phân trang. Bạn có thể xem hướng dẫn trên trang web Spring để biết thêm chi tiết về Spring JPA.

3.3. Lượt xem

Trong phần xem, chúng tôi chỉ có hai trang. Một trong số đó là trang đăng nhập, để nhận biệt hiệu của người dùng và trang thứ hai là trang trò chuyện chính để gửi tin nhắn cho người dùng trò chuyện.

Như bạn thấy trong phần điều khiển ở trên, chúng được hiển thị bằng cách sử dụng hai điểm cuối, / login và / chat. Để tạo các trang tương tác, chúng tôi sẽ sử dụng một số thư viện JavaScript của bên thứ ba. Chúng tôi sẽ sử dụng chúng từ các trang CDN. Bạn có thể xem trang đăng nhập bên dưới:

Trên trang đăng nhập, chúng tôi có một hộp văn bản biệt hiệu mẫu. Khi bạn nhấp vào Nhập trò chuyện, biệt hiệu của bạn sẽ được lưu vào cookie. Biệt hiệu này sẽ được sử dụng để đặt trường tác giả tin nhắn trò chuyện. Khi bạn nhấp vào Nhập trò chuyện, trang trò chuyện sẽ được mở. Nếu bạn đã đăng nhập và truy cập trang đăng nhập, bạn sẽ được chuyển hướng đến trang trò chuyện.

Đây là trang trò chuyện:

Trang này chỉ đơn giản là xem và gửi tin nhắn. Tin nhắn được gửi tới trang này qua WebSockets. Trên trang này bạn có thể thấy sockjs và stompjs. Đó là để xử lý thông báo. Bất cứ khi nào một tin nhắn mới xuất hiện, khu vực tin nhắn mới nhất được repopulated.

Nhân tiện, khi bạn lần đầu tiên mở trang trò chuyện, các tin nhắn mới nhất sẽ được truy xuất trong vùng tin nhắn. Như bạn có thể thấy ở phía JavaScript, kênh tin nhắn của chúng tôi là newMessage. Vì vậy, chúng tôi đang nghe kênh này và khi bạn nhấp vào nút Gửi, thông báo trong hộp văn bản sẽ được gửi đến điểm cuối và thông báo đó sẽ được phát tới các khách hàng được kết nối sau khi lưu trữ thành công.

Như bạn có thể thấy, kiến ​​trúc phần mềm ở đây rất đơn giản và dễ phát triển. Chúng ta có sẵn mã sản xuất, và chúng ta hãy triển khai nó sang Modulus.

Mô đun là một trong những PaaS tốt nhất để triển khai, mở rộng quy mô và theo dõi ứng dụng của bạn bằng ngôn ngữ bạn chọn.

4. Triển khai

4.1. Điều kiện tiên quyết

Trước khi triển khai ứng dụng, chúng ta hãy tạo một cơ sở dữ liệu bằng cách sử dụng bảng quản trị Modulus. Bạn cần một tài khoản Modulus để tạo dba và triển khai ứng dụng, vì vậy hãy tạo một tài khoản nếu bạn không có.

Đi đến bảng điều khiển Modulus và tạo một cơ sở dữ liệu:

Database creation

Trên màn hình tạo cơ sở dữ liệu, hãy cung cấp tên cơ sở dữ liệu, chọn phiên bản MongoDB (tôi đã sử dụng 2.6.3, vì vậy nó sẽ tốt hơn nếu bạn chọn 2.6.3), và cuối cùng xác định người dùng áp dụng các hoạt động đọc / ghi cơ sở dữ liệu.

Create Database

Bạn có thể nhận được một MongoDB URL sau khi tạo thành công cơ sở dữ liệu. Chúng ta sẽ sử dụng URL MongoDB trong các biến môi trường để ứng dụng Spring Boot sử dụng.

Để thiết lập các biến môi trường cho MongoDB, bạn cần có một ứng dụng. Truy cập Trang tổng quan và nhấp vào Dự án. Trên trang này, nhấp vào Tạo dự án mới.

Để tiếp tục với việc định cấu hình các biến môi trường, vui lòng truy cập Trang tổng quan và nhấp vào Dự án. Chọn dự án của bạn và nhấp vào Quản trị. Cuộn xuống trang và đặt biến môi trường bằng khóa SPRING_DATA_MONGODB_URI và giá trị của URI cơ sở dữ liệu của bạn:

Environment Variables

Khi bạn triển khai ứng dụng của mình, Spring sẽ sử dụng giá trị biến môi trường đó. Chúng tôi đã thực hiện với các yêu cầu và tiếp tục với phần triển khai.

4.2. Triển khai với CLI

Để triển khai dự án, hãy chạy tác vụ tạo gradle:

Nhiệm vụ này sẽ tạo ra một tập tin chiến tranh gọi là ROOT.war. Sao chép tập tin này vào một thư mục mới và cài đặt CLI modulus nếu bạn chưa có.

Đăng nhập vào hệ thống;

Bây giờ thực hiện lệnh sau để triển khai ROOT.war thành Modulus.

Thao tác này sẽ triển khai tệp chiến tranh và bạn có thể kết thúc các bản ghi dự án để xem trạng thái triển khai của bạn bằng cách thực hiện lệnh sau:

Đó là tất cả với việc triển khai!

5. Kết luận

Mục đích chính của hướng dẫn này là chỉ cho bạn cách tạo một ứng dụng chat thời gian thực với Spring Boot, WebSockets và MongoDB.

Để chạy dự án trong sản xuất, Modulus được sử dụng như một nhà cung cấp PaaS. Modulus có các bước rất đơn giản để triển khai, và nó cũng có một cơ sở dữ liệu nội bộ (MongoDB) cho các dự án của chúng ta. Bên cạnh đó, bạn có thể sử dụng các công cụ rất hữu ích trong bảng điều khiển Modulus như Logs, Notifications, Auto-Scaling, Db Administration, và nhiều hơn nữa.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.