当前位置: 首页 > news >正文

分布式Java应用之网络通信(1)

导读

网络通信包含两部分:网络协议和IO。协议规范了数据传输的格式,IO才是真正斤西瓜数据传输的部分。
网络协议包括:TCP/IP,UDP/IP和Multicast(多播协议)
IO包括:同步IO(NIO/BIO)和异步IO(AIO)

上边的部分都是作为Java分布式应用的基础,目前用于系统间通信的可以大致分为两类:基于消息方式实现系统间的通信、远程调用方式的系统间通用。

基于消息方式实现系统间的通信就是使用基本的jdk类库来操作IO来实现系统间的通信,而远程调用方式的实现我们可以通过目前主流框架和系统提供的服务。

基于消息方式实现系统间的通信

1、TCP/IP

TCP/IP是一种可靠的网络数据传输的协议。TCP/IP要求通信双方首先建立连接,之后再进行数据的传输。

TCP/IP三次握手四次挥手图:(详见可参考:http://blog.csdn.net/xlgen157387/article/details/47710473)
这里写图片描述

TCP/IP负责保证数据传输的可靠性,包括数据的可到达、数据到达的顺序等,但由于TCP/IP需要保证连接及数据传输的可靠,因此可能会牺牲一些性能。

相关学习:
TCP粘包处理:http://www.cnblogs.com/smark/p/3284756.html
TCP拥塞机制:http://www.cnblogs.com/hnrainll/archive/2011/11/29/2267534.html

2、UDP/IP

UDP/IP是一种不保证数据一定到达的网络数据传输协议。UDP/IP并不直接给通信的双方建立连接,而是发送到网络上进行传递。由于UDP/IP不建立连接,并且不能保证数据传输的可靠,因此性能上表现相对较好,但可能会出现数据丢失以及数据乱序的现象。因此UDP常用于大文件对精确度要求不高的数据。

3、同步IO和异步IO

TCP/IP和UDP/IP可用于完成数据的传输,是一种数据传输的协议规范,但要完成系统间通信,还需要对数据进行处理。例如读取和写入数据可分为同步IO和异步IO两种,其中同步IO中最常用的是BIO(Blocking IO)和NIO(Non-Blocking IO),异步IO是AIO

(1)BIO(阻塞模式)就是当发起IO的读或写操作时,均为阻塞方式,只有当程序读到了流或将流写入操作系统后,才会释放资源。

(2)NIO(非阻塞模式)是基于事件驱动思想的,从程序角度而言,当发起IO的读或写操作时,是非阻塞的;
当Socket有流可读或可写入Socket时,操作系统会相应地通知应用程序进行处理,应用再将流读取到缓冲区或写入操作系统。对于网络IO而言,主要有连接建立、流读取及流写入三种事件,Linux 内核版本在2.6以后的版本采用c方式来实现NIO。

(3)AIO(非阻塞)为异步IO方式,同样基于事件驱动思想。从程序角度而言,和NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可,AIO和NIO均为异步的。

a)对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;
b)对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。

较之NIO而言,AIO一方面简化了程序的编写,流的读取和写入都由操作系统来代替完成;另一方面省去了NIO中程序要遍历事件通知队列(Selector)的代价。Windows基于IOCP实现了AIO,Linux目前只有基于epoll模拟实现的AIO

4、消息方式的分类

基于消息方式实现系统间的通信可以分为最简单的使用jdk提供的API来实现TCP/UDP,最常用的为Socket等,另外还有一些开源框架Mina等可以实现。

基于远程调用方式实现系统间的通信

Java对TCP/IP和UDP/IP均支持,在网络IO的操作上,Java 7以前的版本仅支持BIO和NIO两种方式,对AIO方式的支持是在7以后的版本。

当系统之间要通信时,可通过调用本地的一个Java接口的方法,透明地调用远程的Java实现。具体的细节则由Java或框架来完成,这种方式在Java中主要用来实现基于RMI和WebService的应用。
另外还有很多的开源框架,例如Dubbo(http://dubbo.io/)和Dubbox(Dubbo的衍生版本:http://www.oschina.net/p/dubbox)都可以实现系统间的通信。

下一篇:http://blog.csdn.net/xlgen157387/article/details/49999521

相关文章:

  • 分布式Java应用之基于消息方式实现系统间的通信(2)
  • AnimationEvent事件问题
  • Nginx模块管理和进程管理
  • 转发:iOS之textfield用法大全
  • Nginx性能优化
  • Django 开发可以停了
  • Nginx服务器的功能模块
  • 对于沟通的理解
  • QQ登录网站接入功能实现--非官方文档搬运
  • Tomcat使用IDEA远程Debug调试
  • SSH设置别名访问远程服务器
  • ACM程序设计选修课——1049: Efface Numbers(贪心)
  • Dubbo-admin无法显示Group分组信息以及是否可以显示多个分组
  • 使用Jenkins配置Git+Maven的自动化构建
  • JUnit单元测试基础要点
  • 【个人向】《HTTP图解》阅后小结
  • 2017届校招提前批面试回顾
  • chrome扩展demo1-小时钟
  • dva中组件的懒加载
  • FastReport在线报表设计器工作原理
  • golang中接口赋值与方法集
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • magento 货币换算
  • Netty源码解析1-Buffer
  • React as a UI Runtime(五、列表)
  • text-decoration与color属性
  • V4L2视频输入框架概述
  • Vue2 SSR 的优化之旅
  • vue-router的history模式发布配置
  • Zepto.js源码学习之二
  • 分布式任务队列Celery
  • 简单实现一个textarea自适应高度
  • 怎么把视频里的音乐提取出来
  • ​ArcGIS Pro 如何批量删除字段
  • #pragma once
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)Android开发优化---------UI优化
  • (MATLAB)第五章-矩阵运算
  • (SpringBoot)第二章:Spring创建和使用
  • (安卓)跳转应用市场APP详情页的方式
  • (三)uboot源码分析
  • (转)memcache、redis缓存
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core 6 集成和使用 mongodb
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net的C#语言取月份数值对应的MonthName值
  • .net反编译的九款神器
  • .NET命名规范和开发约定
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @NoArgsConstructor和@AllArgsConstructor,@Builder