You are on page 1of 95

BỘ CÔNG THƯƠNG

TRƯỜNG ĐẠI HỌC KINH TÊ - KỸ THUẬT CÔNG NGHIỆP

LUẬN VĂN TỐT NGHIỆP

TÊN ĐỀ TÀI LUẬN VĂN:

NGHIÊN CỨU CÁC CÔNG NGHỆ KEYCLOAK, ELASTICSEARCH VÀ


WEBSOCKET TRONG VIỆC XÂY DỰNG ỨNG DỤNG WEB.

Ngành đào tạo: Công nghệ thông tin

Mã số ngành: 7480201

Họ và tên sinh viên

Trương Anh Tuấn – Nguyễn Kim Thuần

Mã sinh viên:

19103100030 - 19103100012

Cán bộ hướng dẫn

Th.S Trần Minh Đức

Hà Nội – 2023
LỜI CAM ĐOAN

Em xin cam đoan các số liệu và kết quả thu được là do bản thân trực tiếp theo
dõi, thu thập với một thái độ hoàn toàn khách quan trung thực, các tài liệu đã trích
dẫn của các tác giả đều được liệt kê đầy đủ, không sao chép bất cứ tài liệu nào mà
không có trích dẫn.

Hà Nội, ngày tháng 04 năm 2023

Sinh Viên

Tuấn/ Thuần
LỜI CẢM ƠN

Trên thực tế không có sự thành công nào mà không gắn liền với những sự hỗ
trợ, giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp của mọi người. Trong suốt
thời gian từ khi bắt đầu học tập ở giảng đường đại học đến nay, em đã nhận được
rất nhiều sự quan tâm, giúp đỡ của quý Thầy Cô, gia đình và chúng ta bè. Với lòng
biết ơn sâu sắc nhất, Em xin gửi lời cảm ơn chân thành tới Cô Trần Minh Đức -
Giảng viên Khoa Công Nghệ Thông Tin, người đã tận tâm hướng dẫn em qua từng
buổi học trên lớp cũng như những buổi nói chuyện, thảo luận về đề tài nghiên cứu
lần này. Nếu không có những lời hướng dẫn, dạy bảo của cô thì bài luận văn này
của em rất khó có thể hoàn thiện được. Một lần nữa, em xin chân thành cảm ơn Cô!

Bên cạnh đó, cho em gửi lời cảm ơn chân thành và sự tri ân sâu sắc đối với quý
Thầy Cô ở Khoa Công Nghệ Thông Tin nói riêng và quý Thầy Cô trong nhà trường
nói chung đã cùng với tri thức và tâm huyết của mình để truyền đạt vốn kiến thức
quý báu cho em trong suốt thời gian học tập tại trường, và đã tạo điều kiện cho em
thực tập ở khoa để có nhiều thời gian cho khóa luận tốt nghiệp, đồng thời cũng là
hành trang quý báu để em bước vào đời một cách vững chắc, tự tin hơn.

Sau cùng, em xin kính chúc quý Thầy Cô trong Khoa Công Nghệ Thông Tin và
toàn thể các Thầy Cô trong nhà trường thật dồi dào sức khỏe, niềm tin để tiếp tục
thực hiện sứ mệnh cao đẹp của mình là truyền đạt kiến thức cho thế hệ mai sau.

Em xin chân thành cảm ơn!

Hà Nội, ngày tháng 04 năm 2023

Sinh Viên

Tuấn/ Thuần
MỤC LỤC
LỜI CAM ĐOAN.....................................................................................................2
LỜI CẢM ƠN...........................................................................................................3
MỤC LỤC.................................................................................................................4
DANH MỤC VIẾT TẮT.........................................................................................5
DANH MỤC CÁC BẢNG.......................................................................................6
DANH MỤC CÁC HÌNH........................................................................................7
LỜI NÓI ĐẦU..........................................................................................................9
1. Lý do chọn đề tài:.........................................................................................9
2. Mục tiêu nghiên cứu:...................................................................................9
3. Đối tượng và phạm vi nghiên cứu:.............................................................9
CHƯƠNG 1. TỔNG QUAN..................................................................................11
1.1. Giới thiệu về thương mại điện tử (E-Commerce)....................................11
1.2. Giới thiệu về ngôn ngữ lập trình Java......................................................13
1.3. Môi trường và các công nghệ sử dụng......................................................16
1.3.1. Spring boot.............................................................................................16
1.3.2. KeyCloak...............................................................................................19
1.3.3. ElasticSearch..........................................................................................23
1.3.4. WebSocket.............................................................................................30
1.3.5. PostgreSql..............................................................................................35
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ THỐNG........................................39
2.1. MÔ TẢ HỆ THỐNG..................................................................................39
2.2. Biểu đồ USE CASE (Use Case Diagram)..................................................40
2.3. Biểu đồ Tuần tự (Sequence Diagram).......................................................44
2.4 Thiết kế cơ sở dữ liệu...................................................................................58
CHƯƠNG 3: XÂY DỰNG ỨNG DỤNG.............................................................71
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN............................................................76
TÀI LIỆU THAM KHẢO.....................................................................................78
DANH MỤC VIẾT TẮT

Từ viết tắt Từ đầy đủ

CSDL Cơ sở dữ liệu

CNTT Công nghệ thông tin

GD&ĐT Giáo dục và Đào tạo

SV Sinh Viên

TBKT Điểm trung bình kiểm tra

ĐKT Điểm kiểm tra

TBM Điểm trung bình môn

TBHK Điểm trung bình học kỳ

MVC Model – View – Controllers

RDBMS Relational Database Management System

IIS Internet Information Server

UML Unified Modeling Language


DANH MỤC CÁC BẢNG

Bảng 1. 1: Giỏ Hàng................................................................................................58

Bảng 1. 2: Danh mục...............................................................................................59

Bảng 1. 3: Bình Luận...............................................................................................60

Bảng 1. 4: Thông tin Shop.......................................................................................61

Bảng 1. 5: Đơn đặt hàng..........................................................................................62

Bảng 1. 6: Chi tiết đơn hàng....................................................................................63

Bảng 1. 7: Khuyến Mại............................................................................................64

Bảng 1. 8: Quyền.....................................................................................................65

Bảng 1. 9: Trạng thái đơn hàng................................................................................66

Bảng 1. 10: Thông tin khách hàng...........................................................................67

Bảng 1. 11: Dữ liệu truy cập của khách hàng..........................................................68

Bảng 1. 12: Quyền truy cập của người dùng...........................................................69

Bảng 1. 13: Sản phẩm..............................................................................................70


DANH MỤC CÁC HÌNH

Hình 1. 1: Giao diện Spring boots...........................................................................15

Hình 1. 2: Quy trình phát triển của Elesticsearch....................................................22

Hình 1. 3: Websocket...............................................................................................31

Hình 2. 1: Mô hình use case Khách hàng................................................................40

Hình 2. 2: Mô hình use case Quản Trị.....................................................................41

Hình 2. 3: Mô hình use case Quản lý sản phẩm.......................................................41

Hình 2. 4: Mô hình use case Quản lý danh mục......................................................42

Hình 2. 5: Mô hình use case Quản lý nhà cung cấp.................................................42

Hình 2. 6: Mô hình use case Quản lý đơn đặt hàng.................................................43

Hình 2. 7: Mô hình use case Quản lý tin tức...........................................................43

Hình 2. 8: Sequence diagram bỏ hàng vào giỏ........................................................44

Hình 2. 9: Sequence diagram xem giỏ hàng............................................................44

Hình 2. 10: Sequence diagram xoá sản phẩm trong giỏ hàng..................................45

Hình 2. 11: Sequence diagram sửa số lượng sản phẩm trong giỏ hàng...................45

Hình 2. 12: Sequence diagram tìm sản phẩm..........................................................46

Hình 2. 13: Sequence diagram đăng ký thành viên.................................................46

Hình 2. 14: Sequence diagram chỉnh sửa thông tin thành viên...............................47

Hình 2. 15: Sequence diagram đăng nhập thành viên..............................................47

Hình 2. 16: Sequence diagram tạo đơn đặt hàng.....................................................48

Hình 2. 17: Sequence diagram xem sản phẩm.........................................................48

Hình 2. 18: Sequence diagram xem chi tiết sản phầm.............................................49


Hình 2. 19: Sequence diagram xem tin tức..............................................................49

Hình 2. 20: Sequence diagram tạo mới tin tức........................................................50

Hình 2. 21: Sequence diagram xóa tin tức...............................................................50

Hình 2. 22: Sequence diagram cập nhật tin tức.......................................................51

Hình 2. 23: Sequence diagram thêm danh mục.......................................................51

Hình 2. 24: Sequence diagram xóa danh mục..........................................................52

Hình 2. 25: Sequence diagram sửa danh mục..........................................................53

Hình 2. 26: Sequence diagram thêm sản phẩm........................................................54

Hình 2. 27: Sequence diagram xóa sản phẩm..........................................................55

Hình 2. 28: Sequence diagram sửa sản phẩm..........................................................56

Hình 2. 29: Sequence diagram xem chi tiết đơn đặt hàng.......................................57

Hình 3. 1: Trang chủ................................................................................................72

Hình 3. 2: Trang sản phẩm.......................................................................................73

Hình 3. 3: Giỏ hàng..................................................................................................73

Hình 3. 4: Trang đăng kí..........................................................................................74

Hình 3. 5: Trang đăng nhập.....................................................................................74

Hình 3. 6: Categories Detail.....................................................................................75

Hình 3. 7: So sánh sản phẩm....................................................................................75

Hình 3. 8: Thanh toán..............................................................................................76


LỜI NÓI ĐẦU

1. Lý do chọn đề tài:
Trong thời đại công nghệ số, thương mại điện tử đang trở thành xu hướng và là một
phần quan trọng của nền kinh tế số. Tuy nhiên, để xây dựng ứng dụng web thương
mại điện tử hiệu quả, cần có sự hỗ trợ của các công nghệ để đảm bảo tính bảo mật,
hiệu suất và trải nghiệm người dùng tốt nhất. Trong đó, Keycloak, Elasticsearch và
Websocket là những công nghệ được sử dụng rộng rãi trong lĩnh vực này. Vì vậy,
việc nghiên cứu về các công nghệ này trong việc xây dựng ứng dụng web thương
mại điện tử sẽ đóng góp vào việc nâng cao chất lượng sản phẩm và mang lại giá trị
cho người dùng.

2. Mục tiêu nghiên cứu:


Mục tiêu của đề tài này là nghiên cứu về các công nghệ Keycloak, Elasticsearch và
Websocket và áp dụng chúng trong việc xây dựng ứng dụng web thương mại điện
tử. Cụ thể, đề tài sẽ đưa ra các mục tiêu sau:
 Tìm hiểu về các công nghệ Keycloak, Elasticsearch và Websocket, bao gồm
tính năng, ưu điểm, hạn chế và cách sử dụng.
 Thiết kế kiến trúc của ứng dụng web thương mại điện tử và tích hợp các công
nghệ Keycloak, Elasticsearch và Websocket vào kiến trúc này.
 Xây dựng ứng dụng web thương mại điện tử sử dụng các công nghệ Keycloak,
Elasticsearch và Websocket đã tích hợp.
 Đánh giá hiệu suất và tính bảo mật của ứng dụng web thương mại điện tử đã
xây dựng.

3. Đối tượng và phạm vi nghiên cứu:


Đối tượng của nghiên cứu là các công nghệ Keycloak, Elasticsearch và Websocket
và ứng dụng của chúng trong xây dựng ứng dụng web thương mại điện tử. Phạm vi
nghiên cứu bao gồm:
 Tìm hiểu về các công nghệ Keycloak, Elasticsearch và Websocket và cách sử
dụng chúng trong việc xây dựng ứng dụng web thương mại điện tử.
 Thiết kế kiến trúc của ứng dụng web thương mại điện tử và tích hợp các công
nghệ Keycloak, Elasticsearch và Websocket vào kiến trúc
CHƯƠNG 1. TỔNG QUAN
1.1. Giới thiệu về thương mại điện tử (E-Commerce)
Thương mại điện tử - Lịch sử phát triển

Thương mại điện tử (còn gọi là thị trường điện tử, thị trường ảo, E-
Commerce hay E-Business) là quy trình mua bán ảo thông qua việc truyền dữ liệu
giữa các máy tính trong chính sách phân phối của tiếp thị. Tại đây một mối quan hệ
thương mại hay dịch vụ trực tiếp giữa người cung cấp và khách hàng được tiến
hành thông qua Internet. Hiểu theo nghĩa rộng, thương mại điện tử bao gồm tất cả
các loại giao dịch thương mại mà trong đó các đối tác giao dịch sử dụng các kỹ
thuật thông tin trong khuôn khổ chào mời, thỏa thuận hay cung cấp dịch vụ. Thông
qua một chiến dịch quảng cáo của IBM trong thập niên 1990, khái niệm Electronic
Business thường được dùng trong các tài liệu, bắt đầu thông dụng.

Hiện nay định nghĩa thương mại điện tử được rất nhiều tổ chức quốc tế đưa
ra song chưa có một định nghĩa thống nhất về thương mại điện tử. Nhìn một cách
tổng quát, các định nghĩa thương mại điện tử được chia thành hai nhóm tùy thuộc
vào quan điểm: Theo quan điểm này, có hai định nghĩa khái quát được đầy đủ nhất
phạm vi hoạt động của Thương mại điện tử:

 Hiểu theo nghĩa hẹp

Theo nghĩa hẹp, thương mại điện tử chỉ đơn thuần bó hẹp thương mại điện tử
trong việc mua bán hàng hóa và dịch vụ thông qua các phương tiện điện tử, nhất là
qua Internet và các mạng liên thông khác.

 Hiểu theo nghĩa rộng

Theo nghĩa rộng, thương mại điện tử là các giao dịch tài chính và thương
mại bằng phương tiện điện tử như: trao đổi dữ liệu điện tử, chuyển tiền điện tử và
các hoạt rộng như gửi/rút tiền bằng thẻ tín dụng.

Các đặc trưng của thương mại điện tử


Để xây dựng khung pháp luật thống nhất cho thương mại điện tử, chúng ta
cần nghiên cứu và tìm ra các đặc trưng của thương mại điện tử. So với các hoạt
động thương mại truyền thống, thương mại điện tử có một số đặc điểm cơ bản sau:

Các bên tiến hành giao dịch trong thương mại điện tử không tiếp xúc trực
tiếp với nhau và không đòi hỏi phải biết nhau từ trước.

Các giao dịch thương mại truyền thống được thực hiện với sự tồn tại của
khái niệm biên giới quốc gia, còn thương mại điện tử được thực hiện trong một thị
trường không có biên giới (thị trường thống nhất toàn cầu). Thương mại điện tử
trực tiếp tác động tới môi trường cạnh tranh toàn cầu. Trong hoạt động giao dịch
thương mại điện tửđều có sự tham gia ít nhất của ba chủ thể, trong đó có một bên
không thể thiếu được là gười cung cấp dịch vụ mạng, các cơ quan chứng thực.

Đối với thương mại truyền thống thì mạng lưới thông tin chỉ là phương tiện
để trao đổi dữ liệu, còn đối với thương mại điện tử thì mạng lưới thông tin chính là
thị trường.

Các hình thức hoạt động chủ yếu của thương mại điện tử

- Thư điện tử.


- Thanh toán điện tử.
- Trao đổi dữ liệu điện tử.
- Truyền dung liệu.
- Bán lẻ hàng hóa hữu hình.
1.2. Giới thiệu về ngôn ngữ lập trình Java
Sự phát triển mạnh mẽ của ngành công nghệ thông tin trên thế giới với nhiều
cuộc cách mạng trên nhiều lĩnh vực, thế hệ Web mới có những thay đổi quan trọng
không chỉ ở nền tảng công nghệ mà còn cách thức sử dụng, hình thành nên môi
trường cộng đồng mà ở đó có mọi người cùng tham gia đóng góp cho xã hội “ảo”
chứ không còn dừng lại ở quá trình “duyệt và xem” như trước kia. Mục tiêu của
người tiên phong xây dựng Internet là nhằm kết nối các nhà nghiên cứu và các máy
tính của họ với nhau để họ có thể chia sẻ thông tin hiệu quả.

 Các đặc tính của web:


- Web có vai trò nền tảng, có thể chạy mọi ứng dụng.
- Phục vụ mọi người
- Tập hợp trí tuệ cộng đồng
- Dữ liệu có vai trò then chốt
- Phần mềm được cung cấp ở dạng dịch vụ web được cập nhật không ngừng
- Phát triển ứng dụng dễ dàng và nhanh chóng, gọn nhẹ và thích hợp
- Phần mềm có thể chạy trên nhiều thiết bị
- Người dùng tự chủ
- Trí thông minh nhân tạo, Big Data, ..là mô tả cho kỷ nguyên công nghệ
web 4.0 này thể hiện rõ rệt ở việc máy tính có thể trả về các kết quả giao tiếp,
suy luận và hành xử như con người.
 Các giải pháp Web được chia thành 2 loại:
- Xây dựng hầu hết các tính năng trên một nền tảng máy chủ duy nhất
- Xây dựng ứng dụng “gắn thêm” cho máy chủ web, có sử dụng giao tiếp API
Web đang thay đổi theo hướng trao quyền nhiều hơn cho người dùng và tạo
nên môi trường liên kết chặt chẽ các cá nhân với nhau. Giờ đây, có nhiều ví dụ cho
thấy cộng đồng người dùng có thể đóng góp thông tin giá trị khi họ có phương tiện
thích hợp. Và những yêu cầu về công nghệ để phát triển nền tảng web này java đều
có thể làm được. Đó là lý do vì sao bài báo cáo này chúng ta tìm hiểu về Sping
framework trên nền tảng java web.
Java là gì?

Java là một trong những ngôn ngữ lập trình hướng đối tượng. Nó được sử
dụng trong phát triển phần mềm, trang web, game hay ứng dụng trên các thiết bị di
động.

Xây dựng website và các ứng dụng web bằng ngôn ngữ lập trình java là một
trong những lựa chọn khá phổ biến vì tính nhanh chóng. Ngoài ra, ngôn ngữ java
cũng đáp ứng tốt nếu người dùng cần xây dựng các ứng dụng web có yêu cầu về
hiệu năng cao.

Hiện nay, ngôn ngữ lập trình java cũng thường được sử dụng để xây dựng
các trang web thương mại điện tử hoặc ứng dụng web cho các tổ chức chính phủ,
tổ chức giáo dục, y tế, quốc phòng… Bên cạnh đó, ngôn ngữ lập trình này còn
được dùng để tạo ra các trò chơi trên nền tảng website, giúp khai thác tối đa tính
hấp dẫn của website.

Đặc điểm của java

- Hướng đối tượng: Trong Java, mọi thứ đều là Object. Java có thể mở rộng vì nó
dựa trên mô hình Object.
- Nền tảng độc lập: Sau khi đã được biên dịch thành tệp tin lớp (*.class) ứng dụng
có thể thực thi ở bất kỳ hệ thống nào. Đó là đặc tính mà các ngôn ngữ khác
không có.
- Đơn giản: Java được thiết kế để dễ học.
- Bảo mật: cho phép phát triển những hệ thống không có virus, giả mạo. Các kỹ
thuật xác thực dựa trên mã hóa công khai.
- Kiến trúc trùng lặp: Trình biên dịch của Java tạo ra một định dạng file object có
kiến trúc trùng lặp, làm cho code sau khi biên dịch có thể chạy trên nhiều bộ vi
xử lý, với sự hiện diện của Java runtime system.
- Portable: Là kiến trúc trung lập và không phụ thuộc vào việc thực hiện là
những đặc điểm chính nhất khi nói về khía cạnh Portable của Java. Trình biên
dịch trong Java được viết bằng ANSI C với một ranh giới portable gọn gàng, đó
là một subset POSIX (giao diện hệ điều hành linh động). Có thể mang byte code
của Java lên bất cứ nền tảng nào.
- Mạnh mẽ: Java nỗ lực loại trừ những tình huống dễ bị lỗi bằng cách nhấn mạnh
chủ yếu là kiểm tra lỗi thời gian biên dịch và kiểm tra runtime.
- Thông dịch: Byte code của Java được dịch trực tiếp tới các nền tảng gốc và nó
không được lưu trữ ở bất cứ đâu.
- Hiệu suất cao: Với việc sử dụng trình biên dịch Just-In-Time, Java cho phép
thực thi với hiệu suất cao, nhanh chóng phát hiện, gỡ lỗi.
- Phân tán: Java được thiết kế cho môi trường phân tán của Internet.
- Linh động: Java được coi là năng động hơn C hay C++ vì nó được thiết kế để
thích nghi với môi trường đang phát triển. Các chương trình Java có thể mang
theo một lượng lớn thông tin run-time, được sử dụng để xác minh và giải quyết
các truy cập đến đối tượng trong thời gian chạy.
1.3. Môi trường và các công nghệ sử dụng

1.3.1. Spring boot


Giới thiệu Spring boot

Spring boot là một module của Spring Framework, cung cấp tính năng RAD
(Rapid Application Development) – Phát triển ứng dụng nhanh.

Spring Boot được dùng để tạo các ứng dụng độc lập dựa trên Spring. Spring
boot không yêu cầu cấu hình XML. Nó là một chuẩn cho cấu hình thiết kế phần
mềm, tăng cao năng suất cho developer.

Hình 1. 1: Giao diện Spring boots

Có thể dùng Spring boot để tạo ứng dụng JavaWeb chạy bằng command
line 'java -jar' hoặc export ra file war để triển khai lên Web Server như thông
thường. Spring Boot cung cấp một "CLI Tool" để chạy các kịch bản Spring (spring
scripts).
Đặc điểm nổi bật của Spring boot

 SpringApplication: là class có khả năng tạo ra sự thuận tiện cho việc chạy
những ứng dụng ở bên trong main().
 Externalized Configuration sẽ cho phép có thể config từ phía bên ngoài nên
tạo cơ hội cho mỗi một ứng dụng đều có thế chạy được nhiều môi trường khác
nhau.
 Profiles: giúp phân chia các loại cấu hình cho từng loại môi trường.
 Logging: được sử dụng phục vụ cho toàn bộ chức năng log trong phạm vi
nội bộ. Những logging sẽ được quản lý một cách mặc định.

Lý do nên sử dụng Spring boot?

Với những ưu điểm vượt trội và thừa hưởng ưu điểm và thế mạnh từ
framework đi trước, có cộng đồng sử dụng rộng lớn. Với những ưu điểm nổi bật
hơn so với Spring MVC, vừa khắc phục được những nhược điểm của Spring
Framework thì nó khẳng định trong lĩnh vực lập trình web.

Ưu điểm của Spring boot:

 Tạo các ứng dụng Spring độc lập có thể được bắt đầu bằng cách sử dụng
java-jar.
 Nhúng trực tiếp Tomcat, Jetty hoặc Undertow
 Cung cấp POMs ‘starter’ được đề xuất để đơn giản hóa cấu hình maven
 Tự động cấu hình Spring bất cứ khi nào có thể
 Cung cấp tính năng “ăn liền” như số liệu, kiểm tra sức khỏe và cấu hình bên
ngoài
 Không tự sinh mã và không yêu cầu cấu hình XML.

Tính năng của Spring boot:

 Phát triển web


 Ứng dụng Spring
 Ứng dụng về các sự kiện và lắng nghe
 Tính năng quản trị
 Cấu hình bên ngoài
 Các tệp thuộc tính
 Hỗ trợ YAML
 Cấu hình kiểu an toàn
 Ghi log
 Bảo mật

Triển khai trong môi trường phát triển:

Bước 1: Tải ide intelliJ để phát triển ứng dụng

Bước 2: Tạo project Spring Boot và xây dựng các module liên quan

Bước 3: Phân tích, xây dựng cơ sở dữ liệu

Bước 4: Cấu hình các công nghệ sẽ áp dụng trong dự án

Bước 5: Phát triển các tính năng trong ứng dụng


1.3.2. KeyCloak
Keycloak là gì?

Về cơ bản, nó là một công cụ mã nguồn mở hiện được cấp phép với Apache
License 2.0. Đây cũng là một dự án ngược dòng cho Red Hat SSO, vì vậy nếu
chúng ta đang tìm kiếm thứ gì đó tập trung vào doanh nghiệp hơn, chúng ta có thể
kiểm tra nó. Mục đích chính của Keycloak là cung cấp “Giải pháp quản lý danh
tính và quyền truy cập cho các ứng dụng hiện đại”, như được viết trên trang dự án
của họ trên GitHub.

Tính năng của Keycloak

Hỗ trợ nhiều giao thức

Hiện tại, Keycloak hỗ trợ ba giao thức khác nhau, đó là – OpenID Connect, OAuth
2.0 và SAML 2.0.

SSO

Keycloak có hỗ trợ đầy đủ cho Đăng nhập một lần và Đăng xuất một lần.

Bảng điều khiển dành cho quản trị viên


Keycloak cung cấp GUI dựa trên web, nơi chúng ta có thể “nhấp ra” tất cả các cấu
hình mà phiên bản của chúng ta yêu cầu để hoạt động như chúng ta mong muốn.

Danh tính Người dùng và Quyền truy cập

Keycloak có thể được sử dụng làm trình quản lý truy cập và nhận dạng người dùng
độc lập bằng cách cho phép nhóm em tạo cơ sở dữ liệu người dùng với các vai trò
và nhóm tùy chỉnh. Thông tin này có thể được sử dụng thêm để xác thực người
dùng trong ứng dụng của nhóm em và bảo mật các phần của nó dựa trên các vai trò
được xác định trước.

Đồng bộ hóa nguồn nhận dạng bên ngoài

Trong trường hợp khách hàng của chúng ta hiện có một số loại cơ sở dữ liệu người
dùng, Keycloak cho phép nhóm em đồng bộ hóa với cơ sở dữ liệu đó. Theo mặc
định, nó hỗ trợ LDAPvà Active Directorynhưng chúng ta có thể tạo tiện ích mở
rộng tùy chỉnh cho bất kỳ cơ sở dữ liệu người dùng nào bằng cách sử dụng API lưu
trữ người dùng Keycloak. Hãy nhớ rằng một giải pháp như vậy có thể không có tất
cả dữ liệu cần thiết để Keycloak hoạt động đầy đủ, vì vậy hãy nhớ kiểm tra xem
chức năng mong muốn của chúng ta có hoạt động hay không.

Môi giới nhận dạng

Keycloak cũng có thể hoạt động như một proxy giữa người dùng của chúng ta và
một số nhà cung cấp hoặc nhà cung cấp danh tính bên ngoài. Danh sách của họ có
thể được chỉnh sửa từ Keycloak Admin Panel.

Nhà cung cấp danh tính xã hội

Ngoài ra, Keycloak cho phép nhóm em sử dụng Nhà cung cấp nhận dạng xã hội.
Nó có hỗ trợ tích hợp Google, Twitter, Facebook, Stack Overflow nhưng cuối
cùng, chúng ta phải cấu hình tất cả chúng theo cách thủ công từ bảng quản trị.
Danh sách đầy đủ các nhà cung cấp nhận dạng xã hội được hỗ trợ và hướng dẫn
cấu hình của họ có thể được tìm thấy trong tài liệu Keycloak.

Tùy chỉnh trang

Keycloak cho phép chúng ta tùy chỉnh tất cả các trang được nó hiển thị cho người
dùng của chúng ta. Các trang đó có .ftlđịnh dạng để chúng ta có thể sử dụng các
HTML đánh dấu và CSSkiểu cổ điển để làm cho trang phù hợp với kiểu ứng dụng
và thương hiệu công ty của chúng ta. Chúng ta thậm chí có thể đặt các JStập lệnh
tùy chỉnh như một phần của tùy chỉnh trang để khả năng xảy ra là vô hạn.

Phân phối của Keycloak

Hiện tại, Keycloak có ba bản phân phối chính.

Người phục vụ

Ứng dụng độc lập có thể tải xuống từ trang Keycloak dưới dạng tệp lưu trữ tar hoặc
zip với tất cả các tập lệnh, tài liệu và nội dung cần thiết để hoạt động bình thường.
Hiện tại, có hai phiên bản chính của bản phân phối này: một phiên bản được cung
cấp bởi máy chủ WildFly trong khi phiên bản còn lại được cung cấp bởi Quarkus.
Hiện nó đang ở giai đoạn xem trước nên có thể xảy ra một số lỗi không mong
muốn.

Hình ảnh Docker

Phân phối thích hợp cho Docker, Podman, Kubernetes và OpenShift. Có hai hình
ảnh docker chính thức cho Keycloak: một hình ảnh được tổ chức tại Quay
Container Registry - quay.io/keycloak/keycloak, hình ảnh thứ hai được tổ chức
trong Docker Hub - jboss/keycloak. Chúng ta có thể tải xuống cả hai bằng
một docker pull lệnh đơn giản.

Nhà điều hành

Phân phối cho Kubernetes và OpenShift dựa trên SDK của nhà điều hành.

Như chúng ta có thể thấy, mọi người đều có thể tìm thấy một phân phối thích hợp.
Nếu chúng ta sử dụng Docker hoặc Kubernetes, chúng ta có hình ảnh và toán tử
Keycloak. Mặt khác, nếu chúng ta thích kiểu triển khai thông thường hơn, chúng ta
cũng sẽ tìm thấy bản phân phối cho mình. Ngay cả khi đó hình ảnh Keycloak
Docker có thể cực kỳ hữu ích để phát triển và thử nghiệm.

Chúng ta có thể thiết lập máy chủ Keycloak thử nghiệm của mình sau đó thực hiện
các thay đổi và kiểm tra chúng. Sau khi kiểm tra, chúng ta có thể khởi động lại
hình ảnh Docker của mình và tất cả các thay đổi được thực hiện đối với Keycloak
của chúng ta sẽ được hoàn nguyên và chúng ta sẽ có được một môi trường rõ ràng
để kiểm tra thêm.

Tích hợp Keycloak

Vì vậy, bây giờ chúng ta đã biết cơ bản về Keycloak và các tính năng của nó. Câu
hỏi cuối cùng còn lại là - làm thế nào để tích hợp nó vào ứng dụng của chúng ta?

Ở đây tôi sẽ nói chủ yếu từ quan điểm của Java eco-system nhưng tôi cũng sẽ đề
cập đến một số ngôn ngữ và khuôn khổ khác. Trong Java hiện tại, các khung công
tác phổ biến nhất như Spring Boot, Quarkus và Micronaut có một số loại bộ điều
hợp giúp tích hợp với Keycloak thực sự dễ dàng.

Tất cả các thư viện đều là mã nguồn mở, được phát triển và duy trì bởi cộng đồng
được xây dựng xung quanh Keycloak.

Trong trường hợp của Spring Boot và Quarkus, nhờ sự trừu tượng của khuôn khổ
được cung cấp, toàn bộ tích hợp chỉ cần một vài dòng mã và điền vào một số thuộc
tính cấu hình. Trong các trường hợp khác, thư viện chỉ cung cấp ứng dụng khách
API Keycloak nên việc tích hợp có thể phức tạp hơn.

Lý do chọn Keycloak

Trước hết, nó là miễn phí. Chúng ta có thể nghĩ rằng điều đó thật buồn cười nhưng
trên thực tế, hầu hết các công cụ có tính năng như AuthO hay Okta đều được trả
phí.

Thứ hai, nó hỗ trợ ba giao thức xác thực khác nhau mang đến cho chúng ta khả
năng bao phủ nhiều ứng dụng với các nhu cầu bảo mật khác nhau bằng một công
cụ duy nhất.

Ngoài ra, chúng ta có thể chọn một giao thức xác thực dựa trên những gì chúng ta
cần hoặc những gì chúng ta nghĩ sẽ tốt hơn cho ứng dụng của mình và chúng ta
không bị giới hạn bởi công cụ chúng ta đang sử dụng. Keycloak cũng là một dự án
ngược dòng cho sản phẩm Red Hat SSO nên chúng ta có thể chắc chắn rằng đó là
một hệ thống được viết tốt và được thiết kế tốt.
Hơn nữa, nó có sự hỗ trợ của cộng đồng lớn, đảm bảo rằng có rất nhiều ví dụ về
cách làm điều gì đó và chúng ta có thể tin tưởng vào những người khác để giúp
chúng ta giải quyết các vấn đề của chúng ta. Keycloak có thể rất hữu ích khi máy
khách của chúng ta có một số cơ sở dữ liệu người dùng hiện có như LDAP hoặc
Active Directory vì nó có cơ chế tích hợp để đồng bộ hóa với các nhà cung cấp
danh tính như vậy.

Ngoài ra, Keycloak hỗ trợ các nhà cung cấp danh tính xã hội như Google hoặc
Facebook ngay lập tức, vì vậy nếu chúng ta muốn sử dụng Đăng nhập xã hội,
Keycloak có thể rất hữu ích cho chúng ta và nhóm của chúng ta.

Hơn nữa, nó cung cấp GUI dựa trên web giúp thay đổi cấu hình dễ dàng hơn. Cuối
cùng, nhờ sự hỗ trợ của Keycloak SSO, chúng ta có thể tạo điều kiện cho người
dùng truy cập vào nhiều dịch vụ do công ty của chúng ta điều hành.

Triển khai trong môi trường phát triển:

Bước 1: Download keycloak về máy và cài đặt tài khoản

Bước 2: Chọn Administration console để đăng nhập vào màn hình quản trị
Bước 3: Trỏ xuống và tạo realm riêng để quản lý dưới quyền realm master

Bước 4: Sau khi tạo realm chọn realm mình muốn quản lý và nhấn vào create để
tạo mới Clients
Bước 5: Sau khi có client chúng ta sẽ cấu hình nó như hình bên dưới

Bước 6: Sau khi đã hoàn thành cấu hình server keycloak chúng ta sẽ bắt đầu triển
khai nó trong code, cụ thể như sau:
1, Add dependency của keycloak vào file pom.xml

2, Cấu hình biến môi trường cho các giá trị để kết nối đến keycloak

3, Tạo file KeycloakConfiguration để cấu hình kết nối với keycloak


4, Khi đã có file cấu hình chúng ta bắt đầu phát triển api đăng kí, đăng nhập

- Api đăng kí:


- Api đăng nhập:
- Các hàm chung được sử dụng:
1.3.3. ElasticSearch
Theo Wikipedia Elasticsearch là một công cụ tìm kiếm dựa trên Lucene. Nó cung
cấp một công cụ tìm kiếm toàn diện có khả năng phân tán, đa nhiệm với HTTP
web interface và schema-free JSON documents.

Nói cách khác, Elasticsearch là một database server mã nguồn mở, độc lập được
phát triển trong Java. Về cơ bản, nó được sử dụng để tìm kiếm và phân tích văn
bản (full-text-search). Nó lấy dữ liệu không cấu trúc từ nhiều nguồn khác nhau và
lưu trữ nó ở định dạng phức tạp được tối ưu hóa cao cho các tìm kiếm dựa trên
ngôn ngữ.

Như đã đề cập ở trên, Elasticsearch sử dụng Apache Lucene để indexing và


searching. Do đó, Lucene chỉ là một thư viện và để làm việc được với nó sẽ là một
quá trình rất phức tạp. Tuy nhiên, Elasticsearch đã khắc phục các khó khăn đó bằng
cách ẩn tất cả những thao tác phức tạp bằng cách cung cấp quyền truy cập vào API.
API đi kèm dưới dạng một API RESTful HTTP sử dụng JSON làm định dạng trao
đổi dữ liệu. Sử dụng Elasticsearch chúng ta có thể lưu trữ, tìm kiếm và phân tích
khối lượng lớn dữ liệu một cách nhanh chóng và hiệu quả. Nó đặc biệt hữu ích
trong khi xử lý dữ liệu bán cấu trúc tức là ngôn ngữ tự nhiên.

Elasticsearch là một sản phẩm của công ty có tên là Elastic, được thành lập vào
năm 2012. ElasticSearch là một trong những sản phẩm nguồn mở lớn cùng với
Logstash, Kibana và Beats. Elastic cung cấp một số sản phẩm thương mại khác như
Marvel, Shield, Watcher, Found,...

Vào năm 2004, Shay Banon đã tạo ra Compass, được coi là tiền thân của
Elasticsearch. Quá trình phát triển của Elasticsearch được mô tả trong dòng thời
gian sau:

Hình 1. 2: Quy trình phát triển của Elesticsearch

Dưới đây là những định nghĩa chi tiết về Elasticsearch không thể bỏ qua:

 Elasticsearch được xem là một search engine.


 Công cụ Elasticsearch được kế thừa từ Lucene Apache.
 Elasticsearch hoạt động thực chất sẽ như 1 web server với khả năng tìm kiếm
nhanh chóng thông qua giao thức RESTful.
 Elasticsearch sở hữu khả năng phân tích và thống kê dữ liệu vô cùng hiệu
quả.
 Elasticsearch chạy trên nền tảng server riêng và đồng thời giao tiếp thông
qua RESTful vậy nên nó không quá phụ thuộc vào client được viết bằng gì
hoặc hệ thống hiện tại của chúng ta được viết bằng gì. Bởi vậy, việc tích hợp
nó vào hệ thống sẽ trở nên dễ dàng hơn và chúng ta chỉ cần thực hiện hành
động gửi request http lên là nó sẽ trả về kết quả.
 Elasticsearch là một hệ thống phân tán với khả năng mở rộng vô cùng tuyệt
vời. Chúng ta chỉ cần lắp thêm node cho nó là nó sẽ auto mở rộng cho chúng
ta.
 Elasticsearch chính là một open source được phát triển bằng chính ngôn ngữ
Java.

Các khái niệm cơ bản của Elasticsearch

Trước khi đi sâu hơn vào Elasticsearch, có vài khái niệm mà chúng ta cần phải hiểu
sau đây.

1. Near Real-Time (Gần thời gian thực)

Elasticsearch là một real-time search platform có nghĩa là nó có thể thường xuyên


lên lịch cho một trạng thái mới của các tài liệu tìm kiếm được. Theo mặc định các
trạng thái sẽ được làm mới theo giây. Do đó, sẽ tồn tại một độ trễ nhỏ cho đến khi
tài liệu trở nên có thể tìm kiếm được, từ lúc chúng ta lập index.

2. Index

Index là tập hợp các tài liệu có đặc điểm tương tự. Nó lưu trữ dữ liệu trong một
hoặc nhiều indices bằng cách sử dụng các phép so sánh SQL, được sử dụng để lưu
trữ và đọc các tài liệu. Trong Elasticsearch, một index được xác định bởi một tên
duy nhất và phải là chữ thường. Tên này sẽ được sử dụng để chỉ một index cụ thể
khi thực hiện các hoạt động khác nhau trên các tài liệu. Trong một single cluster có
thể có n indexes.

3. Document

Trong Elasticsearch, một document là một đơn vị thông tin cơ bản mà chúng ta có
thể lập index. Các tài liệu này bao gồm các trường khác nhau và mỗi trường trong
số các trường này được xác định theo tê, và có thể chứa một hoặc nhiều giá trị. Các
tài liệu này đều là schema free và có thể có một nhóm trường khác. Tài liệu này là
một JSON (JavaScript Object Notation). Trong một index có thể lưu trữ được n tài
liệu.

4. Type

Trong Elasticsearch, type được định nghĩa cho các tài liệu có một tập các trường
chung. Nó là một logical category/ partition của một index có ngữ nghĩa học hoàn
toàn tùy thuộc vào người dùng. Chúng ta cũng có thể xác định nhiều type trong
một index.

5. Node

Một node là một single instance của Elasticsearch server lưu trữ dữ liệu. Node
tham gia vào cluster's indexing và searching capabilities. Một node được xác định
bằng tên. Theo mặc định, một IDentifier ngẫu nhiên duy nhất (UUID) được gán
cho node khi khởi động. Tên này được sử dụng cho mục đích quản trị. Chúng ta có
thể xác định máy chủ nào trong mạng của chúng ta tương ứng với các node nào
trong cụm Elasticsearch bằng cách sử dụng các tên này.

6. Cluster

Cluster là một tập hợp của một hoặc nhiều node Elasticsearch (máy chủ) hoạt
động cùng nhau. Nó chứa toàn bộ dữ liệu và cung cấp khả năng index và search dễ
dàng trên tất cả các node, cho phép xử lý dễ dàng một khối lượng dữ liệu quá lớn
so với khả năng xử lý của một node duy nhất. Giống như một node, một cluster
cũng được xác định bằng một tên duy nhất. Theo mặc định, tên đó luôn là
"elasticsearch". Một node chỉ có thể là một phần của một cluster nếu node được
thiết lập để nối cluster bằng tên của nó và đó là lý do tại sao tên của cluster là rất
quan trọng.

7. Shards

Sử dụng một cluster, chúng ta có thể lưu trữ khối lượng lớn thông tin vượt quá khả
năng của một single server. Để giải quyết vấn đề này, Elasticsearch cho phép
chúng ta chia nhỏ chỉ mục của mình thành nhiều phần được gọi là phân đoạn. Số
lượng mảnh cần thiết có thể được xác định trong khi tạo chỉ mục. Mỗi phân đoạn là
một "index" độc lập và đầy đủ chức năng có thể được lưu trữ trên bất kỳ node nào
trong cluster.

8. Replicas

Để tránh các sự cố ngẫu nhiên (chẳng hạn như một shard hoặc node bị offline vì lý
do nào đó), chúng ta luôn cần phải có một cơ chế chuyển đổi dự phòng (failover
mechanism). Vì vậy, như một giải pháp, Elasticsearch cung cấp replicas. Replicas
chỉ là một bản sao bổ sung của shard và có thể được sử dụng cho các truy vấn
giống như bản gốc.

Các quy ước API


Các API REST Elasticsearch được truy cập bằng cách sử dụng JSON qua HTTP.
Elasticsearch sử dụng các quy ước sau trong suốt API REST.

1. Multiple Indices

Nói chung, các hoạt động trong API dành cho nhiều chỉ mục. Điều này giúp người
dùng thực hiện các hoạt động khác nhau thông qua toàn bộ API bằng cách thực
hiện truy vấn liên quan một lần duy nhất. Một số ký hiệu được sử dụng cho các
truy vấn này là:

- Ký hiệu phân tách bằng dấu phẩy (demo1, demo2, demo3)

- Ký tự đại diện (demo *, de * o2, demo3, -demo3)

- _all từ khóa cho tất cả các chỉ mục

- Tham số chuỗi truy vấn URL (ignore_unavailable, allow_no_indices,


expand_wildcards)

2. Date Math Support trong Index Name

Chúng ta có thể tìm kiếm một loạt các time-series indices bằng cách sử dụng date
math index name resolution. Loại tìm kiếm này giới hạn số index đang được tìm
kiếm, do đó giảm tải trên cluster và cải thiện hiệu suất thực hiện. Chúng ta cần chỉ
định ngày và giờ theo định dạng cụ thể như:

<static_name{date_math_expr{date_format|time_zone}}>

static_name: Đại diện cho phần văn bản tĩnh của tên.

date_math_expr: Đạ diện cho một dynamic date math.

date_format: Biểu diễn định dạng tùy chọn trong đó ngày được tính toán sẽ được
hiển thị.

time_zone: Đại diện cho múi giờ tùy chọn.

3. Các tùy chọn phổ biến

Một số tùy chọn phổ biến là:

- Pretty Result

- Human Readable Output


- Date Math

- Response Filtering

- Flat Settings

- Parameter

- No Values

- Time Units

- Byte Size Units

- Unit-less quantities

- Distance Units

- Fuzziness

- Enabling Stack Traces

- Request Body In Query String

4. Kiểm soát truy cập dựa trên URL

Người dùng cũng có thể sử dụng proxy có quyền kiểm soát truy cập dựa trên URL
để bảo mật quyền truy cập vào chỉ mục Elasticsearch. Elasticsearch cung cấp tùy
chọn chỉ định chỉ mục trong URL và trên từng yêu cầu riêng lẻ trong nội dung yêu
cầu đối với một số yêu cầu như:

- multi-search

- multi-get

- bulk

Lý do sử dụng Elasticsearch?

Elasticsearch cung cấp cho người dùng một hệ thống tìm kiếm dạng phân tán, phù
hợp với tệp dữ liệu lớn. Elasticsearch thường được sử dụng trong việc tìm kiếm
đơn giản trên trang web, chỉ mục và thu thập dữ liệu, cho đến phân tích và trực
quan hóa dữ liệu kinh doanh.

Ưu điểm nổi bật của Elasticsearch ?

1. Khả năng mở rộng


Elasticsearch rất dễ mở rộng và đáng tin cậy. Đây là một tính năng rất quan trọng
giúp đơn giản hóa các kiến trúc phức tạp và tiết kiệm thời gian trong quá trình thực
hiện các dự án.

2. Tốc độ

Elasticsearch sử dụng distributed inverted indices để tìm các kết quả phù hợp nhất
cho full-text searches giúp việc tìm kiếm từ các tập dữ liệu rất lớn trở nên vô cùng
nhanh chóng.

3. Dễ dàng sử dụng API

Elasticsearch cung cấp các API RESTful đơn giản và sử dụng các schema-free
JSON documents giúp việc indexing, searching, và querying thật dễ dàng.

4. Đa ngôn ngữ

Một trong những tính năng khác biệt nhất mà Elasticsearch sở hữu đó chính là đa
ngôn ngữ. Nó hỗ trợ nhiều tài liệu được viết bằng các ngôn ngữ khác nhau như
tiếng Ả Rập, tiếng Braxin, tiếng Trung, tiếng Anh, tiếng Pháp, tiếng Hindi, tiếng
Hàn...

5. Theo định hướng tài liệu (Document-Oriented)

Elasticsearch lưu trữ các thực thể phức tạp trong thế giới thực dưới dạng các
structured JSON documents và lập chỉ mục tất cả các trường theo mặc định giúp
cho dữ liệu luôn có thể tìm kiếm được. Vì không có hàng và cột dữ liệu, chúng ta
có thể thực hiện full-text search phức tạp một rất cách dễ dàng.

6. Tự động hoàn thành (autocompletion)

Elasticsearch cung cấp chức năng tự động hoàn thành. Bằng cách dự đoán từ bằng
cách sử dụng rất ít ký tự, autocompletion sẽ tăng tốc độ tương tác giữa con người
và máy tính.

7. Schema-Free

Elasticsearch là schema-free vì nó chấp nhận các tài liệu JSON. Nó cố gắng phát
hiện cấu trúc dữ liệu, lập chỉ mục dữ liệu, làm cho dữ liệu có thể tìm kiếm được.

Nhược điểm

Elasticsearch được thiết kế cho mục đích search, do vậy với những nhiệm vụ khác
ngoài search như CRUD thì elastic kém thế hơn so với những database khác như
Mongodb, Mysql …. Do vậy người ta ít khi dùng elasticsearch làm database chính,
mà thường kết hợp nó với 1 database khác.

Trong elasticsearch không có khái niệm database transaction , tức là nó sẽ không


đảm bảo được toàn vẹn dữ liệu trong các hoạt động Insert, Update, Delete.Tức khi
chúng ta thực hiện thay đổi nhiều bản ghi nếu xảy ra lỗi thì sẽ làm cho logic của
mình bị sai hay dẫn tới mất mát dữ liệu. Đây cũng là 1 phần
khiến elasticsearch không nên là database chính.

Không thích hợp với những hệ thống thường xuyên cập nhật dữ liệu. Sẽ rất tốn
kém cho việc đánh index dữ liệu.

Triển khai trong môi trường phát triển:

Bước 1: Tải elastichsearch về máy


Bước 2: Cấu hình và chạy file elasticsearch.bat để khởi động server elastic sau khi
chạy server chúng ta sẽ thử ping đến domain như hình dưới

Bước 3: Cấu hình biến môi trường của el và add dependency


Bước 4: Tạo bảng lưu trữ trên el

Bước 5: Thao tác dữ liệu với el. Có 3 cách để triển khai việc truy vấn với el
1, Sử dụng Spring data jpa với Interface EsProductRepository chúng ta sẽ extends
ElasticsearchRepository
- Sử dụng quy tắc naming của jpa để truy vấn
- Sử dụng native query của el để truy vấn
2, Sử dụng ElasticsearchOperations để hỗ trợ truy vấn

Bước 6: Viết api sử dụng el để tìm kiếm


Ngoài tính năng tìm kiếm ra thì nó cũng được phát triển trong một hệ sinh thái rất
lớn và được ứng dụng rất nhiều. Chúng ta có thể sử dụng nó để tập hợp tất cả log từ
các hệ thống khác nhau và lưu trữ, phân tích, hiển thị nó ngoài ra nó còn có thể
giúp khắc phục sự cố nhanh hơn.

1.3.4. WebSocket
WebSoket là công nghệ hỗ trợ giao tiếp hai chiều giữa client và server bằng cách
sử dụng một TCP socket để tạo một kết nối hiệu quả và ít tốn kém. Mặc dù được
thiết kế để chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa
chúng vào bất kì loại ứng dụng nào.

 WebSockets mới xuất hiện trong HTML5, là một kỹ thuật Reverse Ajax.
WebSockets cho phép các kênh giao tiếp song song hai chiều và hiện đã được
hỗ trợ trong nhiều trình duyệt (Firefox, Google Chrome và Safari). Kết nối
được mở thông qua một HTTP request (yêu cầu HTTP), được gọi là liên kết
WebSockets với những header đặc biệt. Kết nối được duy trì để chúng ta có
thể viết và nhận dữ liệu bằng JavaScript như khi chúng ta đang sử dụng một
TCP socket đơn thuần.

 Dữ liệu truyền tải thông qua giao thức HTTP (thường dùng với kĩ thuật Ajax)
chứa nhiều dữ liệu không cần thiết trong phần header. Một header
request/response của HTTP có kích thước khoảng 871 byte, trong khi với
WebSocket, kích thước này chỉ là 2 byte (sau khi đã kết nối). Vậy giả sử
chúng ta làm một ứng dụng game có thể tới 10,000 người chơi đăng nhập
cùng lúc, và mỗi giây họ sẽ gửi/nhận dữ liệu từ server. Hãy so sánh lượng dữ
liệu header mà giao thức HTTP và WebSocket trong mỗi giây:

 HTTP: 871 x 10,000 = 8,710,000 bytes = 69,680,000 bits per second (66
Mbps)

 WebSocket: 2 x 10,000 = 20,000 bytes = 160,000 bits per second (0.153


Kbps) Như chúng ta thấy chỉ riêng phần header thôi cũng đã chiếm một phần
lưu lượng đáng kể với giao thức HTTP truyền thống.

Công dụng của Websocket

WebSockets được các nhà phát triển phát minh ra để hỗ trợ hiệu quả các kết quả
theo thời gian thực. WebSocket hoạt động bằng cách bắt đầu giao tiếp song công,
liên tục giữa máy khách và máy chủ. Điều này làm giảm lưu lượng mạng không
cần thiết, vì dữ liệu có thể di chuyển ngay lập tức theo cả hai cách thông qua một
kết nối mở duy nhất. Ngoài ra còn cung cấp tốc độ và khả năng thời gian thực trên
web.

Websockets cũng cho phép máy chủ theo dõi các máy khách và "đẩy" dữ liệu đến
chúng khi cần thiết, điều này không thể thực hiện được nếu chỉ sử dụng HTTP.
Kết nối WebSocket cho phép streaming các chuỗi văn bản và dữ liệu nhị phân qua
tin nhắn. WebSocket message bao gồm frame, payload, và data portion. Rất ít dữ
liệu non-payload được gửi qua kết nối mạng hiện có theo cách này, giúp giảm độ
trễ và chi phí, đặc biệt là khi so sánh với các mô hình HTTP request và streaming.

Google Chrome là trình duyệt đầu tiên bao gồm hỗ trợ tiêu chuẩn cho WebSockets
vào năm 2009. RFC 6455 — Giao thức WebSocket — được chính thức xuất bản
trực tuyến vào năm 2011. Giao thức WebSocket và API WebSocket được chuẩn
hóa bởi W3C và IETF, đồng thời hỗ trợ trên các trình duyệt rất phổ thông.

Ưu điểm
 WebSockets cung cấp khả năng giao tiếp hai chiều mạnh mẽ, có độ trễ thấp
và dễ xử lý lỗi. Thông tin trả về từ websocket là vô cùng nhanh chóng nên
nó được sử dụng trong nhiều trường hợp cần thời gian thực như là chat, hiển
thị biểu đồ hay thông tin chứng khoán… Trong những trường hợp này,
chúng ta không thể dùng HTTP để kết nối vì nếu gửi lệnh AJAX liên tiếp tới
server để lấy dữ liệu mới và cập nhật chúng lên màn hình, như thế sẽ tốn
nhiều tài nguyên, traffic và thời gian trả lại không chính xác.

 API cũng rất dễ sử dụng trực tiếp mà không cần bất kỳ các tầng bổ sung nào,
so với Comet, thường đòi hỏi một thư viện tốt để xử lý kết nối lại, thời gian
chờ timeout, các Ajax request (yêu cầu Ajax), các tin báo nhận và các dạng
truyền tải tùy chọn khác nhau (Ajax long-polling và jsonp polling).

 Ngoài ra ưu điểm của Websocket là gì nữa? Khi sử dụng giao thức TCP để
kết nối bằng websocket, hệ thống không cần quá nhiều kết nối như phương
pháp Comet long-polling đồng thời khắc phục được nhiều nhược điểm của
phương pháp Comet streaming. API của websocket cũng khá dễ khi sử dụng
trực tiếp.
Hình 1. 3: Websocket

Nhược điểm

Những nhược điểm của WebSockets gồm có:


 Nó là một đặc tả mới của HTML5, nên nó vẫn chưa được tất cả các trình
duyệt hỗ trợ.

 Không có phạm vi yêu cầu nào. Do WebSocket là một TCP socket chứ
không phải là HTTP request, nên không dễ sử dụng các dịch vụ có phạm vi-
yêu cầu, như SessionInViewFilter của Hibernate. Hibernate là một
framework kinh điển cung cấp một bộ lọc xung quanh một HTTP request.
Khi bắt đầu một request, nó sẽ thiết lập một contest (chứa các transaction và
liên kết JDBC) được ràng buộc với luồng request. Khi request đó kết thúc,
bộ lọc hủy bỏ contest này.

So sánh giữa websocket và HTTP

Thông thường khi sử dụng giao thức kết nối HTTP để truyền tải dữ liệu với kỹ
thuật Ajax sẽ tồn tại nhược điểm là có chứa nhiều dữ liệu không cần thiết ở phần
header. Đối với HTTP, 1 header dùng để request/response thường có kích thước
trong khoảng 871 byte. Trong khi nếu so với Websocket sau khi kết nối thì kích
thước này chỉ là 2 byte.

Giao thức giao tiếp của websocket

Client phải gửi một WebSocket handshake request đến server để bắt đầu thực hiện
kết nối. Server sau đó sẽ trả lại kết quả từ handshake request được gửi từ Socket

Client sẽ gửi một giá trị Sec-WebSocket-Key được mã hóa bằng Based64 đến
server để xác nhận kết nối. Server sẽ thực hiện hành động nối thêm chuỗi cố định
là chuỗi “258EAFA5-E914-47DA-95CA-C5AB0DC85B11″ vào Sec-WebSocket-
Key.

Chuỗi mới được tạo thành có cấu trúc như sau:


“x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-
C5AB0DC85B11″. Sau đó chuỗi được mã hóa SHA-1 để có kết quả như sau:
“1d29ab734b0c9585240069a6e4e3e91b61da1969″.

Tiếp theo, kết quả sẽ được mã hóa bằng Base64 để được kết quả sau cùng là
“HSmrc0sMlYUkAGmm5OPpG2HaGWk=”. Sau khi có kết quả sau cùng, server
sẽ gửi response lại Client Sec-WebSocket-Accept chính là chuỗi kết quả vừa tạo ra.

Client sẽ kiểm tra tình trạng code (bằng 101), đồng thời cũng kiểm tra Sec-
WebSocket-Accept xem có đúng với kết quả mong đợi không và cuối cùng thực
hiện kết nối.

Các thuộc tính của websocket là gì?

ReadyState: biểu diễn trạng thái kết nối. Dưới đây là các giá trị của thuộc tính này:

WebSocket.CONNECTING: Giá trị 0 chỉ rằng kết nối vẫn chưa được thành lập.

WebSocket.OPEN: Giá trị 1 chỉ ra rằng kết nối đã thành lập và có thể giao tiếp

WebSocket.CLOSING: Giá trị 2 chỉ rằng kết nối đang qua handshake đóng.

WebSocket.CLOSED: Giá trị 3 chỉ rằng kết nối đã được đóng hoặc không thể
được mở.

Buffered Amount: là thuộc tính chỉ đọc biểu diễn số byte của UTF-8 mà đã được
xếp hàng bởi sử dụng phương thức send của websocket.

Các sự kiện của websocket là gì?


1. Open: Sự kiện xảy ra khi kết nối Socket được thành lập (onopen)

2. Message: Sự kiện xảy ra khi client nhận dữ liệu từ server (onmessage)

3. Error: Sự kiện xảy ra khi có bất kỳ lỗi nào trong giao tiếp (onerror)

4. Close: Sự kiện xảy ra khi kết nối được đóng (onclose)

Các phương thức của websocket là gì?

Websocket hiện tại đang tồn tại 2 phương thức cơ bản như sau:

Send: Đây là phương thức send (data) dùng để gửi dữ liệu tới server

Close: Đây là phương thức Close () chỉ kết nối đang tồn tại.

Ngoài ra còn có các phương thức bổ sung khác áp dụng cho từng trường hợp cụ
thể.

Triển khai trong môi trường phát triển

1, Add dependency

2, Cấu hình websocket sử dụng In-Memory Message Broker


3, Build process nhận message từ client và xử lý
4, Build các api liên quan đến xử lý hộp thư

1.3.5. PostgreSql

PostgreSQL là một hệ thống quản trị cơ sở dữ liệu quan hệ và đối tượng (object-
relational database management system) miễn phí và nguồn mở (RDBMS) tiên tiến
nhất hiện nay. khả năng mở rộng cao và tuân thủ các tiêu chuẩn kỹ thuật. Nó được
thiết kế để xử lý một loạt các khối lượng công việc lớn, từ các máy tính cá nhân đến
kho dữ liệu hoặc dịch vụ Web có nhiều người dùng đồng thời.
 PostgreSQL được phát triển bởi PostgreSQL Global Development Group, Phát
hành lần đầu: 08/07/1996

 PostgreSQL linh động có thể chạy được trên nhiều nền tảng khác nhau như Mac
OS X, Solaris và Windows.

 PostgreSQL là một phần mềm mã nguồn mở miễn phí bởi vậy PostgreSQL có
thể được dùng, sửa đổi và phổ biến bởi bất kỳ ai cho bất kỳ mục đích nào.

 PostgreSQL có tính ổn định cao.

 PostgreSQL là hệ thống quản lý cơ sở dữ liệu đầu tiên triển khai tính năng kiểm
soát đồng thời nhiều phiên bản (MVCC).

Tính năng PostgreSQL

PostgreSQL tích hợp nhiều tính năng tuyệt vời giúp hỗ trợ nhà phát triển xây dựng
app đáp ứng các chức năng phức tạp, truy vấn nhanh chóng và bảo mật duy trì tính
toàn vẹn và độ tin cậy. Để đáng tin cậy hơn, Postgresql cung cấp các tùy chọn bảo
mật, xác thực và khôi phục thảm họa khác nhau. PostgreSQL được chứng minh là
có khả năng mở rộng cao cả về số lượng dữ liệu và số lượng người dùng có thể thao
tác cùng lúc.

Dưới đây là một số các tính năng nổi bật mình tổng hợp lại.

 Câu truy vấn phức hợp (complex query)


 Thủ tục sự kiện (trigger)
 Các khung nhìn (view)
 Tính toàn vẹn của các giao dịch (integrity transactions)
 Việc kiểm tra truy cập đồng thời đa phiên bản (multiversion concurrency control)
 Truy vấn xử lý song song (parallel query)
 Sao chép dữ liệu dạng luồng (Streaming replication)
Kiểu dữ liệu

 Nguyên hàm: Số nguyên, số, chuỗi, Boolean


 Cấu trúc: Date/Time, Array, Phạm vi, UUID
 Document: JSON/JSONB, XML, Key-value (Hstore)
 Hình học: Điểm, Đường thẳng, Vòng tròn, Đa giác
 Tùy chỉnh: Composite, Các kiểu tùy chỉnh

Toàn vẹn dữ liệu

 UNIQUE, NOT NULL


 Primary Keys
 Foreign Keys
 Ràng buộc loại trừ
 Khóa hàm số, Khóa khuyến nghị
 Đồng quy, hiệu suất

 Lập danh mục: B-tree, Multicolumn, Expressions, Partial


 Lập danh mục nâng cao: GiST, SP-Gist, KNN Gist, GIN, BRIN, Bloom filters
 Trình lập kế hoạch / trình tối ưu hóa truy vấn phức tạp, quét index-only, thống kê
số liệu trên nhiều cột.
 Giao tác, Giao tác dạng nest (thông qua lưu điểm)
 Điều khiển đồng thời nhiều phiên bản (MVCC)
 Truy vấn đọc song song
 Phân vùng bảng
 Tất cả các mức độ giao dịch độc lập được xác định trong tiêu chuẩn SQL, bao
gồm cả Serializable
 Độ tin cậy, phục hồi sau thảm hoạ
 Ghi nhật ký ghi trước (Write-ahead Logging - WAL)
 Replication: Không đồng bộ, Đồng bộ, Logical
 Khôi phục điểm-theo-thời gian (Point-in-time-recovery - PITR), active standbys
 Không gian bảng

Bảo mậts

 Xác thực: GSSAPI, SSPI, LDAP, SCRAM-SHA-256, Certificate và các hình


thức khác
 Hệ thống kiểm soát truy cập mạnh mẽ
 Bảo mật cấp độ cột và hàng

khả năng mở rộng

 Phương pháp lưu trữ


 Ngôn ngữ thủ tục: PL / PGSQL, Perl, Python (và nhiều ngôn ngữ khác)
 Trình wrapper dữ liệu ngoài: kết nối với các cơ sở dữ liệu hoặc luồng khác với
giao diện SQL chuẩn
 Và nhiều tiện ích mở rộng cung cấp chức năng bổ sung, bao gồm cả PostGIS
 Tìm kiếm văn bản:
 Hỗ trợ các bộ ký tự quốc tế, ví dụ: thông qua ICU collations
 Tìm kiếm văn bản đầy đủ
CHƯƠNG 2: PHÂN TÍCH THIẾT KẾ HỆ
THỐNG
2.1. MÔ TẢ HỆ THỐNG
 Khách hàng :

Khách hàng xem và mua hàng tại Website. Website cung cấp nhiều chức năng

cho cả khách hàng vãng lai và khách hàng là hội viên. Các chức năng phục vụ cho
khách hàng nhằm giúp khách hàng có nhiều tiện ích khi xem và mua hàng như:
xem tin tức, xem chi tiết sản phẩm, chon sản phẩm bỏ vào giỏ hàng, tạo đơn đặt
hàng. Khách hàng vãng lai có thể đăng ký tài khoản và mật khẩu để tiện cho lần
giao dịch tiếp theo.

 Bộ phận quản trị:

Người quản trị website đăng nhập vào hệ thống nhằm mục đích quản lý thông

tin, có toàn quyền sử dụng cấu hình và thêm xóa sửa cơ sở dữ liệu, xem các chi tiết
đơn hàng, quản lý danh mục, quản lý sản phẩm…
2.2. Biểu đồ USE CASE (Use Case Diagram)

Hình 2. 1: Mô hình use case Khách hàng


Hình 2. 2: Mô hình use case Quản Trị

Hình 2. 3: Mô hình use case Quản lý sản phẩm


Hình 2. 4: Mô hình use case Quản lý danh mục

Hình 2. 5: Mô hình use case Quản lý nhà cung cấp


Hình 2. 6: Mô hình use case Quản lý đơn đặt hàng

Hình 2. 7: Mô hình use case Quản lý tin tức


2.3. Biểu đồ Tuần tự (Sequence Diagram)
Biểu đồ tuần tự là phương tiện biểu diễn tương tác dưới dạng hình ảnh. Tập
trung vào thứ tự các công việc thực hiện.

1. Bỏ hàng vào giỏ

Hình 2. 8: Sequence diagram bỏ hàng vào giỏ

2. Xem giỏ hàng


Hình 2. 9: Sequence diagram xem giỏ hàng
3. Xóa sản phẩm trong giỏ hàng

Hình 2. 10: Sequence diagram xoá sản phẩm trong giỏ hàng

4. Sửa số lượng sản phẩm trong giỏ hàng

Hình 2. 11: Sequence diagram sửa số lượng sản phẩm trong giỏ hàng
5. Tìm sản phẩm

Hình 2. 12: Sequence diagram tìm sản phẩm

6. Đăng ký thành viên

Hình 2. 13: Sequence diagram đăng ký thành viên


7. Chỉnh sửa thông tin thành viên

Hình 2. 14: Sequence diagram chỉnh sửa thông tin thành viên

8. Đăng nhập thành viên

Hình 2. 15: Sequence diagram đăng nhập thành viên


9. Tạo đơn đặt hàng

Hình 2. 16: Sequence diagram tạo đơn đặt hàng

10. Xem sản phẩm


Hình 2. 17: Sequence diagram xem sản phẩm
11. Xem chi tiết sản phẩm

Hình 2. 18: Sequence diagram xem chi tiết sản phầm

12. Xem tin tức

Hình 2. 19: Sequence diagram xem tin tức


13. Tạo mới tin tức

Hình 2. 20: Sequence diagram tạo mới tin tức

14. Xóa tin tức


Hình 2. 21: Sequence diagram xóa tin tức
15. Cập nhật tin tức

Hình 2. 22: Sequence diagram cập nhật tin tức

16. Thêm danh mục


Hình 2. 23: Sequence diagram thêm danh mục
17. Xoá danh mục

Hình 2. 24: Sequence diagram xóa danh mục


18. Sửa danh mục

Hình 2. 25: Sequence diagram sửa danh mục


19. Thêm sản phẩm

Hình 2. 26: Sequence diagram thêm sản phẩm


20. Xóa sản phẩm

Hình 2. 27: Sequence diagram xóa sản phẩm


21. Sửa sản phẩm

Hình 2. 28: Sequence diagram sửa sản phẩm

73
22. Xem chi tiết đơn đặt hàng

Hình 2. 29: Sequence diagram xem chi tiết đơn đặt hàng

74
2.4 Thiết kế cơ sở dữ liệu
Tạo cơ sở dữ liệu “supper_market” để quản lý dữ liệu bán hàng online trên
hệ quản trị PostgreSql, chi tiết cấu trúc dữ liệu được cài đặt cụ thể như sau:

Bảng 1. 1: Giỏ Hàng

75
Bảng 1. 2: Danh mục

76
Bảng 1. 3: Bình Luận

77
Bảng 1. 4: Thông tin Shop

78
Bảng 1. 5: Đơn đặt hàng

79
Bảng 1. 6: Chi tiết đơn hàng

80
Bảng 1. 7: Khuyến Mại

81
Bảng 1. 8: Quyền

82
Bảng 1. 9: Trạng thái đơn hàng

83
Bảng 1. 10: Thông tin khách hàng

84
Bảng 1. 11: Dữ liệu truy cập của khách hàng

85
Bảng 1. 12: Quyền truy cập của người dùng

86
Bảng 1. 13: Sản phẩm

87
CHƯƠNG 3: XÂY DỰNG ỨNG DỤNG

Hình 3. 1: Trang chủ

88
Hình 3. 2: Trang sản phẩm

Hình 3. 3: Giỏ hàng

89
Hình 3. 4: Trang đăng kí

Hình 3. 5: Trang đăng nhập

90
Hình 3. 6: Categories Detail

Hình 3. 7: So sánh sản phẩm

91
Hình 3. 8: Thanh toán

92
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

I. Kết luận

1. Kết quả đạt được

 Tìm hiểu và ứng dụng được các công nghệ Keycloak, ElasticSearch, Websocket
trong việc xây dựng web.

 Tìm hiểu được mô hình thương mại điện tử B2C.

 Thiết kế dữ liệu trên PostgreSql.

 Phân tích chi tiết và thiết kế đề tài theo UML.

 Cài đặt chương trình trên Visual code & intelliJ.

 Phân chia chức năng cho admin và user thông qua menu

 Người quản trị có các chức năng quản lý, có thể thêm, xóa, sửa một số bảng dữ liệu
như: sản phẩm, danh mục, nhà cung cấp, tin tức …

 Thiết kế giao diện theo kịp xu hướng.

 Hiển thị thông tin từng lọai danh mục, sản phẩm, tin tức.

 Cung cấp hình thức tìm kiếm theo tên sản phẩm.

 Thiết kế giỏ hàng giúp khách hàng chọn mua hàng dễ dàng và cập nhật giỏ hàng.
 Có chức năng thanh toán và tính phí ship cơ bản.
2. Hạn chế

 Do thời gian và nhân lực còn hạn chế nên dự án chưa thể đạt được độ hoàn thiện
tốt nhất.
 Chưa thể khắc phục được hết các lỗi, chế độ bảo mật trung bình.
 Chưa tối ưu SEO
II. Hướng phát triển đề tài

 Thương mại hoá các chức năng, dịch vụ, Toàn hệ thống.
93
 Mở rộng quy mô kinh doanh của Website : Bán hàng cho toàn thế giới

 Thêm các chức năng thanh toán nhanh qua Credit card, Paypal…
 Liên kết với các đơn vị liên quan để mở rộng quy mô dịch vụ

 Phát triển mô hình thương mại điện tử theo cơ chế bảo mật cao cho cơ sở dữ liệu.
Tự động Back up dữ liệu hàng ngày.

 Cho phép khách hàng gửi email đánh giá và nhận xét sản phẩm.

 Bổ sung các chiến dịch Email

 Gia tăng các dịch vụ kinh doanh bằng cách thêm các chức năng mới như : Trò
chơi trực tuyến. Quay thưởng, bốc thăm….
 Báo cáo định dạng theo Crystal Report.
 Nâng cấp ứng dụng theo mô hình MicroService

94
TÀI LIỆU THAM KHẢO

[1] Nguyễn Ngọc Huy và Đỗ Quang Huy, "Ứng dụng Keycloak trong hệ thống xác
thực đa tên miền", 2019.
[2] Trần Việt Hoàng và Lê Thanh Sơn, "Tối ưu hóa tìm kiếm trong Elasticsearch sử
dụng phân tích ngôn ngữ tự nhiên", 2020.
[3] Nguyễn Trọng Hiếu và Lê Đức Hiệp, "Tích hợp Elasticsearch và Kibana vào hệ
thống giám sát hệ thống mạng", 2020.
[4] Nguyễn Thanh Tùng, Nguyễn Đức Thắng và Nguyễn Đức Tùng, "Thiết kế hệ
thống chat real-time sử dụng WebSocket", 2018.
[5] Lê Văn Tân và Nguyễn Thanh Tùng, "Sử dụng WebSocket trong ứng dụng web
chat", 2017.

[6] Sébastien Blanc, "Securing Web Applications with Keycloak", 2020.

[7] Radu Gheorghe, Matthew Lee Hinman, và Roy Russo, "Real-time Search and
Analytics with Elasticsearch", 2014.
[8] Stephen Blum, "Building Real-Time Web Apps with WebSocket", 2014.
[9] Stian Thorgersen, "Keycloak: Identity and Access Management for Modern
Applications", 2019.

[10] Clinton Gormley và Zachary Tong, "Elasticsearch in Action", 2015.

95

You might also like