点击上方 "程序员小乐"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

关注订阅号「程序员小乐」,收看更多精彩内容

每日英文

Crouch down, hold your knees when you are depressed.Forgive others and yourself.

郁闷的时候蹲下来抱抱自己,原谅别人也原谅自己。

每日掏心

别让自己心太累,应该学着想开,看淡,学着不强求,学着深藏,适时放松自己,寻找宣泄,给疲惫的心灵解解压。

来自:vince_zw | 责编:乐乐

链接:blog.csdn.net/zhaowen25/article/details/45443951

程序员小乐(ID:study_tech)第 1045 次推文

往日回顾:厉害了!淘宝自动刷喵币!靠这一个脚本就够了!

     

   正文   

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等,之前有写一篇介绍ProBuffer的博文

1、RMI(远程方法调用)

JAVA自带的远程方法调用工具,不过有一定的局限性,毕竟是JAVA语言最开始时的设计,后来很多框架的原理都基于RMI,RMI的使用如下:

在公众号顶级架构师后台回复“offer”,送你一份算法面试题和答案惊喜礼包。

对外接口

<span style="font-size:12px;">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)**/@Overridepublic 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框架)

基于Netty的高性能RPC框架,是阿里巴巴开源的,总体原理如下:

在了解Dubbo之前,要先对Zookeeper有深入的理解,当理解了zookeeper后,Dubbo也就了无秘密了。

Dubbo的详细说明在淘宝开源里说的非常详细,在工作中很多生产项目都用了Dubbo,过程中也发现了很多需要注意的地方,尤其是那繁多的配置,设置不当都会让人烦脑,最好能再基于现有开源的Dubbo再定制优化一下。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

“搜英文单词出现淫秽图片”,某度回应

如何实现 MySQL 删除重复记录并且只保留一条

熬夜慢性自杀全过程曝光

嘿,你在看吗

Java中几种常用的RPC框架介绍相关推荐

  1. Java 中几种常用的 RPC 框架介绍

    RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还 ...

  2. rpc框架有哪些java_JAVA中几种常用的RPC框架介绍

    1.dubbo: 使用Hessian的序列化协议,传输则是TCP协议,使用了高性能的NIO框架Netty 服务接口 1 public interface DemoService { 2 String ...

  3. JAVA中几种常用JSON库性能比较

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 作者:飞污熊 xncoding.com/2018/01/09/java/jsons.html 本 ...

  4. java 中几种常用数据结构

    原文地址:http://blog.csdn.net/u010947402/article/details/51878166 JAVA中常用的数据结构(java.util. 中) Java中有几种常用的 ...

  5. java中四种常用的引用类型_java中四种引用类型

    JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Reference).虚引用 ...

  6. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

  7. java中几种常见字符集与乱码介绍

    1.  ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为  单字节内码 -- Single-Byte chara ...

  8. java中几种常用的对象类型(po,vo,bo,dto)

    PO(persistant object) 1.持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了.   2.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看 ...

  9. JAVA中方法的类型转换_Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

最新文章

  1. 如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题
  2. 玩转OpenVswitch 简介
  3. python爬虫自学路线_python 爬虫学习路线:从入门到进阶
  4. JZOJ__Day 10:【普及模拟】【USACO】山峰暸望
  5. Prometheus 序章/第一/二讲
  6. 【转】python中的对象拷贝
  7. wdcp服务器/虚拟主机管理系统,wdcp服务器/虚拟主机管理系统1.1发布(最后更新20110423)...
  8. protobuf java 生成_protobuf代码生成
  9. 后BERT时代:15个预训练模型对比分析与关键点探究
  10. 几款软件需求分析工具
  11. 【PyCharm】PyCharm破解版在系统崩溃后无法启动
  12. linux filesystem not open,建立物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录...
  13. 什么是NP-Hard
  14. 如何用四条直线把这9个点连起来,要求这四条直线是连续的
  15. HDU1788 【中国剩余定理】
  16. 【jQuery/CSS】显示或隐藏元素
  17. 京东助手抢购-购买口罩教程
  18. 2018山东春季高考计算机真题,2018年春季高考数学真题.doc
  19. Laravel 联合查询 count计数去重
  20. 【LaTeX】IEEE会议模板中插入双栏图片(解决报错:Undefined control sequence. \subfloat

热门文章

  1. 交叉编译器:arm-linux-gcc-3.4.1 xiazia,ubuntu18.04.1安装交叉编译器 arm-linux-gcc-4.4.3
  2. 张靓颖的人脉和她的社会名流“粉丝”们
  3. 各位老师的学习技巧都是制胜宝典
  4. 【Linux篇】awk命令详解
  5. 嵌入式为什么没有软件架构师?
  6. 世界上最遥远的距离(中+法+英)
  7. Mac新手必看:Mac电脑多桌面管理小技巧
  8. Android TextView绘制之DynamicLayout
  9. 《iTOP-3568开发板快速测试手册》第7章 Yocto系统外设功能测试(2)
  10. 开启蓝牙并设置永久可见