Trước khi phát triển mội ứng dụng lớn điều quan tấm lớn nhất ban đầu thường là thiết kế và lựa chọn kiến trúc cho ứng dụng, thiết kế cơ sở dữ liệu. Với cơ sở dữ liệu NoSQL thì gánh nặng về thiết kế cơ sở dữ liệu hầu như đã được trút bỏ. NoSQl là các dạng cơ sở dữ liệu phi cấu trúc giúp ta không còn lo lắng hay phân vân về việc thiết kế sơ đồ (schema) trước cho ứng dụng. Ngoài ra NoSQL cũng có khả năng mở rộng dễ dàng hơn so với cơ sở dữ liệu quan hệ phải cấu hình rất phức tạp khi muốn mở rộng. Phần còn lại chỉ là kiến trúc và lựa chọn các công nghệ để áp dụng. Nếu đưa ra được một kiến trúc tốt sẽ giúp ta tập trung hơn vào phát triển nghiệp vụ cho các ứng dùng khác sau này.
Ngày nay khi xây dựng một ứng dụng web hiện đại, người ta thường nghĩ đến việc cung cấp các dịch vụ Web gọi là RESful bởi tính đơn giản và dễ sử dụng của nó so với SOAP. Những dịch vụ này sẽ được sử dụng bởi ứng dụng client chạy trên trình duyệt hay bất cư một ứng dụng native nào trên các thiết bị di động như Androi hay iOS. Phần giao diện phía client trong ứng dụng này ta sẽ sử dụng HTML 5, CSS (Bootstrap framework [19]) và Javascript framework AngularJS [16]. Trong ứng dụng các dịch vụ Web RESful được cài đặt như các dịch vụ OSGi và nó cũng sử dụng các dịch vụ OSGi khác của ứng dụng ở tầng bên dưới. Hình 3.3 mô tả kiến trúc tổng quan của ứng dụng. Các tầng có màu nhạt: giao diện người dùng HTML5/JavaScript, dịch vụ Web RESTful Web Services và các dịch vụ xử lý nghiệp vụ OSGi Application Components ta cần phải xây dựng. Các tầng còn lại được cung cấp sẵn bởi framework hoặc từ bên thứ ba mà ta chỉ cần sử dụng lại chúng.
Hình 3.3: Kiến trúc và các thành phần công nghệ trong ứng dụng
Tất cả mã nguồn của ứng dụng sẽ được đóng gói trong các thành phần là các OSGi bundle và cung cấp các dịch vụ OSGi. Ngoài ra ta cũng sử dụng một số các thành phần đã được phát triển sẵn và được biên dịch ra dưới dạng các bundle. Như trên hình ta sử dụng lại các thành phần OSGi thường có sẵn trong OSGi container (xem chi tiết bên dưới) như Apache Felix [17]. Các thành phần này cung cấp các dịch vụ OSGi chuẩn như dịch vụ HTTP, dịch vụ Log hay dịch vụ Configuration Admin, dịch vụ Event Admin (chức năng giống như JMS – Java Message Service). Những dịch vụ này gọi là OSGi compendium. Servlet container cũng là một thành phần có thể tìm thấy trong OSGi container. Một số tính năng như cơ chế xác thực, truy cập cơ sở dữ liệu MongoDB [22], chúng ta sử dụng các thành phần được cung cấp bởi dự án Amdatu. Phần chính xử lý các nghiệp vụ mà ta sẽ phát triển trong ứng dụng chính là các thành phần nằm trong khối OSGi application components trên hình 3.3. Phần này bao gồm các thành phần cung cấp các dịch vụ xử lý nghiệp vụ liên quan đến sản phẩm, các thành phần cung cấp các dịch vụ xử lý nghiệp vụ về đơn đặt hàng, khách hàng và một số thành phần khác ta sẽ phân tích rõ hơn ở phần sau.
OSGi container
Để ứng dụng chạy được ta cần triển khai các thành phần của ứng dụng trong một OSGi container hay còn gọi là OSGi runtime. OSGi container là bản cài đặt của đặc tả
OSGi và là lớp chạy bên trên JVM và hiểu các khái niệm như bundle và cài đặt tất cả các quy tắc, đặc đính được định nghĩa trong OSGi core Specification. Một OSGi container cũng có thể được nhúng trong một server giống như Java EE application server hoặc thậm chí được nhúng vào như một phần của ứng dụng.
Trong ứng dụng này ta triển khai lên Apache Felix. Ngoài Apache Felix còn có nhiều bản cài đặt OSGi khác nhưng hầu hết là nguồn đóng. Có một cài đặt nguồn mở khác được sử dụng khá rộng rãi là Eclipse Equinox [20]. Equinox là bản cài đặt OSGi được sử dụng bởi Eclipse IDE. Nhưng nhược điểm của nó là tập trung nhiều để phát triển cho Eclipse nên nhiều tính năng quan trọng khác của OSGi chưa được cài đặt hết.
Amdatu
Amdatu là một dự án nguồn mở được phát triển từ năm 2010 [15]. Nó bao gồm các thành phần OSGi rất hữu ích như dịch vụ Web RESTful, truy cập cơ sở dữ liệu NoSQL, và xử lý xác thực. Sử dụng lại các thành phần hữu ích đã được biên dịch sẵn dưới dạng các bundle được cung cấp bởi Amdatu giúp ta tập trung vào phát triển nghiệp vụ của ứng dụng và tiết kiệm được thời gian cũng như chi phí phát triển.