o Tạo ra các tính năng cần thiết phục vụ cho nhu cầu tạo, quản lý và chia sẻ thông tin cho nhóm cùng du lịch, theo dõi realtime vị trí của các thành viên trong đoàn khi di chuyển để liên
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
NGÔ ĐỨC HÒA
KHÓA LUẬN TỐT NGHIỆP PHÁT TRIỂN ỨNG DỤNG HỖ TRỢ TƯ VẤN
& CHIA SẺ THÔNG TIN DU LỊCH CÙNG NHAU
Build advisory and sharing tourist destinations application
KỸ SƯ NGÀNH KỸ THUẬT PHẦN MỀM
TP HỒ CHÍ MINH, 2021
Trang 2ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
NGÔ ĐỨC HÒA – 16520423
KHÓA LUẬN TỐT NGHIỆP PHÁT TRIỂN ỨNG DỤNG HỖ TRỢ TƯ VẤN
& CHIA SẺ THÔNG TIN DU LỊCH CÙNG NHAU
Build advisory and sharing tourist destinations application
KỸ SƯ NGÀNH KỸ THUẬT PHẦN MỀM
GIẢNG VIÊN HƯỚNG DẪN ThS NGUYỄN THỊ THANH TRÚC
Trang 3DANH SÁCH HỘI ĐỒNG BẢO VỆ KHÓA LUẬN
Hội đồng chấm khóa luận tốt nghiệp, thành lập theo Quyết định số ………
…… ngày ……… của Hiệu trưởng Trường Đại học Công nghệ Thông tin
1 ……… – Chủ tịch
2 ……… – Thư ký
3 ……… – Ủy viên
4 ……… – Ủy viên
Trang 4ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC
CÔNG NGHỆ THÔNG TIN
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc Lập - Tự Do - Hạnh Phúc
TP HCM, ngày …… tháng …… năm ……
NHẬN XÉT KHÓA LUẬN TỐT NGHIỆP
(CỦA CÁN BỘ HƯỚNG DẪN)
Tên khóa luận:
PHÁT TRIỂN ỨNG DỤNG HỖ TRỢ TƯ VẤN & CHIA SẺ THÔNG TIN
DU LỊCH CÙNG NHAU
Ngô Đức Hòa 16520423 ThS Nguyễn Thị Thanh Trúc
Đánh giá Khóa luận
1 Về cuốn báo cáo:
Số trang _ Số chương _
Số bảng số liệu _ Số hình vẽ _
Số tài liệu tham khảo _ Sản phẩm _
Một số nhận xét về hình thức cuốn báo cáo:
Trang 5
3 Về chương trình ứng dụng:
4 Về thái độ làm việc của sinh viên:
Đánh giá chung:
Điểm từng sinh viên:
Trang 6Ngô Đức Hòa: ………/10
Người nhận xét
(Ký và ghi rõ họ tên)
ThS NGUYỄN THỊ THANH TRÚC
Trang 7ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC
CÔNG NGHỆ THÔNG TIN
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc Lập - Tự Do - Hạnh Phúc
TP HCM, ngày …… tháng …… năm ……
NHẬN XÉT KHÓA LUẬN TỐT NGHIỆP (CỦA CÁN BỘ PHẢN BIỆN) Tên khóa luận: XÂY DỰNG ỨNG DỤNG THEO DÕI BỆNH NHÂN TIỂU ĐƯỜNG Nhóm SV thực hiện: Cán bộ phản biện: Ngô Đức Hòa 16520423 ThS Phan Nguyệt Minh Đánh giá Khóa luận 1 Về cuốn báo cáo: Số trang _ Số chương _ Số bảng số liệu _ Số hình vẽ _ Số tài liệu tham khảo _ Sản phẩm _ Một số nhận xét về hình thức cuốn báo cáo:
2 Về nội dung nghiên cứu:
Trang 8
3 Về chương trình ứng dụng:
4 Về thái độ làm việc của sinh viên:
Đánh giá chung:
Điểm từng sinh viên: Ngô Đức Hòa: ………/10
Trang 9Người nhận xét
(Ký và ghi rõ họ tên)
ThS PHAN NGUYỆT MINH
Trang 10LỜI CẢM ƠN
Thực tế luôn cho thấy, sự thành công nào cũng đều gắn liền với những sự hỗ trợ, giúp đỡ của những người xung quanh dù cho sự giúp đỡ đó là ít hay nhiều, trực tiếp hay gián tiếp Trong suốt thời gian từ khi bắt đầu làm luận văn đến nay, chúng
em đã nhận được sự quan tâm, chỉ bảo, giúp đỡ của thầy cô, gia đình và bạn bè xung quanh
Với tấm lòng biết ơn vô cùng sâu sắc, chúng em xin gửi lời cảm ơn chân thành nhất từ đáy lòng đến quý Thầy Cô của Trường Đại học Công Nghệ Thông Tin đã cùng dùng những tri thức và tâm huyết của mình để có thể truyền đạt cho chúng em trong vốn kiến thức quý báu suốt thời gian học tập tại trường
Đặc biệt, chúng em xin chân thành cảm ơn ThS Nguyễn Thị Thanh Trúc đã tận tâm chỉ bảo hướng dẫn chúng em qua từng buổi học, từng buổi nói chuyện, thảo luận
về đề tài nghiên cứu Nhờ có những lời hướng dẫn, dạy bảo đó, bài luận văn này của chúng em đã hoàn thành một cách xuất sắc nhất Một lần nữa, em xin gửi lời cảm ơn chân thành đến cô
Khi thực hiện luận văn chúng em còn bỡ ngỡ vì vốn kiến thức của chúng em có hạn Do vậy, không tránh khỏi những thiếu sót, chúng em rất mong nhận được ý kiến đóng góp của quý Thầy Cô để bài luận được hoàn thiện hơn
Thành phố Hồ Chí Minh, tháng năm 2021
Ngô Đức Hòa
Trang 11ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC
CÔNG NGHỆ THÔNG TIN
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc Lập - Tự Do - Hạnh Phúc
TP HCM, ngày… tháng … năm ………
ĐỀ CƯƠNG CHI TIẾT
Tên đề tài: Phát triển ứng dụng hỗ trợ tư vấn & chia sẻ thông tin du lịch cùng
nhau
Cán bộ hướng dẫn: ThS NGUYỄN THỊ THANH TRÚC
Thời gian thực hiện: Từ ngày 01/09/2020 đến ngày 28/12/2020
Sinh viên thực hiện:
1 NGÔ ĐỨC HÒA – 16520423
Nội dung đề tài: (Mô tả chi tiết mục tiêu, phạm vi, đối tượng, phương pháp
thực hiện, kết quả mong đợi của đề tài)
Tổng quan đề tài:
• Việt Nam đang là một trong những nước có ngành dịch vụ đang trên
đà phát triển mạnh, đặc biệt ngành dịch vụ đang đóng góp ngày càng cao trong tỉ trọng GPD của cả nước và được kỳ vọng là sẽ chiếm đến 43% GPD vào năm 2025 Lượng khách du lịch nội địa và quốc tế đổ
về Việt Nam là cực kì cao với con số thống kê cho năm 2018 là 15,5 triệu lượt người đối với du khách quốc tế Song song với đó, xu hướng
du lịch ngẫu hứng, du lịch phượt đang được các bạn trẻ cực kì ưa chuộng vì tính tự do về thời gian và địa điểm du lịch cũng như tính linh hoạt khi có thể tự do lựa chọn phương tiện như xe máy, xe đạp hay xe hơi, cũng như có thể tổ chức đi cá nhân hoặc đi thành các nhóm nhỏ và lớn khác nhau Chính vì thế mà du lịch đang là một thị trường
vô cùng tiềm năng để khai thác
Trang 12• Với nhiều loại hình du lịch khác nhau mà nhu cầu của khách du lịch cũng càng ngày càng trở nên đa dạng hơn trước rất nhiều, đi kèm theo
đó là sự yêu cầu ngày càng cao về tính tiện dụng và sự ứng dụng của công nghệ vào trong các sản phẩm dịch vụ cho du lịch Minh chứng cho điều này là ngày càng có nhiều các sản phẩm công nghệ đáp ứng cho các nhu cầu khác nhau của du lịch như đặt vé xe, lên lịch trình cho chuyến du lịch, đặt phòng, thuê hướng dẫn viên, review đặc sản,…
Có thể kể tên một số các ứng dụng du lịch đang rất thịnh hành trên thị trường ngày nay như VeXeRe, Booking, Agoda, Trivago, TripAdvisor, diadiemdulich
• Đa số các sản phẩm kể trên đều đánh vào các nhu cầu về đặt phòng, giới thiệu địa điểm du lịch hay đặt vé xe khách, khá ít sản phẩm phục
vụ cho vấn đề chia sẻ lịch trình và hẹn nhóm đi du lịch cùng nhau
• Ứng dụng thực tế (ứng dụng chia sẻ thông tin du lịch cùng nhau)
o Tạo ra ứng dụng với giao diện thân thiện và dễ sử dụng
o Tạo ra các tính năng cần thiết phục vụ cho nhu cầu tạo, quản lý
và chia sẻ thông tin cho nhóm cùng du lịch, theo dõi realtime vị trí của các thành viên trong đoàn khi di chuyển để liên lạc và khắc phục nhanh sự cố nếu có, tìm kiếm địa điểm cung cấp các tiện ích trong quá trình du lịch: quán ăn, tiệm sửa xe, nhà trọ,
…
• Tích hợp với các ứng dụng mạng xã hội tiện cho việc chia sẻ và mời
gọi bạn bè cùng tham gia du lịch
Phương pháp thực hiện:
• Nghiên cứu công nghệ
o Môi trường triển khai: Docker, Kubernetes, Google Cloud Platform
o Back-end:
Trang 13§ NodeJS: sử dụng express framework để tổ chức dạng RESTful API
§ PostgreSQL
§ ORM: ObjectionJS
§ PassportJS và chuẩn OAuth 2 cho việc xác thực và cấp quyền cho người dùng
§ Facebook SDK, Google Map SDK
§ Redis để cache thông tin
§ RabbitMQ (hoặc Kafka) làm message queue cho các service liên lạc với nhau
§ Google Storage cho việc lưu trữ các file media: hình ảnh, video, …
o App:
§ React Native
§ Redux, redux saga cho việc lưu trữ state cho toàn ứng dụng
§ Facebook SDK, Google Map SDK
• Nghiên cứu nghiệp vụ:
o Tìm hiểu nhu cầu của người tham gia du lịch phượt
o Tìm hiểu quá trình lên kế hoạch cho chuyến đi
o Tìm hiểu quá trình mời gọi bạn bè cùng tham gia chuyến đi
o Tìm hiểu quá trình di chuyển theo nhóm khi du lịch phượt
o Tìm hiểu quy trình chia sẻ thông tin sau chuyến đi cho mọi người
Kế hoạch thực hiện:
Làm việc cá nhân, chủ yếu ứng dụng được thực hiện tại nhà và trình bày với giảng viên hàng tuần để giảng viên theo dõi tiến độ, đánh giá, nhận xét
và lên kế hoạch cho những tuần tiếp theo
Kết quả mong đợi:
Hoàn thiện ứng dụng di động với giao diện thân thiện và dễ sử dụng với đầy đủ các chức năng cho việc lập kế hoạch và quản lý chuyến đi du lịch
Trang 14phượt của cá nhân hoặc cả nhóm Hệ thống xử lý phía server chạy ổn định và
dễ dàng quản lý cũng như nâng cấp khi cần thiết
Kế hoạch thực hiện: (Mô tả kế hoạch làm việc và phân chia công việc các
thành viên tham gia)
Với thời gian thực hiện từ 01/09/2020 tới 28/12/2020, nhóm chia thành 5 giai đoạn làm việc, cụ thể:
- Giai đoạn 1: Nghiên cứu, tìm hiểu công nghệ cho việc phát triển
đề tài khóa luận
- Giai đoạn 2: Phân tích nghiệp vụ, xây dựng mô hình UML mô tả nghiệp vụ của đề tài khóa luận
- Giai đoạn 3: Phát triển hệ thống và ứng dụng trên thiết bị di động
- Giai đoạn 4: Triển khai hệ thống lên dịch vụ Google Cloud và quản lý bằng Kubernetes
- Giai đoạn 5: Viết báo cáo cho đề tài khóa luận
• Tìm hiểu React Native
• Tìm hiểu api facebook, api google map, api google storage
• Tìm hiểu Redis, RabbitMQ
4 tuần (01/09/2020 – 01/10/2020)
Giai đoạn 2 -
Business
Analysis
• Tìm hiểu nghiệp vụ du lịch phượt
• Tìm hiểu tính năng ứng dụng tương tự
• Chốt tính năng
• Xây dựng use case
• Xây dựng diagram
2 tuần (01/10/2020 – 08/10/2020)
Trang 15• Viết báo cáo
• Review lại code
2 tuần (15/12/2020 – 28/12/2020)
Trang 16MỤC LỤC
Chương 1 TỔNG QUAN ĐỀ TÀI 1
1.1 Phát biểu đề tài nghiên cứu 1
1.2 Mục tiêu và phạm vi của đề tài 2
1.2.1 Mục tiêu 2
1.2.2 Phạm vi 3
1.3 Đối tượng sử dụng 3
1.4 Kết quả dự kiến 3
1.5 Phương pháp nghiên cứu và nguồn số liệu 3
1.5.1 Phương pháp nghiên cứu 3
1.5.2 Nguồn dữ liệu 4
1.6 Điểm mới của luận văn 4
1.7 Kết cấu luận văn 4
Chương 2 KIẾN THỨC NỀN TẢNG 5
2.1 Công nghệ ảo hóa Containerlization và Docker: 5
2.1.1 Định nghĩa 5
2.1.2 Các thành phần chính 6
2.1.3 Một số khái niệm 6
2.1.4 So sánh Docker với Virtual Machine 7
2.2 Công nghệ điều phối container và Kubernetes 9
2.2.1 Định nghĩa 9
2.2.2 Các thành phần chính: 10
2.2.3 Một số khái niệm 12
Trang 172.3.1 Định nghĩa 13
2.3.2 Ưu điểm của việc thực hiện CI/CD trong dự án 14
2.3.3 Quy trình CI/CD 14
2.3.4 Gitlab CI/CD 15
2.3.5 Gitlab Runner 16
2.4 NodeJS/Express 17
2.4.1 Công nghệ NodeJS 17
2.4.2 Framework Express 18
2.5 React Native 19
2.5.1 Native App và Hybrid App 19
2.5.2 React Native 20
2.6 PostgreSQL 21
Chương 3 PHÂN TÍCH, THIẾT KẾ 22
3.1 Phân tích, thiết kế hệ thống 22
3.2 Sơ đồ kiến trúc hệ thống – Architecture diagram: 24
3.3 Sơ đồ triển khai – Deployment diagram 25
3.4 Sơ đồ Use case: 26
3.5 Sơ đồ lớp – Class diagram 27
3.6 Sơ đồ tuần tự - Sequence diagrams 28
3.6.1 Sơ đồ tuần tự chức năng Đăng nhập 28
3.6.2 Sơ đồ tuần tự chức năng Đăng ký 29
3.6.3 Sơ đồ tuần tự chức năng Upload hình ảnh 30
3.6.4 Sơ đồ tuần tự chức năng Chỉnh sửa thông tin cá nhân 31
3.6.5 Sơ đồ tuần tự chức năng Đổi mật khẩu 32
Trang 183.6.6 Sơ đồ hoạt động chức năng Tạo chuyến đi mới 33
3.6.7 Sơ đồ tuần tự chức năng Đánh dấu địa điểm 34
3.6.8 Sơ đồ tuần tự chức năng Cập nhật thông tin chuyến đi 35
3.6.9 Sơ đồ hoạt động chức năng Mời bạn bè tham gia chuyến đi 36
3.6.10 Sơ đồ tuần tự chức năng Theo dõi vị trí thành viên trong đoàn 37
3.6.11 Sơ đồ tuần tự chức năng Cập nhật vị trí hiện tại 38
3.6.12 Sơ đồ tuần tự chức năng Viết review sau chuyến đi 39
3.7 Thiết kế giao diện người dùng của ứng dụng 40
3.7.1 Giao diện màn hình Đăng nhập 40
3.7.2 Giao diện màn hình Đăng ký 42
3.7.3 Giao diện màn hình Quản lý thông tin cá nhân 44
3.7.4 Giao diện màn hình Danh sách bài viết 48
3.7.5 Giao diện màn hình Tạo mới chuyến đi 51
3.7.6 Giao diện màn hình Danh sách chuyến đi 57
3.7.7 Giao diện màn hình Chỉnh sửa thông tin chuyến đi 59
3.7.8 Giao diện màn hình Xem vị trí thành viên trong chuyến đi 62
3.7.9 Giao diện màn hình Viết review sau chuyến đi 64
Chương 4 TRIỂN KHAI VÀ PHÁT TRIỂN SẢN PHẨM 66
4.1 Đăng ký tài khoản Google và khởi tạo Project cùng với Cluster 66
4.2 Cài đặt docker, gcloud sdk và kubectl 71
4.3 Dựng project PackNGo Core API và triển khai lên cluster đã tạo 72
4.4 Tích hợp Gitlab CI/CD 77
4.5 Thực hiện việc trigger CI/CD khi push code 82
Chương 5 TỔNG KẾT 85
Trang 195.1 Đánh giá 85
5.1.1 Thuận lợi: 85
5.1.2 Khó khăn: 85
5.2 Thành quả đạt được 85
5.3 Những điều còn tồn tại 85
5.4 Hướng phát triển 86
TÀI LIỆU THAM KHẢO 87
Trang 20DANH MỤC HÌNH VẼ
Hình 1.1: Hình thức du lịch phượt đang trở nên ngày càng phổ biến trong giới trẻ 2
Hình 2.1: So sánh giữa kiến trúc Virtual Machine và Containerlization/Docker 5
Hình 2.2: Mô hình máy chủ ảo Virtual Machines 7
Hình 2.3: Mô hình máy ảo Container 8
Hình 2.4: Hệ thống file cắt lớp Container 9
Hình 2.5: Các thành phần chính của Kubernetes 10
Hình 2.6: Các khái niệm trong Kubernetes 12
Hình 2.7: Quy trình CI/CD trong phát triển sản phẩm CNTT 13
Hình 2.8: Gitlab CI/CD 15
Hình 2.9: Quy trình thực hiện CI/CD trên Gitlab CI/CD 16
Hình 2.10: Công nghệ NodeJS 17
Hình 2.11: Framework Express 18
Hình 2.12: Native App và Hybrid App 19
Hình 2.13: Công nghệ React Native 20
Hình 2.14: Hệ quản trị cơ sở dữ liệu PostgreSQL 21
Hình 3.1: Sơ đồ kiến trúc hệ thống 24
Hình 3.2: Sơ đồ triển khai của hệ thống 25
Hình 3.3: Sơ đồ Use-case của hệ thống 26
Hình 3.4: Sơ đồ lớp của hệ thống 27
Hình 3.5: Sơ đồ tuần tự chức năng Đăng nhập 28
Hình 3.6: Sơ đồ tuần tự chức năng Đăng ký 29
Hình 3.7: Sơ đồ tuần tự chức năng Upload hình ảnh 30
Hình 3.8: Sơ đồ tuần tự chức năng Chỉnh sửa thông tin cá nhân 31
Hình 3.9: Sơ đồ tuần tự chức năng Đổi mật khẩu 32
Hình 3.10: Sơ đồ tuần tự chức năng Tạo chuyến đi mới 33
Hình 3.11: Sơ đồ tuần tự chức năng Đánh dấu địa điểm 34
Hình 3.12: Sơ đồ tuần tự chức năng Cập nhật thông tin chuyến đi 35
Trang 21Hình 3.14: Sơ đồ tuần tự chức năng Theo dõi vị trí thành viên trong đoàn 37
Hình 3.15: Sơ đồ tuần tự chức năng Cập nhật vị trí hiện tại 38
Hình 3.16: Sơ đồ tuần tự chức năng Viết review sau chuyến đi 39
Hình 3.17: Màn hình Đăng nhập 40
Hình 3.18: Màn hình Đăng ký 42
Hình 3.19: Màn hình Quản lý thông tin cá nhân 44
Hình 3.20: Màn hình Điều chỉnh thông tin cá nhân 45
Hình 3.21: Màn hình Thay đổi mật khẩu 46
Hình 3.22: Màn hình Danh sách bài viết 48
Hình 3.23: Màn hình Danh sách bài viết với action button 49
Hình 3.24: Màn hình Tạo mới chuyến đi 51
Hình 3.25: Màn hình Tìm địa điểm 52
Hình 3.26: Màn hình Gắn tọa độ điểm di chuyển 53
Hình 3.27: Màn hình Chọn ngày cho chuyến đi 54
Hình 3.28: Màn hình Chọn giờ cho chuyến đi 55
Hình 3.29: Màn hình Danh sách chuyến đi 57
Hình 3.30: Màn hình Chỉnh sửa thông tin chuyến đi 59
Hình 3.31: Màn hình Chỉnh sửa chuyến đi với popup xác nhận xóa chuyến đi 60
Hình 3.32: Màn hình Xem vị trí thành viên trong chuyến đi 62
Hình 3.33: Màn hình Xem vị trí thành viên trong chuyến đi 64
Hình 4.1: Form tạo tài khoản Google 66
Hình 4.2: Tạo Project mới 67
Hình 4.3: Điền thông tin Project mới 68
Hình 4.4: Tìm kiếm product Kubernetes Engine 68
Hình 4.5: Enable Kubernetes Engine API 69
Hình 4.6: Tạo cluster mới 69
Hình 4.7: Form tạo cluster mới 70
Hình 4.8: Danh sách các cluster đã tạo 70
Hình 4.9: Cài đặt gcloud sdk 71
Trang 22Hình 4.10: Cài đặt docker 71Hình 4.11: Google Cloud Project ID 72Hình 4.12: Dockerfile để build image 73Hình 4.13: Quá trình build docker image 74Hình 4.14: Dựng container lên và kiểm tra tình trạng của container đã dựng 75Hình 4.15: Push image lên Google Cloud Registry 75Hình 4.16: Google Cloud Registry 75Hình 4.17: File deployment.yaml 76Hình 4.18: Kiểm tra tình trạng của cluster bằng k9s 77Hình 4.19: Thêm Kubernetes cluster vào project gitlab 77Hình 4.20: Chọn Thêm cluster 77Hình 4.21: Form tích hợp project với Kubernetes cluster đã có sẵn 78Hình 4.22: Cấu hình gitlab CI/CD 79Hình 4.23: Bật tính năng Auto DevOps để thực hiện CI/CD 79Hình 4.24: Cấu hình cho Gitlab Runner 80Hình 4.25: Cài đặt Gitlab Runner 81Hình 4.26: Kiểm tra tình trạng Gitlab Runner trên cluster 81Hình 4.27: File gitlab-ci.yml 82Hình 4.28: File gitlab-ci.yml 83Hình 4.29: Gitlab pipeline 83
Trang 23DANH MỤC TỪ VIẾT TẮT
CSDL Cơ sở dữ liệu Cơ sở dữ liệu cho ứng dụng HTTP HyperText Transfer Protocol Giao thức truyền siêu văn bản JSON JavaScript Object Notation Định dạng trao đổi dữ liệu
UI User Interface Giao diện người dùng SDK Software Development Kit Bộ sưu tập các công cụ phát
triển phần mềm API Application Programming
OS Operating System Hệ điều hành
Trang 24Chương 1 TỔNG QUAN ĐỀ TÀI 1.1 Phát biểu đề tài nghiên cứu
Việt Nam đang là một trong những nước có ngành dịch vụ đang trên đà phát triển mạnh, đặc biệt ngành dịch vụ đang đóng góp ngày càng cao trong tỉ trọng GPD của cả nước và được kỳ vọng là sẽ chiếm đến 43% GPD vào năm 2025 Lượng khách du lịch nội địa và quốc tế đổ về Việt Nam là cực kì cao với con số thống kê cho năm 2018 là 15,5 triệu lượt người đối với du khách quốc tế Song song với đó, xu hướng du lịch ngẫu hứng, du lịch phượt đang được các bạn trẻ cực
kì ưa chuộng vì tính tự do về thời gian và địa điểm du lịch cũng như tính linh hoạt khi có thể tự do lựa chọn phương tiện như xe máy, xe đạp hay xe hơi, cũng như có thể tổ chức đi cá nhân hoặc đi thành các nhóm nhỏ và lớn khác nhau Chính vì thế
mà du lịch đang là một thị trường vô cùng tiềm năng để khai thác
Với nhiều loại hình du lịch khác nhau mà nhu cầu của khách du lịch cũng càng ngày càng trở nên đa dạng hơn trước rất nhiều, đi kèm theo đó là sự yêu cầu ngày càng cao về tính tiện dụng và sự ứng dụng của công nghệ vào trong các sản phẩm dịch vụ cho du lịch Minh chứng cho điều này là ngày càng có nhiều các sản phẩm công nghệ đáp ứng cho các nhu cầu khác nhau của du lịch như đặt vé xe, lên lịch trình cho chuyến du lịch, đặt phòng, thuê hướng dẫn viên, review đặc sản,… Có thể kể tên một số các ứng dụng du lịch đang rất thịnh hành trên thị trường ngày nay như VeXeRe, Booking, Agoda, Trivago, TripAdvisor, diadiemdulich
Đa số các sản phẩm kể trên đều đánh vào các nhu cầu về đặt phòng, giới thiệu địa điểm du lịch hay đặt vé xe khách, khá ít sản phẩm phục vụ cho vấn đề chia sẻ lịch trình và hẹn nhóm đi du lịch cùng nhau
Trang 252
Hình 1.1: Hình thức du lịch phượt đang trở nên ngày càng phổ biến trong giới trẻ
1.2 Mục tiêu và phạm vi của đề tài
1.2.1 Mục tiêu
- Mục tiêu cuối cùng của đề tài: phát triển được một hệ thống hỗ trợ tư vấn
và chia sẻ thông tin du lịch cùng nhau bằng kiến trúc microservices
- Tạo ra ứng dụng với giao diện thân thiện và dễ sử dụng, bao gồm các tính năng cần thiết phục vụ cho nhu cầu tạo, quản lý và chia sẻ thông tin cho nhóm cùng du lịch, theo dõi realtime vị trí của các thành viên trong đoàn khi di chuyển để liên lạc và khắc phục nhanh sự cố nếu có, tìm kiếm địa điểm cung cấp các tiện ích trong quá trình du lịch: quán ăn, tiệm sửa xe, nhà trọ, …
- Tích hợp với các ứng dụng mạng xã hội tiện cho việc chia sẻ và mời gọi bạn bè cùng tham gia du lịch
Trang 261.2.2 Phạm vi
- Đối tượng nghiên cứu: Công nghệ phát triển và triển khai hệ thống microservices, đồng thời nghiên cứu và phát triển công nghệ hybrid mobile application bằng React Native
- Thời gian nghiên cứu: Dữ liệu thu thập và các định hướng, giải pháp được
đề xuất từ thời gian nhận đề tài tới lúc hoàn thành ứng dụng
- Giới hạn nghiên cứu: Phạm vi nghiên cứu ở mức tìm hiểu và phát triển hệ thống microservices và ứng dụng trên di động
1.5 Phương pháp nghiên cứu và nguồn số liệu
1.5.1 Phương pháp nghiên cứu
Tập trung tìm hiểu lý thuyết về các công nghệ để xây dựng hệ thống microservices và ứng dụng di động bằng công nghệ React Native, các kỹ thuật liên quan đến việc triển khai và quản lý hệ thống lên Google Cloud Kubernetes, đồng thời áp dụng quy trình tự động triển khai (Auto DevOps) của Gitlab CI/CD Nghiên cứu, so sánh các phương pháp thực hiện và chọn ra phương pháp phù hợp Tham khảo các ứng dụng tương tự đã có mặt trên thị trường để chọn ra cấu trúc xây dựng ứng dụng phù hợp
Trang 274
1.5.2 Nguồn dữ liệu
Nguồn dữ liệu từ của luận văn được thu thập từ các nguồn đáng tin cậy (các trang web chính thức về du lịch của chính phủ: https://vietnamtourism.gov.vn/)
1.6 Điểm mới của luận văn
Kết hợp giữa công nghệ quản lý mã nguồn (Git/Gitlab), công nghệ tự động triển khai dự án (Gitlab CI/CD) và công nghệ quản lý các service theo hướng microservices (Google Cloud Kubernetes) để tạo ra một hệ thống hoàn chỉnh, có khả năng tự phục hồi khi gặp sự cố, giúp tiết kiệm thời gian trong quá trình phát triển hệ thống
1.7 Kết cấu luận văn
Ngoài phần kết luận, mục lục, danh mục các chữ viết tắt, danh mục các bảng, phụ lục và tài liệu tham khảo; luận văn được bố cục theo 5 chương: Chương 1: Tổng quan đề tài
Chương 2: Kiến thức nền tảng
Chương 3: Phân tích, Thiết kế
Chương 4: Triển khai và phát triển sản phẩm
Chương 5: Tổng kết
Trang 28Chương 2 KIẾN THỨC NỀN TẢNG 2.1 Công nghệ ảo hóa Containerlization và Docker:
2.1.1 Định nghĩa
Containerlization là một công nghệ cho phép các lập trình viên phát triển, vận chuyển và triển khai các ứng dụng phân tán mà không bị ảnh hưởng bởi sự khác nhau về kiến trúc hạ tầng giữa các môi trường triển khai khác nhau[1] Nhờ vậy, lập trình viên giảm thiểu được đáng kể thời gian và công sức cho việc chỉnh sửa cấu hình hay tránh gặp các lỗi liên quan đến việc triển khai ứng dụng tại các môi trường khác nhau
Containerlization đưa ra một giải pháp mới cho vấn đề ảo hóa, thay vì tạo ra các máy ảo con chạy độc lập (Virtual Machine), các ứng dụng sẽ được đóng gói lại thành các Container riêng lẻ Các Container này chạy chung trên nhân hệ điều hành, chia sẻ chung tài nguyên của máy mẹ, do đó hoạt động nhẹ và nhanh hơn các máy ảo dạng Virtual Machine
Docker là một trong những giải pháp cho công nghệ containerlization, được viết bằng Go-lang, một ngôn ngữ lập trình hệ thống do Google phát triển và phát hành
Hình 2.1: So sánh giữa kiến trúc Virtual Machine và Containerlization/Docker
Trang 296
2.1.2 Các thành phần chính
Các thành phần chính của Docker bao gồm:
- Docker Engine: là thành phần chính của Docker, như một công cụ để đóng gói ứng dụng
- Docker Hub: là dịch vụ cloud để chia sẻ ứng dụng, có thể thao tác pull/push với các docker image
2.1.3 Một số khái niệm
Một số khái niệm phổ biến về Docker:
- Docker image: là một “read-only template” Chẳng hạn, một image chứa
hệ điều hành Ubuntu đã cài đặt sẵn Apache và ứng dụng web
- Docker registry: là kho chứa image Người dùng có thể tạo ra các image của mình và tải lên đây hoặc tải về các image được chia sẻ
- Docker container: hoạt động giống như một thư mục (directory), chứa tất
cả những thứ cần thiết để một ứng dụng có thể chạy được Mỗi một docker container được tạo ra từ một docker image Các thao tác với một container: chạy, bật, dừng, di chuyển, và xóa
- Dockerfile: là một file chứa tập hợp các lệnh để Docker có thể đọc và thực hiện để đóng gói một image theo yêu cầu người dùng
- Orchestration: là các công cụ, dịch vụ dùng để điều phối và quản lý nhiều containers sao cho chúng làm việc hiệu quả nhất[2]
Trang 302.1.4 So sánh Docker với Virtual Machine
Hình 2.2: Mô hình máy chủ ảo Virtual Machines
Khi mô hình triển khai bằng các máy ảo (Virtual Machine) ra đời, tài nguyên của máy tính được tận dụng một cách tốt hơn so với công nghệ triển khai theo phương pháp truyền thống (1 máy chủ vật lý + 1 hệ điều hành + 1 application) Tuy nhiên, việc ảo hóa này lại nảy sinh vấn đề mới:
- Ngốn tài nguyên: khi chạy 1 máy ảo, nó sẽ luôn chiếm 1 phần tài nguyên
cố định Vd: máy chủ có 512GB SSD, 16GB RAM Tạo ra 4 máy ảo Linux, mỗi máy cấp 64GB SSD và 2GB RAM Như vậy, sẽ mất 256 GB SSD để chứa 4 máy ảo, và khi chạy cùng 4 máy ảo lên cùng lúc, chúng sẽ chiếm 8GB RAM Mặc dù chỉ chạy lên để không đó thôi, chưa dùng gì cả nhưng
nó vẫn chiếm từng đó
- Tốn thời gian thực thi: thời gian khởi động, shutdown của các máy ảo sẽ lâu, thường là hàng phút
Trang 31Hình 2.3: Mô hình máy ảo Container
Với công nghệ này, trên một máy chủ, ta sẽ sinh ra được nhiều máy con (giống với ảo hóa), nhưng điều đặc biệt là các máy con (Guess OS) này đều dùng chung phần nhân của máy mẹ (host OS) và chia sẻ với nhau tài nguyên của máy mẹ (RAM chẳng ghạn) Như vậy việc tận dụng tài nguyên sẽ được tối ưu hơn
Ngoài ra, việc sử dụng hệ thống file cắt lớp (layer file system) sẽ khiến việc tối ưu tài nguyên hiệu quả hơn
Trang 32Hình 2.4: Hệ thống file cắt lớp Container
Cụ thể, mỗi máy con (container) mới, nó sẽ được xây dựng dựa trên 1 file ảnh (image) dạng chỉ đọc (read-only) Trong mỗi máy con sẽ có thêm 1 lớp bọc có-thể-ghi-được (writabe-layer), các thay đổi trong máy con sẽ được ghi lên đây Như vậy, từ 1 image ban đầu, ta có thể tạo nhiều máy con mà chỉ tốn rất ít dung lượng
ổ đĩa
- Ưu điểm: nhanh, nhẹ, có thể chia sẻ dễ dàng qua DockerHub
- Nhược điểm : mới, cập nhật thay đổi thường xuyên
2.2 Công nghệ điều phối container và Kubernetes
2.2.1 Định nghĩa
Các container là một cách tốt để đóng gói và triển khai các ứng dụng Trong môi trường production, chúng ta cần quản lý các container chạy các ứng dụng và
Trang 3310
tắt đi, một container khác cần phải khởi động lên Điều này sẽ dễ dàng hơn nếu được xử lý bởi một hệ thống Và giải pháp cho vấn đề này chính là công nghệ điều phối container (Container Orchestration) mà trong đó, Kubernetes là một công cụ thông dụng nhất và đã được sử dụng cho nhiều hệ thống ở các công ty lớn: Google, Slack, Shopify, Booking.com
Kubernetes cung cấp một framework để chạy các hệ thống microservices một cách mạnh mẽ[3] Nó đảm nhiệm việc nhân rộng và chuyển đổi dự phòng cho ứng dụng hệ thống, cung cấp các mẫu cho việc triển khai (Deployment), dịch vụ (Service),… Khi người dùng định nghĩa những yêu cầu mong muốn đối với hệ thống của mình, Kubernetes sẽ tự động thực hiện triển khai theo những yêu cầu đó
và cung cấp cho người dùng các công cụ cho việc theo dõi trạng thái của hệ thống, cũng như sẽ tự khởi động lại các container bị lỗi, thay thế, xóa các container không phản hồi lại cấu hình health check đã được định nghĩa
2.2.2 Các thành phần chính:
Hình 2.5: Các thành phần chính của Kubernetes
Kubernetes chia hệ thống ra làm 3 thành phần chính là Master, Node và các Addons, đảm nhiệm vai trò riêng biệt:
Trang 34Kubernetes Master được xem như là trái tim của Kubernetes, được xây dựng
để quản lý tất cả các hoạt động, thao tác với các container trong cluster Nó bao gồm API Server (kube-apiserver), etcd, Scheduler (kube-scheduler), Controller Manager (kube-controller-manager) và Cloud Controller Manager (cloud-
controller-manager):
- API Server: cung cấp các RESTful APIs cho các thành phần khác trong Kubernetes Master API Server lưu thông tin của các đối tượng trong Kubenetes vào etcd
- etcd: là một hệ thống phân tán, mã nguồn mở, dùng để lưu trữ các giá trị key-value Kubernetes dùng etcd để lưu, cập nhập và nhân bản các data của nó
- Scheduler: có nhiệm vụ là xác định node nào trong cluster có thể sử dụng
để chạy các pods
- Controller Manager: là tập hợp các vòng điều khiển quan sát các sự thay đổi từ API Server để đảm bảo rằng cluster luôn ở trạng thái mà nó mong muốn
- Cloud Controller Manager: được sử dụng để tương tác với các Cloud Provider (Google Cloud Kubernetes, AWS, …)
Worker Node được xây dựng để chạy trên tất cả các node của Kubenetes cluster, chịu trách nhiệm quản lý và báo cáo tình trạng của các Pods cho
Kubernetes Master, bao gồm các thành phần:
- kubelet: chịu trách nhiệm quản lý và báo cáo các hoạt động của node về API Server của Kubernetes Master kubelet sẽ chạy các container sử dụng container runtime như Docker Nó sẽ không quản lý các container không được tạo bởi Kubernetes
- kube-proxy: đảm nhiệm vai trò routing giữa service và các pods
Thành phần cuối cùng của Kubernetes là các Addons, gồm các công cụ hỗ trợ cho việc quản lý Kubernetes dễ dàng và tiện lợi hơn: DNS Server, Web UI
Trang 3512
(Dashboard) hỗ trợ quản lý Kubernetes cluster bằng giao diện, Container
Resource Monitoring (record các thông tin về hệ thống vào database và cho phép chúng ta phân tích các thông tin đó sử dụng UI),
2.2.3 Một số khái niệm
Hình 2.6: Các khái niệm trong Kubernetes
- Cluster: một cụm các máy chủ đảm nhiệm vai trò là một Worker Node và được quản lý bởi Master Node
- Cluster Node: là máy chủ (vật lý hoặc máy ảo) dùng làm Worker Node
Trang 36- Pods: là đơn vị quản lý nhỏ nhất trong cluster, đại diện cho 1 process đang hoạt động trong 1 cluster, có chức năng quản lý hoạt động của container 1 Pod có thể quản lý 1 hoặc nhiều container bên trong nó
- Deployment: là một “kịch bản” thể hiện rõ các yêu cầu cho việc triển khai ứng dụng trên cluster
- Service: trỏ tới 1 tập hợp các pod thông qua các label để tạo thành 1 nhóm service để cho môi trường bên ngoài cluster có thể truy cập tới
2.3 Gitlab CI/CD
2.3.1 Định nghĩa
Hình 2.7: Quy trình CI/CD trong phát triển sản phẩm CNTT
Continuous Integration (Tích hợp liên tục - CI) là quá trình cho phép lập trình viên tích hợp công việc vào một branch được chia sẻ thường xuyên, tăng cường sự hợp tác khi phát triển Tích hợp thường xuyên giúp kiểm định commit, giúp lập trình viên sớm phát hiện các lỗi chức năng có thể xảy ra trong quá trình làm việc thông qua việc chạy các test suite khi phát hiện có những thay đổi mới, tăng tính
an toàn và tính lưu động cho việc phát triển sản phẩm
Continuous Delivery (Phân phối liên tục – CD) là quá trình diễn ra khi có sự
Trang 3714
trường phát triển, thực hiện việc chuẩn bị release môi trường production Thông thường thì trước giai đoạn này sẽ có quy trình Continuous Integration (CI)
2.3.2 Ưu điểm của việc thực hiện CI/CD trong dự án
- Tiết kiệm chi phí: công việc test sẽ được thực thi bởi CI, và khi code đã pass qua lần test đó sẽ được triển khai lên môi trường production một cách
tự động, có nghĩa là đã loại bỏ được việc tốn chi phí nhân công và chi phí thời gian để xử lý công việc đó
- Nâng cao tốc độ triển khai: chi phí rút giảm được qua việc làm đó sẽ được đầu tư vào việc phát triển Vì vậy, giúp cho việc nâng cao tốc độ triển khai,
và cũng sẽ liên tục triển khai thêm các việc update mới nữa
- Thay đổi mã nguồn nhỏ hơn: do những thay đổi về code liên tục được phát hiện, kiểm tra và phân phối ra môi trường kiểm thử nên số lượng mã nguồn thay đổi sẽ được chia nhỏ ra
- Cách ly lỗi tốt hơn và nhanh hơn: mã nguồn thay đổi được chia nhỏ ra dẫn đến việc phát hiện được sớm các sai sót trong quá trình làm việc và nhanh chóng sửa chữa
- Không bao giờ gửi mã nguồn bị hỏng: quá trình phân phối được diễn ra sau khi đã hoàn tất quá trình kiểm thử và được làm hoàn toàn bằng máy, cho nên mọi sai sót xảy ra đều sẽ không được thông qua, ngăn chặn việc phân phối mã nguồn chứa lỗi
- Bước 2: Trừ owner và maintainer ra, các lập trình viên khác phải push code tính năng lên branch của mình được checkout từ develop và sau khi hoàn tất
Trang 38thì tự merge tính năng cần test vào branch uat và tạo merge request vào branch develop
- Bước 3: Hệ thống tự động thực hiện test mã nguồn trên branch uat, nếu thành công thì sẽ triển khai tự động mã nguồn lên server uat Nếu thất bại thì sẽ thông báo lỗi và ngừng quá trình triển khai tại đó
- Bước 4: Tester vào hệ thống uat để kiểm thử và xác nhận thỏa điều kiện để triển khai lên môi trường production
- Bước 5: Owner hoặc Maintainer sẽ xem qua merge request Nếu không gặp vấn đề thì sẽ chấp nhận cho merge vào branch develop
- Bước 6: Khi tới thời gian phát hành tính năng mới, Owner merge từ develop vào master
- Bước 7: Hệ thống tự động thực hiện test mã nguồn trên branch master, nếu thành công thì sẽ triển khai tự động lên môi trường production
- Bước 8: Tester vào hệ thống production để kiểm thử và xác nhận mọi thứ thỏa điều kiện Nếu không, Owner có thể nhấn nút deploy phiên bản trước đó để rollback hệ thống về trạng thái stable trước đó
- Bước 9: Quay lại bước 2 với việc phát triển tính năng mới, đồng thời lắng nghe phản hồi từ phía khách hàng về tính năng hiện tại
2.3.4 Gitlab CI/CD
Hình 2.8: Gitlab CI/CD
Hiện nay, có rất nhiều công cụ CI/CD có mặt trên thị trường Thông thường, các hệ thống quản lý mã nguồn không kèm theo cơ chế CI/CD Nếu lập trình viên muốn triển khai thì buộc phải liên kết đến repository, phân quyền cho hệ thống đó
Trang 3916
Từ khi Gitlab ra mắt tính năng Gitlab CI/CD, việc áp dụng CI/CD vào quy
trình phát triển sản phẩm càng dễ dàng hơn bao giờ hết Mã nguồn để ở Gitlab, rồi
cài đặt CI/CD để test và deploy mã nguồn tự động Tất cả những công đoạn CI/CD
trên đều sẽ được thực hiện bởi Gitlab Runner
2.3.5 Gitlab Runner
Hình 2.9: Quy trình thực hiện CI/CD trên Gitlab CI/CD
Gitlab Runner là thành phần cực kỳ quan trọng trong workflow Gitlab CI Nếu
không có Runner thì sẽ không có lệnh test, deploy nào được thực thi Runner có
nhiều loại, phân biệt dựa vào cái gọi là executor Khi khởi tạo runner, người dùng
sẽ phải chọn nó là loại executor nào, và nó sẽ quyết định môi trường thực thi các
câu lệnh trong file config trong project (.gitlab-ci.yml)
Trong phạm vi khóa luận này, nhóm sử dụng Gitlab Runner với executor là
Kubernetes để chạy quy trình CI/CD lên trên cluster trên Kubernetes Kubernetes
executor khi dùng với Gitlab CI/CD sẽ kết nối tới Kubernetes API trong cluster để
khởi tạo pod cho mỗi Gitlab CI/CD job[4]
Trang 40Trước đây, khi có một yêu cầu tới phía máy chủ sẽ sinh ra một thread dẫn tới khi có quá nhiều yêu cầu thì máy chủ sẽ bị chậm chạp và việc xử lý thread cũng gây khó khăn cho lập trình viên cũng như khó tiếp cận từ lúc đầu
Vì thế, NodeJS dựa trên sự kiện và xử lý theo mô hình non-blocking I/O để tạo ra các ứng dụng nhẹ và hiệu quả cho các ứng dụng về dữ liệu thời gian thực chạy trên các thiết bị phân tán Có thể hiểu rằng, với mỗi yêu cầu tới phía NodeJS thì sẽ chẳng bao giờ gặp trường hợp bị khóa tài nguyên (lock up) như việc xử lý thread truyền thống Ngoài ra, xử lý sự kiện cũng rất dễ tiếp cận cho lập trình viên mới học, đây cũng là lý do chính mà NodeJS được phát triển mạnh mẽ trong những năm gần đây NodeJS cung cấp cho chúng ta các module JavaScript đa dạng, có thể đơn giản hóa sự phát triển của các ứng dụng web sử dụng NodeJS với các phần