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.mzph.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…