RPC เป็นตัวย่อของการโทรขั้นตอนระยะไกล มีการใช้กันอย่างแพร่หลายในแอปพลิเคชันกระจายขนาดใหญ่ ฟังก์ชั่นของมันคือการช่วยแยกแนวตั้งของระบบและทำให้ระบบขยายง่ายขึ้น มีเฟรมเวิร์ก RPC มากมายใน Java แต่ละอันมีลักษณะของตัวเองและสิ่งที่ใช้กันอย่างแพร่หลาย ได้แก่ RMI, Hessian, Dubbo และอื่น ๆ คุณลักษณะอื่นของ RPC คือมันสามารถข้ามภาษาได้ บทความนี้ใช้ RPC ในภาษา Java เป็นตัวอย่างเท่านั้น
มีแผนภาพความสัมพันธ์เชิงตรรกะสำหรับ RPC โดยใช้ RMI เป็นตัวอย่าง:
โครงสร้างเฟรมเวิร์กอื่น ๆ มีความคล้ายคลึงกันความแตกต่างอยู่ในวิธีการทำให้เป็นอนุกรมของวัตถุโปรโตคอลการสื่อสารสำหรับการส่งวัตถุการจัดการของศูนย์การลงทะเบียนและการออกแบบการล้มเหลว (โดยใช้ Zookeeper)
ไคลเอนต์และเซิร์ฟเวอร์สามารถทำงานใน JVM ที่แตกต่างกัน ไคลเอนต์ต้องแนะนำอินเทอร์เฟซเท่านั้น การใช้งานอินเทอร์เฟซและข้อมูลที่จำเป็นในการรันไทม์นั้นอยู่ในฝั่งเซิร์ฟเวอร์ เทคโนโลยีการพึ่งพาหลักของ RPC คือการทำให้เป็นอนุกรม, deserialization และโปรโตคอลการส่งผ่าน Java สอดคล้องกับการทำให้เป็นอนุกรม, deserialization และการส่งผ่านของวัตถุและการส่งข้อมูลอนุกรม RMI serialization และ deserialization เป็นเจ้าของโดย Java การทำให้เป็นอนุกรมและ deserialization ใน Hessian เป็นส่วนตัวโปรโตคอลการส่งผ่านคือ HTTP และการทำให้เป็นอนุกรม Dubbo สามารถเลือกได้หลายวิธี โดยทั่วไปจะใช้โปรโตคอลการทำให้เป็นอนุกรมของ Hessian และการส่งผ่านเป็นโปรโตคอล TCP ซึ่งใช้ NETTY NETTINGE การทำงานของ NIO Framework ที่มีประสิทธิภาพสูง เกี่ยวกับการทำให้เป็นอนุกรมฉันรู้บางสิ่งบางอย่างเช่น probuffer ของ Google, JBoss Marshalling, Apache Thrift ฯลฯ ฉันเขียนโพสต์บล็อกแนะนำ Probuffer มาก่อน
1. RMI (โทรระยะไกล)
เครื่องมือเรียกใช้วิธีระยะไกลที่มาพร้อมกับ Java มีข้อ จำกัด บางประการ ท้ายที่สุดมันคือการออกแบบภาษา Java ในตอนแรก ต่อมาหลักการของเฟรมเวิร์กมากมายขึ้นอยู่กับ RMI การใช้ RMI มีดังนี้:
อินเทอร์เฟซภายนอก
Iservice อินเทอร์เฟซสาธารณะขยายระยะไกล {String String QueryName (String No) พ่น RemoteException; } </span>การใช้บริการ
นำเข้า java.rmi.remoteexception; นำเข้า java.rmi.server.unicastremoteObject; // การใช้งานการใช้บริการระดับสาธารณะ ServiceImpl ขยาย unicastRemoteObject ดำเนินการ iservice {/ ***/ ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 682805210518738166L; / ** * @throws RemoteException */ การป้องกัน ServiceImpl () พ่น RemoteException {super (); } / * (ไม่ใช่ javadoc) * @see com.suning.ebuy.wd.web.iservice#queryName (java.lang.string) * / @Override สตริงสาธารณะ queryName (สตริง) โยน remoteexception return string.valueof (System.currentTimeMillis ()); -ไคลเอนต์ RMI
นำเข้า java.rmi.remoteexception; นำเข้า java.rmi.registry.locateregistry; นำเข้า java.rmi.registry.registry; // เซิร์ฟเวอร์ระดับสาธารณะเซิร์ฟเวอร์เซิร์ฟเวอร์ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ลงทะเบียนรีจิสทรีรีจิสทรีตัวจัดการรีจิสตรี = null; ลอง {// สร้างรีจิสทรีบริการ = locateregistry.createRegistry (8088); } catch (RemoteException E) {} ลอง {// สร้าง Service ServiceImpl Server = new ServiceImpl (); // ผูกมัดบริการและตั้งชื่อ Registry.rebind ("Vince", เซิร์ฟเวอร์); System.out.println ("Bind Server"); } catch (remoteException e) {}}}ตัวจัดการการลงทะเบียนบริการถูกเขียนในเซิร์ฟเวอร์และแน่นอนว่ามันยังสามารถแยกเป็นบริการแยกต่างหาก ในบางเฟรมเวิร์กอื่น ๆ ผู้ดูแลสัตว์มักจะใช้เป็นบทบาทการจัดการการลงทะเบียน
2. Hessian (การโทรแบบระยะไกลตาม HTTP)
จากการส่งผ่านโปรโตคอล HTTP ประสิทธิภาพไม่สมบูรณ์แบบ การโอนสมดุลและการถ่ายโอนความล้มเหลวขึ้นอยู่กับตัวโหลดบาลานซ์ของแอปพลิเคชัน การใช้งานของ Hessian นั้นคล้ายกับ RMI ความแตกต่างคือมันลดบทบาทของรีจิสทรี ผ่านการเรียกที่อยู่ที่แสดง HessianProxyFactory ใช้วัตถุพร็อกซีตามที่อยู่ที่กำหนดค่า นอกจากนี้ยังมีการแนะนำแพ็คเกจ Jar ของ Hessian
3. Dubbo (Open Open Open RPC Framework ที่ใช้ TCP บน Taobao)
เฟรมเวิร์ก RPC ที่มีประสิทธิภาพสูงตาม NIO Framework Netty เป็นโอเพนซอร์สโดยอาลีบาบา หลักการโดยรวมมีดังนี้:
ก่อนที่จะทำความเข้าใจกับ Dubbo คุณต้องมีความเข้าใจในเชิงลึกเกี่ยวกับผู้ดูแลสัตว์ หลังจากทำความเข้าใจกับ Zookeeper แล้ว Dubbo จะไม่มีความลับ
Zookeeper เป็นศูนย์การลงทะเบียนของบริการ Dubbo ศูนย์ทะเบียนฐานข้อมูลดั้งเดิมของ Dubbo ไม่ได้ใช้ Zookeeper Zookeeper เป็นกรอบบริการแบบกระจาย เป็นที่เก็บข้อมูลสำหรับบริการไดเรกทอรีประเภทต้นไม้และสามารถจัดการข้อมูลในกลุ่ม สามารถใช้เป็นศูนย์ลงทะเบียนสำหรับบริการ Dubbo Dubbo สามารถทำการปรับใช้คลัสเตอร์ด้วย Zookeeper เมื่อผู้ให้บริการมีการหยุดทำงานที่ผิดปกติเช่นไฟดับหรือนอกอากาศอื่น ๆ ศูนย์ลงทะเบียน Zookeeper สามารถลบข้อมูลผู้ให้บริการได้โดยอัตโนมัติ เมื่อผู้ให้บริการรีสตาร์ทจะสามารถกู้คืนข้อมูลการลงทะเบียนและคำขอสมัครสมาชิกโดยอัตโนมัติ
คำอธิบายโดยละเอียดของ Dubbo มีรายละเอียดมากในโอเพนซอร์ส Taobao ในโครงการผลิตหลายโครงการ Dubbo ใช้ในโครงการผลิตหลายโครงการ ในระหว่างกระบวนการฉันยังพบหลายสิ่งหลายอย่างที่ให้ความสนใจโดยเฉพาะอย่างยิ่งการกำหนดค่าจำนวนมากซึ่งไม่ได้ตั้งค่าอย่างเหมาะสมและเป็นการดีที่สุดที่จะปรับแต่งและปรับให้เหมาะสมตาม Dubbo โอเพนซอร์สที่มีอยู่