SOA (Kiến trúc hướng dịch vụ) là từ được nhắc đến nhiều nhất trong năm qua, được hàng loạt công ty áp dụng và được bình chọn là công nghệ của năm 2006. SOA đang thay đổi cách thức phát triển các phần mềm ứng dụng cỡ lớn cho công ty. Chúng ta hãy cùng xem xét cách phát triển ứng dụng SOA trên nền NET.
1. Thiết kế.
Một ứng dụng hướng đối tượng thông thường gồm 3 lớp: Lớp Presentation đảm nhiệm việc hiển thị dữ liệu, lớp Business bao gồm các đối tượng thực thi các logic của chương trình, và lớp Data thực hiện nhiệm vụ kết nối cơ sở dữ liệu, các thao tác trực tiếp lên cơ sở dữ liệu. Việc tách riêng các lớp giúp cho việc quản lý và mở rộng chương trình được dễ dàng.Một thiết kế theo SOA không khác nhiều với ứng dụng hướng đối tượng, chỉ là sự thêm vào giữa lớp presentation và lớp Business 1 webservice có vai trò làm cầu nối. Lớp presentation không thao tác trực tiếp với lớp business nữa. Thay vì gọi trực tiếp một đối tượng, ứng dụng client gọi 1 dịch vụ.
Trong lập trình hướng đối tượng, lớp presentation có thể gọi nhiều đối tượng ở lớp bussiness, vì thế, mối liên hệ giữa lớp Presentation và lớp bussiness rất phức tạp. Một trong những điểm thay đổi của việc chuyển từ lập trình hướng đối tượng sang SOA là việc giảm thiểu sự liên kết giữa các đối tượng. Thiết kế ứng dụng với SOA giảm thiểu số lần gọi bằng cách đưa ra giao diện dịch vụ. Dịch vụ cung cấp một lớp trung gian làm giảm thiểu nhu cầu trao đổi giữa các lớp.
Vd 1 đoạn mã khi lập trình theo hướng đối tượng
public string OrderBookClient(String isbn)
{
Book b = new book(isbn);
OrderDetail od = new OrderDetail();
od.add(b);
Order o = new Order();
o.add(od);
o.save();
return o.OrderNumber;
}
Đoạn mã trên khi được triển khai SOA
[WebMethod]
public string OrderBook(String isbn)
{
Book b = new book(isbn);
OrderDetail od = new OrderDetail();
od.add(b);
Order o = new Order();
o.add(od);
o.save();
return o.OrderNumber;
}
Và tại ứng dụng client. Lời gọi dịch vụ sẽ được thực hiện 1 cách đơn giản.
public void OrderBookClient(String isbn)
{
OrderService os = new OrderService();
os.OrderBook(isbn);
}
Đây chỉ là 1 ví dụ mang tính tham khảo. Bạn phải thay đổi cách thức lập trình và thiết kế sao cho số lần gọi dịch vụ được hạn chế tối đa nhằm giảm sự hao tốn băng thông. Với các ứng dụng phân tán thông thường, chúng ta đã biết rằng tốt hơn là chuyển 1000 bytes 1 lần hơn là chuyển 1 byte và chuyển 1000 lần. Và điều này cũng vẫn đúng với các ứng dụng SOA.
2. Chuyển data giữa ứng dụng và service.
Việc chuyển data giữa service và application có thể thực hiện bằng nhiều cách. Có thể dùng DataSet, XML hay có thể chuyển cả object v.v… tuỳ thuộc vào thiết kế của bạn. Tuy nhiên, nếu triển khai SOA hoàn toàn trên NET, bạn nên xem xét việc thực hiện bằng DataSet. Có nhiều lý do bạn nên thực hiện bằng DataSet, đó là DataSet dễ dàng serialize (đã được hỗ trợ), khi chuyển data bằng DataSet, không phải tất cả object DataSet đó được chuyển qua SOAP mà chỉ data trong DataSet đó được chuyển. Ngoài ra, DataSet sẽ giúp bạn giảm thiểu việc phải lập trình lại giao diện Service nếu ứng dụng và service của bạn có thay đổi. Điều nên cân nhắc khi sử dụng DataSet là java không hiểu được DataSet nên nếu muốn Service phục vụ cho các ứng dụng viết bằng java, bạn sẽ gặp rất nhiều khó khăn khi phát triển.
Bạn cũng có thể sử dụng object, tuy nhiên, bạn phải chắc chắn rằng cả object có thể serialize. Các hàm và biến private không thể truy cập từ ứng dụng client là một trở ngại lớn khi dùng object.
Ngoài ra, còn một lựa chọn khác là XML. Tuy nhiên, nếu xây dựng ứng dụng SOA trên nền NET, hẳn nhiên là bạn sẽ mất nhiều thời gian cho việc thao tác với XML hơn là dùng DataSet.
3. Quản lý transaction
Có 2 cách để quản lý transaction. Quản lý transaction trong service và quản lý transaction trong ứng dụng client. Việc lựa chọn cách quản lý transaction của bạn tuỳ thuộc vào thiết kế của ứng dụng và dịch vụ.
Để quản lý transaction ở phía ứng dụng client. Các WebMethod phải được thiết lập để có thể hoạt động với Distributed Transaction Coordinator bằng cách thêm một thuộc tính vào method của WebService.
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
Việc quản lý transaction khi đó có thể thực hiện bình thường tại ứng dụng client thông qua TransactionScope.
4. Quản lý exception
Việc quản lý Exception trong ứng dụng SOA nên được quản lý chặt chẽ và hạn chế exception được ném ra từ các dịch vụ. Exception chỉ nên ném trong những trường hợp ngoại lệ có chủ ý và cần thiết phải ném Exception về phía client. Bạn không nên ném exception trong những trường hợp rẽ nhánh thông thường hoặc dùng exception để rẽ nhánh ứng dụng.
Các service khi ném Exception đến ứng dụng qua SOAP sẽ đều được chuyển thành SOAP Exception. Do đó, phía các ứng dụng client khi quản lý Exception cần bắt 3 loại Exception sau.
1. SoapException: Để bắt các exception của service ném ra.
2. WebException: Exception này xuất hiện khi gặp vấn đề về mạng như đường truyền v.v…
3. Exception phía ứng dụng: Các lỗi phát sinh trong ứng dụng client.
Theo kinh nghiệm cá nhân, bạn nên bắt tất cả exception của lớp bussiness và lớp data phía dịch vụ. Trong trường hợp bạn muốn hiển thị lỗi cho end user ở ứng dụng client, từ lớp dịch vụ, bạn ném 1 SOAPException cho ứng dụng client với một thông báo cụ thể cho trường hợp phát sinh lỗi. Nếu không, phía ứng dụng client bạn sẽ rất khó xác định được nguyên nhân chính của lỗi đã xảy ra phía dịch vụ.
5. Tổng kết
Ta có thể thấy phát triển ứng dụng SOA thực ra không khác nhiều so với việc phát triển ứng dụng hướng đối tượng. Chỉ đơn giản là thêm vào giữa lớp Bussiness và lớp Presentation một lớp mới, có tác dụng đưa Business thành 1 dịch vụ và lớp Presentation thành 1 ứng dụng độc lập, ở đó, mọi thao tác đều thông qua các dịch vụ tương ứng. Tuy nhiên, có thể thấy đây không chỉ là một mở rộng của lập trình hướng đối tượng mà là một sự thay đổi lớn trong kiến trúc. Các dịch vụ sẽ quản lý các thao tác với các đối tượng Business, dịch vụ sẽ hoạt động như một hộp đen, che đi những thao tác nghiệp vụ phức tạp.Một khác biệt dễ thấy nhất là lớp nghiệp vụ và lớp presentation sẽ độc lập với nhau.
Một lợi ích là các ứng dụng hướng dịch vụ sẽ gọi các dịch vụ khi cần thiết nên kết nối giữa ứng dụng và dịch vụ không cần “online” thường xuyên. Kết quả là giảm được rất nhiều băng thông và làm tăng tốc ứng dụng. Tuy nhiên, không hẳn SOA lúc nào cũng cần thiết. Đôi khi, việc phát triển ứng dụng theo lối “cổ điển” lại có ích cho bạn hơn. Điều đó tuỳ thuộc vào bạn.
Bài viết dựa theo quan điểm và kinh nghiệm cá nhân nên còn nhiều thiếu sót. Mong nhận được sự góp ý của tất cả các bạn.