分布式计算不是一门年轻的技术,早在上个世纪70年代末便已是计算机科学的一个独立分支了;它也不是一门冷僻的技术,从C/S模式到P2P模式,从集群计算到网格计算,乃至风靡当下的云计算,都是其表演的舞台。另一方面,Java作为一门应网络而生的语言,对分布式计算有着天然的友好性,同时也是当今最流行的编程语言。然而令人稍感意外的是,以“分布式Java应用”为专题的书籍并不多见,佳作则更少。至于国人所著者,请恕在下孤陋,尚未得见。不过细想之下,其实不足为奇。要开发一个高质量的分布式Java应用,以达到高性能、可伸缩、高可用、低延迟的要求,同时保证一致性、容错性、可恢复性和安全性,是何等的不易啊。它对程序开发的挑战在于:不仅需要对Java语言、类库、各种框架及相关工具极为熟悉,还需要对底层的JVM机制、各种网络协议有足够的了解;它对分析设计的挑战在于:不仅需要熟悉传统的应用架构模式,还需要掌握适用于分布式应用的架构模式和算法设计。此外,分布式应用对数据库管理员、测试分析人员等也提出了更高的要求。一本书若想涵盖这么多的内容,其难度可想而知。作者不仅需要具备起码的理论素养,更需要有丰富的实践经验。
如果仅仅是纸上谈兵,对读者是无甚裨益的。

提起诸如“高性能”、“高可用性”、“大规模并发”、“可扩展性”这些词汇,我相信多数技术人的心情都是激动而稍有点复杂的,当然,也或许是不屑一顾。毕竟不是谁都有机会面对这些富有挑战的技术场景,也不是每个架构师在面对这些挑战之前都能做好技术上的准备。那些意外故障总是不期而至,疲于奔命地解决问题的场景回顾起来对架构师来说犹如一场噩梦。
      以下阐述当一个面向数以亿计用户的网站经过几年高速发展,技术团队不得不面临大规模、高并发、高扩展性等挑战带来的技术困境的时候,一个出色的架构师经过多年一线实践后累积的经过时间考验的解决方案以及宝贵的实战经验。在这本书里,你会看到作者在解决一些关乎Web应用问题的指导原则、实践方法、多重工具的综合运用以及作者本人的感悟。要强调的是,本书讲述的内容是一个Web应用从小到大过程中遇到的棘手问题的解决之道,并非宏观解析,亦非屠龙之技。无论您面对的站点是大是小,皆会有参考作用,毕竟大站点会越来越复杂,而小站点总有一天也将变大。

大型应用通常会拆分为多个子系统来实现,对于Java来说,这些子系统可能部署在同一台机器的多个不同的JVM中,也可能部署在不同的机器上,但这些子系统又不是完全独立的,要相互通信来共同实现业务功能,对于此类Java应用,我们称之为分布式Java应用。
Martin Fowler在《企业应用架构模式》一书中曾经说过:“能不用分布式的情况下就不要用分布式”,当应用变为分布式Java应用时,会很大程度地增加应用实现的技术复杂度,对于分布式Java应用,通常有两种典型的方法来实现。

1.基于消息方式实现系统间的通信
当系统之间要通信时,就向外发送消息,消息可以是字节流、字节数组,甚至是Java对象,其他系统接收到消息后则进行相应的业务处理。
消息方式的系统间通信,通常基于网络协议来实现,常用的实现系统间通信的协议有:TCP/IP和UDP/IP。
TCP/IP是一种可靠的网络数据传输的协议。TCP/IP要求通信双方首先建立连接,之后再进行数据的传输。TCP/IP负责保证数据传输的可靠性,包括数据的可到达、数据到达的顺序等,但由于TCP/IP需要保证连接及数据传输的可靠,因此可能会牺牲一些性能。
UDP/IP是一种不保证数据一定到达的网络数据传输协议。UDP/IP并不直接给通信的双方建立连接,而是发送到网络上进行传递。由于UDP/IP不建立连接,并且不能保证数据传输的可靠,因此性能上表现相对较好,但可能会出现数据丢失以及数据乱序的现象。
TCP/IP和UDP/IP可用于完成数据的传输,但要完成系统间通信,还需要对数据进行处理。例如读取和写入数据,按照POSIX标准分为同步IO和异步I0两种,其中同步10中最常用的是BIO(Blocking I0)和NIO(Non-Blocking IO)。

2.基于远程调用方式实现系统间的通信
当系统之间要通信时,可通过调用本地的一个Java接口的方法,透明地调用远程的Java实现。
体的细节则由Java或框架来完成,这种方式在Java中主要用来实现基于RMI和WebService的应用。
本章通过举例来介绍如何基于Java的包及开源的产品来实现以上两种方式的系统间通信,这些实现分布式Java应用的基础和必备知识,采用的例子如下。
示例程序由一个服务器端程序和一个客户端程序构成,是典型的请求-响应机制,即客户端发送求,服务端响应。客户端读取用户的输入,并将输入的字符串信息发送给服务器端,服务器端接收信息后响应,当客户端输入的是quit字符串时,则停止客户端和服务器端的程序。

基于Java自身包实现消息方式的系统间通信的方式有:TCP/IP+BIO、TCP/IP+NIO、UDP/IP+BIO以及UDP/IP+NIO4种,下面分别介绍如何实现这4种方式的系统间通信。
TCP/IP+BIO在Java中可基于Socket、ServerSocket米实现TCP/IP+BIO的系统间通信。Socket主要用于实现建立连接及网络I0的操作,ServerSocket 主要用于实现服务器端端口的监听及Socket对象的获取。基于Socket实现客户端的关键代码如下:

//创建连接,如果域名解析不了会抛出UnknownHostException,当连接不上时会抛出IOException,如果希望控制建立连接的超时,可先调用new Socket(),然后调用 socket.connect(SocketAddress类型的目标地址,以毫秒为单位的超时时间)Socket socket=new Socket(目标IP或域名,目标端口);
//创建读取服务器端返回流的BufferedReader BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));

//创建向服务器写入流的PrintWriter PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
//向服务器发送字符串信息,要注意的是,此处即使写失败也不会抛出异常信息,并且一直会阻塞到写入操作系统或网络IO出现异常为止
out.println("hello");
//阻塞读取服务端的返回信息,以下代码会阻塞到服务端返回信息或网络IO出现异常为止,如果希望在超过一段时间后就不阻塞了,那么要在创建Socket对象后调用socket.setSoTimeout(以毫秒为单位的超时时间)in.readLine();

分布式-Java应用相关推荐

  1. 《分布式JAVA应用 基础与实践》 第六章 构建高可用的系统

    对于互联网或企业中的大型应用而言,多数要求做到7*24小时不间断运行.实际上要完全做到不太可能,但可尽量接近,各大网站或大型应用在总结一年的运行状况时,通常会有当年的可用性为99.9%这样的内容. 为 ...

  2. java 爬虫框架 j_一个分布式java爬虫框架JLiteSpider

    A lite distributed Java spider framework. 这是一个轻量级的分布式java爬虫框架 特点 这是一个强大,但又轻量级的分布式爬虫框架.jlitespider天生具 ...

  3. Java分布式应用:大型分布式Java应用与SOA

    第二部分 大型分布式Java应用与SOA SOA是一种服务集成的架构思想,超越具体的技术和架构,又涵盖具体的技术和架构.SOA的最常见的解决方案是SCA.ESB. Apache Tuscany 是SC ...

  4. 分布式专题(2)- 分布式 Java通信

    本篇一句话总结:Java实现分布式通信,可以基于Java API.开源框架和远程通信技术三种方式实现. 正文开始: 通过上一篇文章<分布式专题(1)- 计算机网络>我们知道了计算机之间之所 ...

  5. java分布式调度框架_基于Redis的分布式Java任务执行和调度框架

    Redisson是使用Redis实现分布式任务执行和调度的Java开源项目,它是通过标准JDK的ExecutorService和ScheduledExecutorService API实现的,被提交的 ...

  6. 分布式 java 应用:基础与实践_西研技术大讲堂第二期FRCS应用情况介绍及分布式技术平台能力应用实践...

    为制定高质量的技术培训课程,营造崇尚技术的浓厚学习氛围,使研发部组建云计算.分布式框架.用数赋智等专业技术队伍,每周四晚,"西研技术大讲堂"开课啦!第一期<工银磐石(分布式技 ...

  7. 分布式 java 应用:基础与实践_单集群数据超1000亿,微服务架构下分布式数据库应用实践...

    如今,大型企业的应用平台正在向微服务架构进行转型.在微服务架构下,应用程序和数据库等底层平台的关系将会被重构. 作为新一代分布式数据库,其架构与功能特性需要保证在与传统数据库全兼容的基础上,拥抱微服务 ...

  8. java分布式和集成式_【分布式java应用笔记】分布式与soa

    SCA 在xml中composite是SCA定义的最小部署单位.每个xml文件的根元素必须为composite,在composite下可以有多个component及service标签 Componen ...

  9. java 23_《分布式JAVA应用 基础与实践》 第三章 3.2 JVM内存管理(三)

    [3.2.3  内存回收(1) 收集器 JVM通过GC来回收堆和方法区中的内存,GC的基本原理首先会找到程序中不再被使用的对象,然后回收这些对象所占用的内 ...] 3.2.3  内存回收(2) Fu ...

最新文章

  1. linux: 查找文件
  2. leetcode112. 路径总和
  3. Space Time Varying Color Palette
  4. 《学习之道》第十三章练习大脑,改变思维
  5. 使用 Win 7 必须知道的快捷键
  6. ITerm2的安装和配置
  7. 使用PuttyGen和TortoiseGit进行Clone with SSH
  8. php来源德育管理系统,西安交通大学城市学院学生服务中心互联网学生工作管理系统...
  9. 【工具推荐】免费的思维导图软件——Blumind
  10. 医学病理图像:细胞间质与间质细胞的区别
  11. Congestion 问题怎么解决?
  12. 地理坐标定位和计算距离
  13. 怎么生成自动参考文献(简单 有图)
  14. Ubuntu14.04下安装vim显示没有可用的软件包vim-gtk
  15. Microsoft SQL Server数据库
  16. gt710显卡驱动linux,Ubuntu18.04导入nVidiaGT710显卡
  17. 最新 2021年 第十二届 蓝桥杯 单片机设计与开发 省赛 客观试题 个人答案
  18. 梦里不知身是客,一晌贪欢。—第五十一天
  19. 转-Linux进程后台运行的几种方法
  20. Day212.OAuth2、微信二维码登入注册功能、用户登录信息前后端供、讲师列表前后端 -谷粒学院

热门文章

  1. word表格跨页显示时缺少上框线
  2. mstsc连接传输大文件时突然中断
  3. Python ffmpeg视频压缩
  4. 图像处理直方图均衡化
  5. 设计师计算机配置,超全面!写给设计师的电脑配置攻略之PS篇
  6. WebView获取当前网页的页面元素
  7. linux搭建ftps(vsftpd),java代码测试上传下载
  8. vue点击实现箭头的向上与向下
  9. 连接mysql工具_非常实用的mysql可视化连接工具,开发测试必备软件,快收藏吧...
  10. input内容右对齐_STM32学习笔记—DAC基础内容及常见问题