Professional Documents
Culture Documents
Mã số ngành: 7480201
Mã sinh viên:
19103100030 - 19103100012
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.
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.
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
CSDL Cơ sở dữ liệu
SV Sinh Viên
Bảng 1. 8: Quyền.....................................................................................................65
Hình 1. 3: Websocket...............................................................................................31
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. 14: Sequence diagram chỉnh sửa thông tin thành viên...............................47
Hình 2. 29: Sequence diagram xem chi tiết đơn đặt hàng.......................................57
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.
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ử:
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.
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 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ử
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.
- 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
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.
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.
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.
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.
Bước 2: Tạo project Spring Boot và xây dựng các module liên quan
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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ữ.
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:
Dưới đây là những định nghĩa chi tiết về Elasticsearch không thể bỏ qua:
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.
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.
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à:
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_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ị.
- Pretty Result
- Response Filtering
- Flat Settings
- Parameter
- No Values
- Time Units
- Unit-less quantities
- Distance Units
- Fuzziness
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.
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.
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...
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.
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.
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.
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
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)
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
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.
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.
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.
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.
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.
3. Error: Sự kiện xảy ra khi có bất kỳ lỗi nào trong giao tiếp (onerror)
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ể.
1, Add dependency
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 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).
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.
Bảo mậts
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.
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. 10: Sequence diagram xoá 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. 14: Sequence diagram chỉnh sửa thông tin thành viên
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:
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
88
Hình 3. 2: Trang sản phẩm
89
Hình 3. 4: Trang đăng kí
90
Hình 3. 6: Categories Detail
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
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.
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 …
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.
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.
[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.
95