Báo Cáo Cuối Kỳ Môn Thực Tập Ngành Khoa Học Máy Tính.pdf

57 0 0
Tài liệu đã được kiểm tra trùng lặp
Báo Cáo Cuối Kỳ Môn Thực Tập Ngành Khoa Học Máy Tính.pdf

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Trang 1

ĐẠI HỌC QUỐC GIA HÀ NỘI

Trang 2

LỜI MỞ ĐẦU 4

CHƯƠNG 1: TỔNG QUAN VỀ CƠ SỞ THỰC TẬP 5

1 Giới thiệu về cơ sở thực tập 5

2.3 Cơ sở dữ liệu & Kho lưu trữ 15

CHƯƠNG 3: NỘI DUNG THỰC TẬP 18

1 Tổng quan về đề tài 18

1.1 Đề tài 18

1.2 Ý tưởng 18

1.3 Các chức năng chính 18

2 Thiết kế cơ sở dữ liệu và kho lưu trữ 19

2.1 Thiết kế cơ sở dữ liệu với MySQL 19

2.2 Thiết kế kho lưu trữ hình ảnh với MinIO 21

3 Thiết kế ứng dụng 21

Trang 3

3.2 Chi tiết về các dịch vụ 21

4 Xây dựng giao diện người dùng 24

4.1 Thiết kế giao diện người dùng 24

4.2 Xây dựng giao diện với React và TailwindCSS 26

5 Triển khai giao diện lập trình ứng dụng (API) 37

5.1 Khởi tạo các Module 37

Trang 4

LỜI MỞ ĐẦU

Thực tập là quá trình tham gia vào chương trình thực tập tại các doanh nghiệp và tổ chức để tích lũy kinh nghiệm và nâng cao tay nghề Thực tập có rất nhiều lợi ích như

Trải nghiệm để tìm ra công việc phù hợp với bản thân Học hỏi, trau dồi kinh nghiệm, kỹ năng

“Làm đẹp” cho CV

Hoàn thiện bản thân từ những góp ý chuyên nghiệp Mở rộng mối qua hệ nhiều hơn

Được sự chỉ dẫn của nhà trường, em đã đăng kí tham gia thực tập tại công ty … Quá trình thực tập bắt đầu vào ngày … cho đến ngày …

Lộ trình thực tập được công ty phân ra như sau:

Sau gần … ngày học tập và làm việc tại công ty em đã học được rất nhiều kiến thức, vì vậy bài báo cáo này là tổng kết lại những gì em đã học và làm được trong thời gian đó

Trang 6

Microservices, hay còn gọi là kiến trúc dịch vụ vi mô, là một phương pháp thiết kế ứng dụng dưới dạng một tập hợp các dịch vụ nhỏ, độc lập và chạy độc lập Mỗi dịch vụ này thực hiện một chức năng cụ thể và giao tiếp với các dịch vụ khác thông qua API.

Một số đặc điểm nổi bật của Microservices:

Độc lập: Mỗi dịch vụ có thể được phát triển, triển khai, và quản lý một cách độc lập Khả năng mở rộng: Dễ dàng mở rộng một dịch vụ cụ thể mà không ảnh hưởng đến toàn bộ hệ thống.

Ngôn ngữ độc lập: Các dịch vụ có thể được viết bằng ngôn ngữ lập trình khác nhau, tùy thuộc vào yêu cầu cụ thể của dịch vụ đó.

Dễ dàng thay thế và nâng cấp: Một dịch vụ cụ thể có thể được thay thế hoặc nâng cấp mà không làm gián đoạn toàn bộ hệ thống.

Khả năng phục hồi cao: Khi một dịch vụ gặp sự cố, nó không ảnh hưởng đến hoạt động của các dịch vụ khác.

Mặc dù kiến trúc Microservices có nhiều lợi ích, nhưng nó cũng đi kèm với một số nhược điểm và thách thức:

Phức tạp trong việc quản lý: Có nhiều dịch vụ nhỏ cần được quản lý, triển khai và mở rộng Điều này đòi hỏi một hệ thống quản lý phức tạp và chất lượng.

Thách thức trong việc kiểm thử và gỡ lỗi: Mỗi dịch vụ cần được kiểm thử và gỡ lỗi riêng biệt, điều này có thể làm gia tăng công sức và thời gian cần thiết cho quá trình phát triển.

Tăng chi phí vận hành: Việc triển khai và duy trì nhiều dịch vụ khác nhau có thể đòi hỏi tài nguyên và chi phí vận hành lớn hơn so với kiến trúc Monolithic.

Bảo mật và quản lý truy cập phức tạp hơn: Kiến trúc Microservices đưa ra thách thức về bảo mật vì cần quản lý xác thực và ủy quyền cho nhiều dịch vụ khác nhau.

Trang 7

So sánh giữa kiến trúc Monolithic và Microservices 1.2 Docker và vai trò trong việc phát triển Microservices

Docker là một nền tảng ảo hóa hàng đầu cho việc đóng gói và triển khai các ứng dụng trong môi trường container Containers là một cách tiếp cận ảo hóa mà bạn có thể đóng gói ứng dụng cùng với tất cả các phụ thuộc của nó (thư viện, cài đặt, cấu hình) vào một container độc lập Điều này giúp đảm bảo rằng ứng dụng sẽ chạy đúng cách trên mọi môi trường Docker mà không cần phải lo lắng về các sự khác biệt trong hệ thống hoặc môi trường.

Vai trò của Docker trong kiến trúc Microservices:

Đóng gói độc lập: Docker cho phép đóng gói mỗi dịch vụ Microservices vào một container độc lập Điều này giúp đảm bảo tính độc lập và tách biệt giữa các dịch vụ.

Quản lý phụ thuộc: Containers Docker chứa tất cả các phụ thuộc cần thiết, bao gồm thư viện và cài đặt, giúp đơn giản hóa việc quản lý phụ thuộc và xác định chính xác các yêu cầu về môi trường.

Khả năng mở rộng dễ dàng: Docker cho phép triển khai và mở rộng dịch vụ Microservices một cách dễ dàng Bạn có thể triển khai nhiều bản sao của một dịch vụ trên nhiều container để đáp ứng nhu cầu về khả năng mở rộng.

Tích hợp dễ dàng: Docker có tích hợp với các công cụ quản lý kiến trúc Microservices như Kubernetes, Docker Swarm và Mesos, giúp quản lý và triển khai các dịch vụ một cách hiệu quả.

Lợi ích của việc sử dụng Docker trong Microservices:

Tích hợp và triển khai dễ dàng: Việc triển khai các dịch vụ trở nên đơn giản và tự động hóa hơn, giúp tiết kiệm thời gian và nguồn lực.

Môi trường đồng nhất: Docker đảm bảo rằng ứng dụng sẽ chạy đúng cách trên mọi

Trang 8

môi trường Docker, từ máy tính cá nhân đến các môi trường sản xuất.

Tách biệt và độc lập: Mỗi container Docker là một đơn vị độc lập, giúp tách biệt sự cố và sự thay đổi giữa các dịch vụ.

Kiến trúc của Docker

Java là một ngôn ngữ lập trình đa mục tiêu và đối tượng, được phát triển ban đầu bởi James Gosling và nhóm làm việc tại Sun Microsystems vào những năm 1990 Với sự linh hoạt, độ bảo mật cao và khả năng chạy trên nhiều nền tảng, Java đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới.

Những điểm chính của Java:

Độc lập với nền tảng (Platform-Independent): Mã nguồn Java được biên dịch thành bytecode, một dạng mã trung gian, và sau đó chạy trên Java Virtual Machine (JVM) Điều này cho phép mã Java chạy trên nhiều hệ điều hành và môi trường mà không cần sửa đổi.

Đối tượng hóa (Object-Oriented): Java là một ngôn ngữ lập trình đối tượng, nghĩa là mọi thứ trong Java đều là đối tượng Điều này thúc đẩy việc tổ chức và tái sử dụng mã một cách hiệu quả.

Bảo mật (Security): Java được thiết kế với lớp bảo mật mạnh mẽ Các ứng dụng Java

Trang 9

chạy trong môi trường có kiểm soát để đảm bảo rằng chúng không gây hại cho hệ thống Dễ học và đọc (Readability): Java có cú pháp sáng sủa và tương tự tiếng Anh, giúp người lập trình dễ dàng học và hiểu.

Quản lý bộ nhớ tự động (Automatic Memory Management): Java sử dụng garbage collector để quản lý bộ nhớ, giúp ngăn ngừa lỗi gặp phải trong quản lý bộ nhớ Một số ứng dụng của Java:

Phát triển ứng dụng máy tính cá nhân: Java thường được sử dụng để phát triển ứng dụng máy tính cá nhân và desktop.

Phát triển ứng dụng web và di động: Java được sử dụng trong việc phát triển ứng dụng web (sử dụng Java EE hoặc Spring Framework) và ứng dụng di động (sử dụng Android).

Phát triển ứng dụng máy chủ: Java là một trong những ngôn ngữ lập trình phổ biến cho việc phát triển ứng dụng máy chủ và dịch vụ web.

Lập trình nhúng (Embedded Programming): Java Embedded cho phép phát triển ứng dụng cho các thiết bị nhúng và IoT.

Phát triển trò chơi: Java cũng được sử dụng cho việc phát triển trò chơi máy tính.

Trang 10

10 2.2.2 Spring Boot

Spring Boot là một framework dựa trên Spring, được thiết kế để đơn giản hóa quá trình tạo và triển khai ứng dụng Spring Nó loại bỏ yêu cầu của việc cấu hình XML truyền thống và giúp ứng dụng trở nên độc lập, có thể "chạy ngay" mà không cần nhiều bước cấu hình phức tạp Những đặc điểm nổi bật của Spring Boot:

Tự động cấu hình: Spring Boot tự động cấu hình ứng dụng dựa trên các thư viện bạn đã thêm vào classpath, giúp loại bỏ nhu cầu cấu hình XML hoặc Java truyền thống.

Starter POMs: Những templates này giúp giảm thiểu việc quản lý phụ thuộc và cung cấp một bộ thư viện tối ưu và cấu hình mặc định.

Actuator: Cung cấp các công cụ giám sát và quản lý ứng dụng, giúp bạn có cái nhìn sâu rộng về trạng thái và hoạt động của ứng dụng.

Embedded Server: Spring Boot đi kèm với các máy chủ ứng dụng nhúng như Tomcat và Jetty, cho phép bạn tạo ra ứng dụng standalone mà không cần một máy chủ ứng dụng bên ngoài.

Opinionated Defaults: Spring Boot cung cấp một bộ cấu hình mặc định dựa trên "best practices", giúp bạn bắt đầu một cách nhanh chóng.

Lợi ích khi sử dụng Spring Boot:

Tăng tốc độ phát triển: Với các cấu hình mặc định và tự động cấu hình, bạn có thể tập trung vào việc phát triển tính năng chính của ứng dụng.

Độc lập: Ứng dụng Spring Boot có thể chạy độc lập, giúp việc triển khai và chạy ứng dụng trở nên dễ dàng và linh hoạt.

Tích hợp dễ dàng: Hỗ trợ sâu rộng cho nhiều công nghệ và dịch vụ, từ cơ sở dữ liệu, bảo mật đến các dịch vụ điện toán đám mây.

Trong khi Spring Framework cung cấp một nền tảng mạnh mẽ cho việc phát triển ứng dụng

Trang 11

Java, Spring Boot mang lại sự đơn giản và tốc độ, giúp phát triển và triển khai ứng dụng trở nên dễ dàng hơn.

Tiếp theo là những Framework được tích hợp cùng Spring Boot:

- Spring Security: là một Framework mạnh mẽ và linh hoạt dành cho Java, giúp bảo vệ ứng dụng web, dịch vụ và ứng dụng doanh nghiệp trước các mối đe dọa và tấn công Được xây dựng dưới dạng một dự án con của Spring, Spring Security cung cấp các giải pháp bảo mật toàn diện cho ứng dụng Java.

Những đặc điểm nổi bật của Spring Security:

Xác thực và Ủy quyền: Spring Security hỗ trợ một loạt các nguồn xác thực, từ cơ sở dữ liệu, LDAP đến OAuth2 Nó cung cấp một cơ chế ủy quyền mạnh mẽ, cho phép bạn kiểm soát truy cập đến các tài nguyên dựa trên vai trò, quyền hoặc các thuộc tính khác của người dùng.

Bảo vệ trước các Mối đe dọa Web: Spring Security cung cấp các giải pháp bảo vệ trước các mối đe dọa web phổ biến như CSRF, XSS và Session Fixation.

Tích hợp dễ dàng: Được thiết kế để dễ dàng tích hợp với các ứng dụng Spring khác, từ Spring MVC đến Spring Data.

Mô hình dựa trên Java và XML: Cấu hình bảo mật có thể được định nghĩa thông qua XML hoặc Java Config, tùy thuộc vào sở thích của bạn.

OAuth2 và JWT: Hỗ trợ sẵn sàng cho OAuth2 và JWT, giúp bạn xây dựng và bảo vệ dịch vụ RESTful và Single-Page Applications (SPA).

Lợi ích khi sử dụng Spring Security:

Bảo mật toàn diện: Từ xác thực người dùng đến bảo vệ API, Spring Security đảm bảo rằng ứng dụng của bạn được bảo vệ trước mọi mối đe dọa.

Tích hợp mượt mà: Spring Security được thiết kế để hoạt động mượt mà với các thành phần khác của hệ sinh thái Spring.

Cộng đồng mạnh mẽ: Với một cộng đồng lớn và tích cực, bạn có thể dễ dàng tìm kiếm sự hỗ trợ và tài nguyên khi gặp vấn đề hoặc cần tư vấn.

Trang 12

Authentication flow trong Spring Security

Spring Security là một trong những giải pháp bảo mật hàng đầu cho ứng dụng Java Với một loạt các tính năng và cấu hình linh hoạt, nó giúp đảm bảo rằng ứng dụng của bạn không chỉ an toàn trước các mối đe dọa nhưng còn cung cấp trải nghiệm người dùng mượt mà và an toàn - Spring Cloud: Cung cấp một bộ công cụ cho việc phát triển các ứng dụng dựa trên đám mây, giúp giải quyết các vấn đề phức tạp như cấu hình, phát hiện dịch vụ, và cân bằng tải Được xây dựng dựa trên các nguyên tắc của Spring Boot, Spring Cloud giúp các nhà phát triển nhanh chóng xây dựng ứng dụng dựa trên microservices và triển khai chúng lên các nền tảng đám mây.

Đặc điểm nổi bật của Spring Cloud:

Cấu hình Trung tâm: Với Spring Cloud Config, bạn có thể quản lý cấu hình ứng dụng trên môi trường đám mây một cách trung tâm và bảo mật.

Phát hiện Dịch vụ: Spring Cloud Eureka giúp các dịch vụ trong hệ thống tìm và giao tiếp với nhau một cách dễ dàng.

Load Balancer và Circuit Breaker: Với Spring Cloud LoadBalancer và Hystrix, ứng dụng của bạn có thể cân bằng tải và xử lý sự cố một cách linh hoạt.

API Gateway: Spring Cloud Gateway cung cấp một cách dễ dàng để định tuyến yêu cầu và áp dụng các chính sách bảo mật.

Tracing và Monitoring: Với Spring Cloud Sleuth và Zipkin, bạn có thể theo dõi và giám sát hoạt động của ứng dụng trên môi trường đám mây.

Lợi ích khi sử dụng Spring Cloud:

Trang 13

Phát triển Nhanh chóng: Với các giải pháp sẵn có, bạn có thể tập trung vào việc xây dựng tính năng chính của ứng dụng thay vì lo lắng về cấu hình và quản lý dịch vụ.

Khả năng Mở rộng: Spring Cloud giúp ứng dụng của bạn dễ dàng mở rộng và phản hồi linh hoạt trước các yêu cầu thay đổi.

Tích hợp Mạnh mẽ: Spring Cloud được thiết kế để hoạt động mượt mà với các dịch vụ và nền tảng đám mây phổ biến.

Kiến trúc Microservices của ứng dụng sử dụng Spring Boot & Spring Cloud 2.2.3 Apache Kafka

Apache Kafka là một hệ thống xử lý sự kiện phân tán mã nguồn mở, được thiết kế để xử lý dữ liệu trong thời gian thực với độ trễ thấp Kafka được sử dụng rộng rãi trong các ứng dụng cần xử lý dữ liệu lớn, phân tán và trong thời gian thực.

Những đặc điểm nổi bật của Apache Kafka:

Hiệu suất cao: Kafka có khả năng xử lý hàng triệu sự kiện mỗi giây, giúp đảm bảo hiệu suất cho các ứng dụng yêu cầu xử lý dữ liệu lớn.

Độ tin cậy cao: Với cơ chế phân tán và sao lưu, Kafka đảm bảo tính sẵn sàng và độ tin cậy cao.

Khả năng mở rộng: Kafka có thể mở rộng dễ dàng bằng cách thêm nhiều broker vào hệ thống mà không cần thay đổi cấu hình.

Trang 14

Độ trễ thấp: Kafka được thiết kế để xử lý dữ liệu trong thời gian thực với độ trễ thấp Lợi ích khi sử dụng Apache Kafka:

Dữ liệu Thời gian Thực: Kafka cho phép bạn xử lý và phân tích dữ liệu trong thời gian thực, giúp các doanh nghiệp đưa ra quyết định nhanh chóng dựa trên thông tin mới nhất.

Độ Bền và Khả năng Phục hồi: Với cơ chế lưu trữ dữ liệu trên nhiều broker, Kafka đảm bảo rằng dữ liệu của bạn an toàn ngay cả khi một số thành phần gặp sự cố.

Khả năng Mở rộng Ngang: Bạn có thể dễ dàng mở rộng hệ thống Kafka bằng cách thêm broker mới, giúp hệ thống xử lý lượng dữ liệu tăng lên mà không gặp vấn đề về hiệu suất.

Độ Trễ Thấp: Kafka được thiết kế để xử lý hàng triệu sự kiện mỗi giây với độ trễ cực thấp, đáp ứng nhu cầu của các ứng dụng thời gian thực.

Tích hợp Dễ dàng: Kafka có thể tích hợp một cách dễ dàng với nhiều nguồn dữ liệu, hệ thống và ứng dụng khác nhau, giúp nó trở thành trung tâm xử lý sự kiện cho nhiều ứng dụng.

Bảo mật: Với các tính năng như mã hóa, xác thực và ủy quyền, Kafka giúp đảm bảo rằng dữ liệu của bạn được truyền tải và lưu trữ một cách an toàn.

Tích hợp với Hệ sinh thái Big Data: Kafka hoạt động tốt với các công nghệ Big Data khác như Hadoop, Spark và Storm, giúp bạn xây dựng các giải pháp xử lý dữ liệu lớn toàn diện.

Spring Boot cung cấp hỗ trợ sẵn sàng cho Apache Kafka thông qua Spring Kafka Spring Kafka giúp đơn giản hóa việc tích hợp Kafka vào ứng dụng Spring Boot, cung cấp các API mạnh mẽ và linh hoạt để gửi và nhận dữ liệu từ Kafka.

Với Spring Kafka, các nhà phát triển có thể:

Tận dụng cấu hình tự động của Spring Boot để thiết lập và quản lý Kafka Sử dụng các template để gửi dữ liệu đến Kafka một cách dễ dàng.

Trang 15

Xây dựng các người tiêu thụ Kafka để xử lý dữ liệu từ Kafka một cách hiệu quả.

Tích hợp Kafka với ứng dụng Spring Boot 2.3 Cơ sở dữ liệu & Kho lưu trữ

2.3.1 MySQL

MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) mã nguồn mở, được biết đến với hiệu suất cao, độ tin cậy và sử dụng rộng rãi trên toàn thế giới MySQL sử dụng ngôn ngữ truy vấn cơ sở dữ liệu có cấu trúc (SQL) để truy cập, thêm, chỉnh sửa và quản lý dữ liệu Đặc điểm nổi bật của MySQL:

Mã Nguồn mở: MySQL là phần mềm mã nguồn mở, cho phép người dùng sửa đổi, tùy chỉnh và phân phối mã nguồn mà không phải trả phí.

Hiệu suất cao: MySQL được tối ưu hóa để cung cấp hiệu suất nhanh và ổn định Bảo mật: MySQL cung cấp nhiều cấp độ bảo mật, bao gồm mã hóa dữ liệu, xác thực và ủy quyền người dùng.

Khả năng mở rộng: MySQL có thể xử lý cơ sở dữ liệu lớn với hàng tỷ bản ghi Hỗ trợ truy vấn phức tạp: MySQL hỗ trợ truy vấn phức tạp, giúp người dùng trích xuất thông tin từ nhiều bảng dữ liệu một cách hiệu quả.

Tích hợp dễ dàng: MySQL có thể tích hợp một cách dễ dàng với nhiều ngôn ngữ lập trình phổ biến như Java, PHP, Python và nhiều ngôn ngữ khác.

Lợi ích khi sử dụng MySQL:

Chi phí Thấp: Vì là mã nguồn mở, MySQL không yêu cầu bất kỳ chi phí cấp phép nào, giúp giảm chi phí tổng thể cho dự án.

Độ Tin cậy Cao: MySQL được biết đến với độ ổn định và độ tin cậy cao, giúp đảm bảo rằng dữ liệu của bạn luôn an toàn và sẵn sàng truy cập.

Trang 16

Cộng đồng mạnh mẽ: Với một cộng đồng lớn và tích cực, người dùng MySQL có thể dễ dàng tìm kiếm sự hỗ trợ và tài nguyên khi gặp vấn đề hoặc cần tư vấn.

MySQL là một trong những RDBMS phổ biến và được tin cậy nhất trên thị trường Với sự kết hợp của hiệu suất, bảo mật và khả năng mở rộng, MySQL là lựa chọn hàng đầu cho nhiều ứng dụng và dự án web trên toàn thế giới.

2.3.2 MinIO

MinIO là một giải pháp lưu trữ đối tượng mã nguồn mở, được thiết kế để cung cấp hiệu suất cao, khả năng mở rộng và độ tin cậy MinIO hỗ trợ giao thức Amazon S3, giúp nó trở thành một lựa chọn phổ biến cho việc triển khai lưu trữ đối tượng trên môi trường đám mây.

Đặc điểm nổi bật của MinIO:

Mã Nguồn mở: MinIO là phần mềm mã nguồn mở, cho phép cộng đồng đóng góp và tùy chỉnh theo nhu cầu cụ thể.

Hiệu suất cao: MinIO được tối ưu hóa cho hiệu suất, hỗ trợ hàng triệu yêu cầu mỗi giây trên lưu trữ đối tượng lớn.

Bảo mật: MinIO cung cấp các tính năng bảo mật tiên tiến như mã hóa dữ liệu, xác thực và quản lý quyền truy cập.

Khả năng mở rộng: MinIO có thể mở rộng từ vài TB đến hàng PB, và có thể chạy trên môi trường đám mây, ảo hóa hoặc trên cơ sở.

Tương thích S3: MinIO tương thích với giao thức Amazon S3, giúp dễ dàng tích hợp với các ứng dụng và dịch vụ khác.

Lợi ích khi sử dụng MinIO:

Chi phí thấp: Với mã nguồn mở, MinIO giảm chi phí cấp phép và cho phép tùy chỉnh mà không tốn thêm chi phí.

Trang 17

Độ Linh hoạt cao: MinIO có thể triển khai trên nhiều môi trường khác nhau, từ đám mây đến trung tâm dữ liệu truyền thống.

Cộng đồng hỗ trợ: Với một cộng đồng người dùng và nhà phát triển tích cực, MinIO cung cấp sự hỗ trợ và tài nguyên khi cần

MinIO là một giải pháp lưu trữ đối tượng mã nguồn mở hiệu quả, đáng tin cậy và linh hoạt Với khả năng tương thích cao và hiệu suất ấn tượng, MinIO phù hợp cho nhiều ứng dụng, từ phân tích dữ liệu lớn đến lưu trữ dự phòng và nhiều hơn nữa.

Trang 18

Xây dựng một nền tảng chia sẻ hình ảnh trực tuyến, mang lại trải nghiệm tương tự như Pinterest, nơi người dùng có thể tải lên, chia sẻ và khám phá hình ảnh từ cộng đồng 1.2 Ý tưởng

Ứng dụng sẽ sử dụng những công nghệ sau: Frontend:

React: Được chọn làm khung xây dựng chính cho giao diện người dùng, giúp tạo ra một trải nghiệm người dùng mượt mà và tương tác.

TailwindCSS: Một thư viện CSS tiện ích giúp tạo ra giao diện người dùng hiện đại và đáp ứng nhanh chóng.

Spring Boot: Làm nền tảng chính cho việc phát triển backend, giúp tạo ra các dịch vụ RESTful hiệu quả và dễ dàng tích hợp.

Spring Cloud: Hỗ trợ việc xây dựng và tích hợp các dịch vụ phân tán, giúp ứng dụng có khả năng mở rộng và độ tin cậy cao.

Spring Security: Đảm bảo an ninh cho ứng dụng, bao gồm xác thực người dùng và quản lý quyền truy cập.

Lưu trữ dữ liệu:

MySQL: Được sử dụng để lưu trữ thông tin người dùng, metadata của hình ảnh và các dữ liệu liên quan khác.

MinIO: Là giải pháp lưu trữ đối tượng, chịu trách nhiệm lưu trữ các hình ảnh thực tế mà người dùng tải lên.

Truyền thông giữa các dịch vụ:

Apache Kafka: Đóng vai trò như một message broker, giúp các dịch vụ trong hệ thống giao tiếp với nhau một cách hiệu quả và đáng tin cậy.

1.3 Các chức năng chính

Ứng dụng sẽ có các chức năng chính sau: Đăng ký & Đăng nhập:

Tạo tài khoản mới.

Đăng nhập vào tài khoản hiện có Khôi phục mật khẩu.

Trang 19

Tải lên hình ảnh mới.

Thêm mô tả, tiêu đề cho hình ảnh Xóa hoặc chỉnh sửa hình ảnh đã tải lên Tạo và quản lý bộ sưu tập hình ảnh Tìm kiếm & khám phá:

Tìm kiếm hình ảnh theo từ khóa.

Khám phá hình ảnh phổ biến hoặc mới nhất từ cộng đồng Tương tác với hình ảnh:

Theo dõi người dùng khác để nhận cập nhật từ họ Xem hình ảnh từ người dùng mình theo dõi Thông báo:

Nhận thông báo khi có người tương tác với hình ảnh của bạn hoặc khi có người theo dõi bạn.

2 Thiết kế cơ sở dữ liệu và kho lưu trữ

2.1 Thiết kế cơ sở dữ liệu với MySQL

Dưới đây là sơ đồ quan hệ thực thể (Entity Relationship Diagram) cho cơ sở dữ liệu:

Trang 20

20 Sơ đồ này bao gồm các thực thể sau:

User: Đại diện cho người dùng của ứng dụng Bao gồm thông tin như id, tên người dùng, mật khẩu, email và URL ảnh đại diện.

Image: Đại diện cho hình ảnh được tải lên Bao gồm URL, mô tả, ngày tải lên và id người dùng đã tải lên.

Collection: Đại diện cho bộ sưu tập hình ảnh mà người dùng tạo ra Bao gồm tên, mô tả và id người dùng tạo ra.

ImageCollection: Mối quan hệ nhiều-nhiều giữa Image và Collection, cho phép một hình ảnh thuộc nhiều bộ sưu tập và một bộ sưu tập chứa nhiều hình ảnh.

Comment: Đại diện cho bình luận của người dùng trên một hình ảnh Bao gồm văn bản, ngày và id của người dùng và hình ảnh liên quan.

Trang 21

Like: Mối quan hệ giữa người dùng và hình ảnh mà họ thích Follow: Mối quan hệ theo dõi giữa các người dùng 2.2 Thiết kế kho lưu trữ hình ảnh với MinIO

Dưới đây là sơ đồ quan hệ thực thể (ERD) mô tả cách hình ảnh được lưu trữ trong MinIO:

Trong sơ đồ này:

Image: Đại diện cho hình ảnh trong ứng dụng.

MinIO_Storage: Đại diện cho kho lưu trữ MinIO Mỗi hình ảnh sẽ được lưu trữ dưới dạng một đối tượng trong MinIO với một object_key duy nhất.

3 Thiết kế ứng dụng

3.1 Sơ đồ kiến trúc tổng quan

3.2 Chi tiết về các dịch vụ

3.2.1 API Gateway: Đi m truy c p trung tâm cho t t c các d ch vể ậ ấ ả ị ụ

API Gateway là trái tim của hệ thống, điều tiết và định hướng tất cả các yêu cầu đến các dịch vụ

Trang 22

22 thích hợp.

Công nghệ và công cụ:

Spring Cloud Gateway: Chúng tôi sử dụng Spring Cloud Gateway, một thành phần của Spring Cloud, để triển khai API Gateway Spring Boot cung cấp nền móng cho việc triển khai nhanh chóng và dễ dàng cấu hình

Các nhiệm vụ chính:

Cấu hình và định nghĩa các routes cho tất cả các dịch vụ Tích hợp JWT để xác thực và ủy quyền yêu cầu từ người dùng.

Tải cân bằng giữa các instances của dịch vụ để đảm bảo hiệu suất và độ tin cậy 3.2.2 Service Registry: Đăng ký và phát hi n d ch vệ ị ụ

Service Registry đóng vai trò như một sổ địa chỉ cho hệ thống, cho phép các dịch vụ biết về nhau và tương tác một cách linh hoạt.

Công nghệ và công cụ:

Spring Cloud Gateway: Sử dụng Spring Cloud Eureka Server để triển khai Service Registry, giúp các dịch vụ tự động đăng ký và tìm kiếm nhau.

Các nhiệm vụ chính:

Cấu hình và khởi chạy Eureka Server.

Đảm bảo rằng tất cả các dịch vụ đều tự động đăng ký khi khởi động và tự bỏ đăng ký khi tắt.

3.2.3 Config Server: Qu n lý c u hình trung tâm cho các d ch vả ấ ị ụ

Config Server giúp quản lý cấu hình trung tâm, giúp các dịch vụ có thể thay đổi cấu hình mà không cần khởi động lại.

Công nghệ và công cụ:

Spring Cloud Config Server: Sử dụng Spring Cloud Config Server để cung cấp thông tin cấu hình cho tất cả các dịch vụ từ một kho lưu trữ trung tâm (ví dụ: Git Repository) Các nhiệm vụ chính:

Cấu hình Config Server và liên kết nó với kho lưu trữ cấu hình.

Đảm bảo tất cả các dịch vụ có thể truy xuất và cập nhật cấu hình một cách trơn tru 3.2.4 Circuit Breaker: C ch b o v d ch v kh i tình tr ng quá t iơ ế ả ệ ị ụ ỏ ạ ả

Circuit Breaker giúp hệ thống đáp ứng linh hoạt trước các sự cố, ngăn chặn việc lan truyền lỗi và bảo vệ hệ thống khỏi tình trạng quá tải.

Công nghệ và công cụ:

Trang 23

Spring Boot & Resilience4j: Trong dự án này, chúng tôi đã quyết định sử dụng Resilience4j, một thư viện lightweight và dễ mở rộng, tối ưu cho Java 8 và hỗ trợ tích hợp sâu với Spring Boot Sử dụng Resilience4j cung cấp một lựa chọn hiệu suất cao và linh hoạt cho việc triển khai cơ chế Circuit Breaker.

Các nhiệm vụ chính:

Tích hợp Resilience4j vào dịch vụ và cấu hình các ngưỡng và chiến lược cho Circuit Breaker.

Thiết lập các cơ chế fallback và recovery để xử lý các yêu cầu khi Circuit Breaker được kích hoạt, giảm thiểu gián đoạn đối với người dùng.

Thực hiện các bài kiểm thử tải để đánh giá và tinh chỉnh cấu hình, đảm bảo hệ thống hoạt động ổn định và hiệu quả.

3.2.5 User Service: Qu n lý ngả ườ i dùng

User Service là một dịch vụ quan trọng chịu trách nhiệm quản lý thông tin và hành động liên quan đến người dùng.

Công nghệ và công cụ:

Spring Boot: Được sử dụng như là nền tảng chính để xây dựng ứng dụng Spring Boot giúp tôi dễ dàng khởi tạo và triển khai dịch vụ mà không cần phải lo lắng về việc cấu hình chi tiết.

JWT (JSON Web Token): Được sử dụng như một giải pháp xác thực và ủy quyền Khi người dùng đăng nhập thành công, họ sẽ nhận được một token Token này sau đó sẽ được sử dụng trong các yêu cầu tiếp theo để xác thực và xác định quyền truy cập của người dùng.

MySQL: Là hệ quản trị cơ sở dữ liệu được chọn để lưu trữ thông tin người dùng Tôi đã tham gia vào việc thiết kế bảng, tối ưu truy vấn, và quản lý các mối quan hệ giữa các bảng.

Các nhiệm vụ chính:

Thiết kế và cài đặt các API liên quan đến người dùng như đăng ký, đăng nhập, xem và cập nhật thông tin cá nhân.

Xác thực & phân quyền người dùng sử dụng JWT và Spring Security Xử lý và quản lý các lỗi và ngoại lệ phát sinh từ dịch vụ.

3.2.6 Image Service: Qu n lý tài nguyên nhả ả

Image Service chịu trách nhiệm lưu trữ, quản lý và phân phối hình ảnh cũng như các bộ ảnh cho người dùng Đối với một ứng dụng yêu cầu cao về hình ảnh, việc quản lý chúng một cách hiệu quả và bảo mật là rất quan trọng.

Công nghệ và công cụ:

Spring Boot: Là nền tảng chính được sử dụng để xây dựng dịch vụ, giúp tăng tốc độ phát triển và triển khai dễ dàng.

Trang 24

MinIO: Là kho lưu trữ đối tượng được sử dụng để lưu giữ dữ liệu hình ảnh thực tế, cung cấp khả năng lưu trữ hiệu quả và truy cập nhanh chóng.

MySQL: Cơ sở dữ liệu này chứa thông tin liên quan đến hình ảnh, bao gồm metadata, người tải lên, ngày giờ tải lên và các thuộc tính khác liên quan đến hình ảnh Các nhiệm vụ chính tôi đã tham gia:

Thiết kế và cài đặt các API cho việc tải lên, chỉnh sửa, xóa và truy xuất hình ảnh cũng như bộ ảnh sử dụng Spring Boot.

Tích hợp MinIO để lưu trữ dữ liệu hình ảnh và đảm bảo đồng bộ giữa dữ liệu trên MinIO và thông tin lưu trữ trên MySQL.

Xây dựng tính năng tạo và quản lý bộ ảnh, cho phép người dùng tổ chức và phân loại hình ảnh của họ một cách dễ dàng.

3.2.7 Rating Service: D ch v đánh giáị ụ

Rating Service là dịch vụ chịu trách nhiệm quản lý, thu thập và phân tích đánh giá từ người dùng, tạo nên một phản hồi quan trọng cho cả hệ thống và người dùng khác.

Công nghệ và công cụ:

ExpressJS: Đây là một framework nhẹ và linh hoạt trên nền tảng Node.js, cho phép xây dựng các ứng dụng web và API một cách nhanh chóng và hiệu quả.

MongoDB: Một cơ sở dữ liệu không SQL, giúp lưu trữ và quản lý dữ liệu dưới dạng tài liệu JSON Với khả năng mở rộng và linh hoạt của MongoDB, việc lưu trữ và truy vấn dữ liệu đánh giá trở nên dễ dàng và hiệu quả.

Các nhiệm vụ chính tôi đã tham gia:

Thiết kế và cài đặt các API cho việc tạo, chỉnh sửa, xóa và truy xuất đánh giá sử dụng ExpressJS.

Tích hợp MongoDB để lưu trữ dữ liệu đánh giá và thực hiện các thao tác truy vấn hiệu quả.

Xây dựng logic phân tích để tính toán điểm đánh giá trung bình và số lượng đánh giá cho mỗi sản phẩm hoặc dịch vụ.

4 Xây dựng giao diện người dùng

4.1 Thiết kế giao diện người dùng

Sau đây là thiết kế Giao diện người dùng (UI) theo trang: - Trang đăng nhập:

Mục tiêu: Cung cấp giao diện cho người dùng đăng nhập vào hệ thống Yêu cầu chức năng:

Cung cấp trường nhập cho tên đăng nhập hoặc email và mật khẩu.

Trang 25

Nút 'Đăng nhập' để xác thực thông tin và truy cập hệ thống Yêu cầu bảo mật:

Thông tin đăng nhập phải được mã hóa khi truyền qua mạng.

Mật khẩu người dùng phải được bảo mật và không được lưu trữ dưới dạng văn bản thuần túy trong cơ sở dữ liệu.

- Trang chính:

Mục tiêu: Hiển thị danh sách hình ảnh từ tất cả người dùng theo dạng lưới động Yêu cầu chức năng:

Thanh tìm kiếm cho phép người dùng tìm kiếm hình ảnh theo từ khóa Hình ảnh tự động tải thêm khi người dùng cuộn xuống cuối trang.

- Trang cá nhân:

Mục tiêu: Hiển thị hình ảnh và thông tin cơ bản của người dùng Yêu cầu chức năng:

Hiển thị tất cả hình ảnh mà người dùng đã tạo và lưu.

- Trang chi tiết hình ảnh:

Mục tiêu: Hiển thị chi tiết về một hình ảnh cụ thể Yêu cầu chức năng:

Hiển thị hình ảnh ở kích thước đầy đủ.

Hiển thị thông tin về tác giả, mô tả, và bình luận từ cộng đồng.

- Trang tải lên hình ảnh:

Mục tiêu: Cho phép người dùng tải lên hình ảnh mới Yêu cầu chức năng:

Cung cấp trường nhập mô tả, chọn danh mục và đặt từ khóa cho hình ảnh Hỗ trợ kéo và thả để tải lên hình ảnh.

Trang 26

26 4.2 Xây dựng giao diện với React và TailwindCSS

Sau đây là giao diện sau khi đã xây dựng sử dụng React và TailwindCSS: - Trang đăng nhập:

Giao diện trang đăng nhập bao gồm:

Logo: Ở phía trên cùng của Form đăng nhập, logo của dự án được đặt ở trung tâm, giúp tăng cường nhận diện thương hiệu.

Ô nhập tên đăng nhập: Một trường nhập dữ liệu rộng, người dùng có thể nhập tên đăng nhập (sử dụng địa chỉ email) của họ để đăng nhập.

Ô nhập mật khẩu: Trường này cho phép người dùng nhập mật khẩu của họ Có một biểu tượng mắt nhỏ ở góc phải, cho phép người dùng hiển thị hoặc ẩn mật khẩu khi nhập.

Nút 'Đăng nhập': Nút lớn và rõ ràng, được thiết kế để nổi bật trên trang, giúp người dùng dễ dàng nhấp vào và đăng nhập.

Nút "Đăng nhập với Google": Ngay dưới trường nhập mật khẩu, có một nút đăng nhập bằng Google Nút này có biểu tượng của Google và mô tả rõ ràng, giúp người dùng dễ dàng đăng nhập bằng tài khoản Google của họ mà không cần tạo tài khoản mới.

Thiết kế phông nền: Sử dụng một nền trắng tối giản giúp người dùng tập trung vào form đăng nhập.

Trang 27

27 - Trang chính:

Giao diện trang chính bao gồm:

Thanh tìm kiếm: Đặt ở trên cùng của trang, thanh tìm kiếm cho phép người dùng nhập từ khóa để tìm kiếm nội dung cụ thể.

Dạng lưới "Masonry": Phía dưới thanh tìm kiếm là một dạng lưới Masonry hiển thị hình ảnh từ cộng đồng Hình ảnh có kích thước khác nhau về chiều cao nhưng giữ chiều rộng cố định, tạo ra một cảm giác liên tục và động.

Nút "Đăng hình": Hiển thị dưới dạng dấu cộng được đặt ở góc trên bên phải, nút này cho phép người dùng dễ dàng tải lên hình ảnh mới mà họ muốn chia sẻ.

Thanh điều hướng: Ở cạnh trái của trang, thanh này chứa các liên kết tới các phần khác như trang chủ, trang cá nhân và mục lục ảnh theo chủ đề.

Tương tác hình ảnh: Mỗi hình ảnh trên lưới có khả năng tương tác, cho phép người dùng nhấp để xem chi tiết hơn, thích, bình luận hoặc lưu vào bộ sưu tập cá nhân của họ.

Phân trang và Lazy Loading: Khi người dùng cuộn xuống dưới cùng, hệ thống tự động tải thêm hình ảnh mới, giúp trải nghiệm duyệt web trở nên mượt mà và liên tục.

Ô hình ảnh:

Mỗi ô hình ảnh bao gồm những thành phần sau:

Nút “Tải xuống”: Được hiển thị ở góc trên bên trái hình ảnh, dưới dạng mũi tên kéo xuống Khi bấm vào, hình ảnh sẽ tự động tải xuống.

Nút “Lưu ảnh”: Được hiển thị ở góc trên bên phải hình ảnh, có màu đỏ nổi bật Khi bấm vào, hình ảnh sẽ được lưu về khu vực “Đã lưu” ở trang cá nhân.

Link đính kèm: Được hiển thị ở góc dưới bên trái hình ảnh, thường được dùng để lưu nguồn của hình ảnh hoặc trích dẫn Khi bấm vào, người dùng sẽ tự động chuyển

Trang 28

28 hướng đến link đính kèm.

Trang đăng nhập:

Giao diện trang đăng nhập bao gồm:

Ảnh bìa: Được đặt ở nửa phần trên của giao diện.

Ảnh đại diện và tên người dùng: Ở giữa trang, ảnh đại diện của người dùng được hiển thị ở kích thước lớn, kết hợp với tên đầy đủ và tên người dùng Điều này giúp tạo ra một ấn tượng mạnh mẽ và nhận diện cá nhân.

Khu vực ảnh đã chia sẻ: Phần chính của trang là một lưới hiển thị tất cả hình ảnh mà người dùng đã chia sẻ Giống như trang chính, hình ảnh được hiển thị theo dạng lưới

Ngày đăng: 04/05/2024, 14:22

Tài liệu cùng người dùng

Tài liệu liên quan