Giao thức RMI Trong Java Ứng dụng phân tán
Mình thấy trong Java có TCP và UDP sử dụng Server Socket … và Client
Client chỉ việc gửi thông tin lên server cho server xử lí …Server sẽ gửi thông tin kết quả trở về client.
Client chỉ việc hiển thị
Vậy tại sao lại sinh ra RMI .
Lợi ích của RMI lớn như nào.
Mình thấy RMI phải implement rất nhiều thứ… dữ liệu cũng cần Relizerable .
Mong các Pro giải thích cho mình sao lại cần implement , và cách nó hoạt động
ublic class WeatherData implements Serializable;
public interface WeatherService extends Remote;
public class WeatherServiceImpl extends UnicastRemoteObject implements WeatherService;
Các từ khóa : Registry ,lookup ,bind .
ở đây có 1 web nói sơ về vấn đề này, bạn có thể tham khảo:
http://www.blogit.info/2011/11/khai-niem-ve-rmi-trong-java.html
nói chung là nếu k có yêu cầu gì đặc biệt thì k cần thiết phải dùng RMI làm gì cho phức tạp ra
RMI có thể hiểu là tầng cao hơn tầng giao tiếp socket (tất nhiên, nó cũng phải dùng socket để truyền dữ liệu text đi xa ^^)
`1- Vậy tại sao lại sinh ra RMI:
Như tên gọi, RMI là Remote Method Invocation: gọi một method từ xa. Cái này là yêu cầu hoàn toàn chính đáng, vì cũng giống như con người, app nó phải “giao thông” với nhau, chứ “tự sướng” 1 mình thì sẽ … không vui nhiều thứ. Ví dụ, bạn viết app thời tiết, ok, giờ bạn làm thế nào lấy được thời tiết Hà Nội, … chà, tìm 1 cái nhiệt kế, gắn sensor, rồi gửi thông tin về app. … nhiều thứ phải làm phết nếu “tự sướng” kiểu này. Giờ đơn giản hơn, gọi một method của hãng thứ ba chẳng hạn (Yahoo), ai cũng vui, Yahoo quảng bá service, còn mình thì đỡ phải “phát minh ra cái bánh xe”.
`2. Mình thấy RMI phải implement rất nhiều thứ… dữ liệu cũng cần Relizerable .
Object phải được Serializable, vì network nó chỉ truyền các chuỗi text, chứ không thể truyền object trên RAM của máy được. Tưởng tượng như này, bạn có một con bò, làm sao bạn gửi sang Úc được, nếu chỉ được gửi 1kg một ^^ Vậy là bạn phải serialize (bắt nguồn từ từ “series”, từng hàng, nối tiếp nhau), nghĩa là bạn phải tháo chân, cắt đầu, … (nghe hơi dã man nhỉ, thôi tưởng tượng là con bò lắp ghép nhé). Sang phía bên Úc, muốn có lại được con bò này, bạn lại phải ghép lại (Unserialize). Cũng như việc bạn gửi object qua net thôi, phải serialize nó ra thành text, rồi mới truyền đi được. Quá trình này có thể gọi là marshall / unmarshal.
`3. Mong các Pro giải thích cho mình sao lại cần implement , và cách nó hoạt động
Phía client
Stub (đóng vai trò như 1 gateway)
1- Nó sẽ kết nối với server
2- Ghi và truyền (bằng cách serialize) các thông số (parametter) sang remote JVM
3- Đợi server
4- Đọc chuỗi server trả về và unserialize
5- Trả về obj/value cho app gọi.
Phía server
Skeleton (giờ dùng stub protocol, nhưng về cơ chế cũng như vậy)
1- Đọc params từ client gửi lên > rồi unserialize để lấy obj param.
2- Gọi hàm ra thực thi
3- Ghi và truyền kết quả cho stub (sau khi đã serialize)
`4- Các từ khóa : Registry , lookup ,bind
Registry: danh bạ đăng ký các method được phép gọi, chứ không phải thích gì gọi đấy được
Bind: “gắn” dịch vụ với tên nào đó với 1 skeleton cụ thể
Lookup: “tra cứu” các dịch vụ được cung cấp
Ưu / nhược của RMI
Ưu:
Nhược:
Ví dụ:
GET yahoo.api/v2/weather/today -> lấy dữ liệu ngày hôm nay, function là today
GET yahoo.api/v2/weather/weekend -> lấy dữ liệu 3 ngày cuối tuần
PUT yahoo.api/v2/weather/today (cái này thì chắc sensor gọi thôi), và thường đẩy data và body, gọi là payload (tải trọng). Payload có thể là params giống GET (kiểu two_hour=23do&three_hour=24do, nhưng cũng có thể là raw data (23rkjfdsjkdfd34dgd45). Giờ thường dùng dạng raw data (là các text) và dưới dạng JSON format (chứ ít dùng XML. do JSON kích thước nhỏ, dễ hiểu hơn)
Payload:{“today”:{“two_hour”:“23do”, “three_hour”:“24do”}} <- thuần text nhé.
Thanks Hoang for your great answer. I think this is best answer i have seen so far in Vietnamese