JAVA中幾種常用的RPC框架介紹

RPC是遠程過程調用的簡稱,廣泛應用在大規模分布式應用中,作用是有助于系統的垂直拆分,使系統更易拓展。Java中的RPC框架比較多,各有特色,廣泛使用的有RMI、Hessian、Dubbo等。RPC還有一個特點就是能夠跨語言,本文只以JAVA語言里的RPC為例。

對于RPC有一個邏輯關系圖,以RMI為例:
在這里插入圖片描述
其他的框架結構也類似,區別在于對象的序列化方法,傳輸對象的通訊協議,以及注冊中心的管理與failover設計(利用zookeeper)。

客戶端和服務端可以運行在不同的JVM中,Client只需要引入接口,接口的實現以及運行時需要的數據都在Server端,RPC的主要依賴技術是序列化、反序列化和傳輸協議,JAVA里對應的就是對象的序列化、反序列化以及序列化后數據的傳輸。RMI的序列化和反序列化是JAVA自帶的,Hessian里的序列化和反序列化是私有的,傳輸協議則是HTTP,Dubbo的序列化可以多種選擇,一般使用Hessian的序列化協議,傳輸則是TCP協議,使用了高性能的NIO框架Netty。對于序列化,我還了解一些,像Google的ProBuffer、JBoss Marshalling和Apache Thrift等

1、RMI(遠程方法調用)

JAVA自帶的遠程方法調用工具,不過有一定的局限性,畢竟是JAVA語言最開始時的設計,后來很多框架的原理都基于RMI,RMI的使用如下:

對外接口

public interface IService extends Remote {  public String queryName(String no) throws RemoteException;  }</span>  

服務實現

import java.rmi.RemoteException;  
import java.rmi.server.UnicastRemoteObject;  **// 服務實現**  
public class ServiceImpl extends UnicastRemoteObject implements IService {  /** */  private static final long serialVersionUID = 682805210518738166L;  /** * @throws RemoteException */  protected ServiceImpl() throws RemoteException {  super();  }  /* (non-Javadoc) * @see com.suning.ebuy.wd.web.IService#queryName(java.lang.String) */  @Override  public String queryName(String no) throws RemoteException {  // 方法的具體實現  System.out.println("hello" + no);  return String.valueOf(System.currentTimeMillis());  }  }  

RMI客戶端

import java.rmi.AccessException;  
import java.rmi.NotBoundException;  
import java.rmi.RemoteException;  
import java.rmi.registry.LocateRegistry;  
import java.rmi.registry.Registry;  // RMI客戶端  
public class Client {  public static void main(String[] args) {  // 注冊管理器  Registry registry = null;  try {  // 獲取服務注冊管理器  registry = LocateRegistry.getRegistry("127.0.0.1",8088);  // 列出所有注冊的服務  String[] list = registry.list();  for(String s : list){  System.out.println(s);  }  } catch (RemoteException e) {  }  try {  // 根據命名獲取服務  IService server = (IService) registry.lookup("vince");  // 調用遠程方法  String result = server.queryName("ha ha ha ha");  // 輸出調用結果  System.out.println("result from remote : " + result);  } catch (AccessException e) {  } catch (RemoteException e) {  } catch (NotBoundException e) {  }  }  
}  

RMI服務端

import java.rmi.RemoteException;  
import java.rmi.registry.LocateRegistry;  
import java.rmi.registry.Registry;  // RMI服務端  
public class Server {  public static void main(String[] args) {  // 注冊管理器  Registry registry = null;  try {  // 創建一個服務注冊管理器  registry = LocateRegistry.createRegistry(8088);  } catch (RemoteException e) {  }  try {  // 創建一個服務  ServiceImpl server = new ServiceImpl();  // 將服務綁定命名  registry.rebind("vince", server);  System.out.println("bind server");  } catch (RemoteException e) {  }  }  
}  

服務注冊管理器寫在了Server里,當然也可以抽出來單獨作為一個服務,在其他一些框架中,往往用Zookeeper充當注冊管理角色。
2、Hessian(基于HTTP的遠程方法調用)

基于HTTP協議傳輸,在性能方面還不夠完美,負載均衡和失效轉移依賴于應用的負載均衡器,Hessian的使用則與RMI類似,區別在于淡化了Registry的角色,通過顯示的地址調用,利用HessianProxyFactory根據配置的地址create一個代理對象,另外還要引入Hessian的Jar包。
在這里插入圖片描述
3、Dubbo(淘寶開源的基于TCP的RPC框架)

基于NIO框架Netty的高性能RPC框架,是阿里巴巴開源的,總體原理如下:
在這里插入圖片描述
在了解Dubbo之前,要先對Zookeeper有深入的理解,當理解了zookeeper后,Dubbo也就了無秘密了。

Zookeeper作為Dubbo服務的注冊中心,Dubbo原先基于數據庫的注冊中心,沒采用Zookeeper,Zookeeper一個分布式的服務框架,是樹型的目錄服務的數據存儲,能做到集群管理數據 ,這里能很好的作為Dubbo服務的注冊中心,Dubbo能與Zookeeper做到集群部署,當提供者出現斷電等異常停機時,Zookeeper注冊中心能自動刪除提供者信息,當提供者重啟時,能自動恢復注冊數據,以及訂閱請求。

Dubbo的詳細說明在淘寶開源里說的非常詳細,在工作中很多生產項目都用了Dubbo,過程中也發現了很多需要注意的地方,尤其是那繁多的配置,設置不當都會讓人煩腦,最好能再基于現有開源的Dubbo再定制優化一下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249747.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249747.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#中的多線程 - 同步基礎

C#中的多線程 - 同步基礎 C#中的多線程 - 同步基礎 1同步概要在第 1 部分&#xff1a;基礎知識中&#xff0c;我們描述了如何在線程上啟動任務、配置線程以及雙向傳遞數據。同時也說明了局部變量對于線程來說是私有的&#xff0c;以及引用是如何在線程之間共享&#xff0c;允許…

WC2019 自閉記

不咕了 Day 1 2019/1/24 辣么快就到冬令營了&#xff0c;還沉迷于被柿子吊打的狀態的菜雞一時半會還反應不過來。我們學校這次分頭去的冬令營&#xff0c;差點上不了車。這次做的動車居然直達廣州&#xff0c;強啊。 然鵝還是到太晚&#xff0c;沒飯吃了。路上花了15大洋買了個…

v-slot vue2.6新增指令使用指南

子組件 <template><div class"wrapper"><slot name"demo" :msg"msg" text"this is a slot demo , ">this is demo slot.</slot></div> </template><script>export default {components: {…

跨語言RPC框架Thrift詳解

一、 概念 Apache的Thrift軟件框架&#xff0c;是用來進行可伸縮的、跨語言的服務開發&#xff0c;它通過一個代碼生成引擎來構建高效、無縫的服務&#xff0c;這些服務能夠實現跨語言調度&#xff0c;目前支持的語言有&#xff1a; C, Java, Python, PHP, Ruby, Erlang, Perl,…

小知識

1.時間格式的處理 new Date().format(yyyy-MM-dd hh:mm:ss) 2.保留兩位小數的方法 element.recTime element.recTime.toFixed(2) 3.如何判斷一個對象為空的方法 JSON.stringify(this.getEcho) ! "{}" 4.判斷時間是否為標準格式的方法 (this.formValidate.outDateti…

增加標 和增加其內容

create table student( sno varchar(20) not null comment學號, sname varchar(20) not null comment學生姓名, ssex varchar(20) not null comment學生性別, sbirthday datetime comment學生出生年月, class varchar(20) comment 學生所在班級, primary key…

RPC服務和HTTP服務對比

很長時間以來都沒有怎么好好搞清楚RPC&#xff08;即Remote Procedure Call&#xff0c;遠程過程調用&#xff09;和HTTP調用的區別&#xff0c;不都是寫一個服務然后在客戶端調用么&#xff1f;這里請允許我迷之一笑~Naive&#xff01;本文簡單地介紹一下兩種形式的C/S架構&am…

MTK-TP(電阻屏校準程序ts_lib移植)

現今的項目中已經很少有使用電阻TP&#xff0c;但總有些奇怪的需求。如果項目中遇到需要校準電阻屏如何保證較快且較穩的調試TP呢。這里介紹使用ts_lib庫來進行調試。 當然也可以使用一些常見的校準算法&#xff0c;采集5點&#xff0c;但最終的公式應該是不變的&#xff1a; X…

mac vscode 實用快捷鍵

cmddel:光標左邊刪到頭 cmdfndel:光標右側刪到頭轉載于:https://www.cnblogs.com/smzd/p/11474488.html

ONENET讀取與控制麒麟座MINI開發板LED狀態

硬件 麒麟座MINI開發板V1.4 嵌入式軟件 OneNET_Demo_ESP8266_EDP_Led 工程修改內容 led.c文件修改 函數LED_Init&#xff0c;mini開發板LED所在GPIO為PB6、PB7、PB8、PB9 函數LED_GetValue&#xff0c;mini開發板LED狀態與IO口狀態相反 /** * brief LED指示燈初始化函數**/v…

洛谷 - P1217 - 回文質數 - 枚舉

https://www.luogu.org/problemnew/show/P1217 考慮暴力生成所有的回文數然后再判斷是不是質數。注意個位的選擇實際上只有4種。所以是 $4*10^3*10^34*10^6$ &#xff0c;完全充裕的復雜度。 #include<bits/stdc.h> using namespace std; #define ll long longint a,b; v…

git commit之后,想撤銷commit

寫完代碼后&#xff0c;我們一般這樣git add . //添加所有文件git commit -m "本功能全部完成"執行完commit后&#xff0c;想撤回commit&#xff0c;怎么辦&#xff1f;這樣涼拌&#xff1a;git reset --soft HEAD^這樣就成功的撤銷了你的commit注意&#xff0c;僅僅…

引用數據類型

1.Scanner類 Scanner類是引用數據類型的一種&#xff0c;我們可以使用該類來完成用戶鍵盤錄入&#xff0c;獲取到錄入的數據。 引用數據類型的使用&#xff1a; 與定義基本數據類型變量不同&#xff0c;引用數據類型的變量定義及賦值有一個相對固定的步驟或格式。 數據類型 變…

phpmyadmin登錄遠程mysql數據庫

之前只用phpmyadmin登錄本地的mysql&#xff0c;管理另一個遠程數據庫的時候發現&#xff0c;單純用命令行處理字符串、換行符實在是不好使&#xff0c;所以配置了遠程登錄mysql&#xff0c;很簡單的問題結果沒有搜到合適的方法&#xff0c;所以記錄下我的配置方式。 phpmyadmi…

activemq的使用場景

一、消息隊列概述 消息隊列中間件是分布式系統中重要的組件&#xff0c;主要解決應用耦合&#xff0c;異步消息&#xff0c;流量削鋒等問題。實現高性能&#xff0c;高可用&#xff0c;可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。 目前在生產環境&#xff0c…

復習JavaScript隨手記

數據類型 基本類型 stringnumberbooleanundefinednumber類型,包含整數浮點數 NaN和自己都不相等,涉及NaN的計算結果都是NaN isNaN()函數用于判斷一個數是不是NaN 引用類型 object類型 function類型 繼承自object object類型定義了prototype屬性 可以通過它動態給對象綁定方法和…

TP5在前端時間戳轉換為時間格式

value"{:date(Y-m-d H:i:s,$data[add_date])}" 例如&#xff1a; <td>{:date(Y-m-d H:i:s,$d[create_time])}</td> 轉載于:https://www.cnblogs.com/shark1100913/p/9468077.html

Java(發布/訂閱模式)

1、概述 觀察者模式又稱為發布/訂閱(Publish/Subscribe)模式 觀察者設計模式涉及到兩種角色&#xff1a;主題&#xff08;Subject&#xff09;和觀察者&#xff08;Observer&#xff09; &#xff08;1&#xff09;Subject模塊 Subjec模塊有3個主要操作 addObserver()&#…

VUE $SET源碼

轉載于:https://www.cnblogs.com/smzd/p/11634255.html

JS 日期格式化

1、將中國標準時間格式化為&#xff08;2017-06-06 15:05:04&#xff09; function formatDateTime(theDate) { var _hour theDate.getHours(); var _minute theDate.getMinutes(); var _second theDate.getSeconds(); var _year theDate.getFullYear() var _month theDat…