Java学习从入门到精通
Java Learning Path (一)、工具篇
一、 JDK (Java Development Kit)
JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。
1、 JDK的下载和安装
JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html。
下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。
2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。
二、 JDK Documentation
Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。
三、 应用服务器(App Server)
App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:
1、 Tomcat
Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:
Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 。
下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:
JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)
这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。
Tomcat提供了两个Web界面的管理工具,URL分别是:
http://localhost:8080/admin/index.jsp
http://localhost:8080/manager/html
在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:
<role rolename="manager"/>
<role rolename="admin"/>
<user username="robbin" password="12345678" roles="admin,manager,tomcat"/>
这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。
2、 BEA Weblogic
Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp,.../edocs.bea.com/ 。
3、 IBM Webshpere
Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/...WASsupport.html 。
4、 Jboss
Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然...n.com/idea.html
四、 Java应用的运行环境
Java的应用可以简单分为以下几个方面:
1、 Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。
2、 Java Web应用
Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
Browser层:浏览器显示用户页面
Web层:运行Servlet/JSP
DB层:后端数据库,向Java程序提供数据访问服务
3、 Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
Browser层:浏览器显示用户页面
Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
Web层:运行Servlet/JSP
EJB层:运行EJB,完成业务逻辑运算
DB层:后端数据库,向Java程序提供数据访问服务
4、 Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。
Java Learning Path(二)、书籍篇
学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。
在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。
对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。
对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。
在所有的Java书籍当中,其实最最有用的,并不是O'reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation,什么其他的书籍都不需要了。
对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。
EJB的书籍当中,《Enterprise JavaBeans, 2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。
但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。
如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。
在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。
Java Learning Path(三)过程篇
每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。
学习Java的第一步是安装好JDK,写一个Hello JWorld, 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。
第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。
第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。
第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;
这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O'reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。
对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That'all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。
第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
java.text.*;
java.net.*;
javax.naming.*;
这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。
第六步,Java Web 编程
Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。
在Servlet/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。
此外Java Web编程学习的重点要放在Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。
第七步,J2EE编程
以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。
首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。
然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。
在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。
在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。
J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。
另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。
Java Learning Path(四) 方法篇
Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。
举个例子,我们都编过Hello World
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。
我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。
此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。
其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose
java –verbose
javac –verbose 以及其它很多JDK工具都有这个选项
-verbose 可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。
另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。
所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。
Java Learning Path(五)资源篇
1、 http://java.sun.com/ (英文)
Sun的Java网站,是一个应该经常去看的地方。不用多说。
2、http://www-900.ibm.com/developerWorks/cn/
IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!!
3、http://www.javaworld.com/ (英文)
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。
4、http://dev2dev.bea.com.cn/index.jsp
BEA的开发者园地,BEA作为最重要的App Server厂商,有很多独到的技术,在Weblogic上做开发的朋友不容错过。
5、http://www.huihoo.com/
灰狐动力网站,一个专业的中间件网站,虽然不是专业的Java网站,但是在J2EE企业应用技术方面有深厚的造诣。
6、http://www.theserverside.com/home/ (英文)
TheServerSide是一个著名的专门面向Java Server端应用的网站。
7、http://www.javaresearch.org/
Java研究组织,有很多优秀的Java方面的文章和教程,特别是在JDO方面的文章比较丰富。
8、http://www.cnjsp.org/
JSP技术网站,有相当多的Java方面的文章和资源。
9、http://www.jdon.com/
Jdon论坛,是一个个人性质的中文J2EE专业技术论坛,在众多的Java的中文论坛中,Jdon一个是技术含量非常高,帖子质量非常好的论坛。
10、http://sourceforge.net/
SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件。
|
|
|
|
Jini技术介绍(一)
一:Jini白皮书什么是Jini?
Jini是Sun公司的研究与开发项目,它能极大扩展Java技术的能力。Jini技术可使范围广泛的多种硬件和软件---即可与网络相连的任何实体---能够自主联网。
Jini可以使人们极其简单地使用网络设备和网络服务,就象今天我们使用电话一样---通过网络拨号即插即用。Jini的目标是最大限度地简化与网络的交互性。
Jini利用了Java技术的优势。Jini包含了少量类库格式的Java代码和某些惯例,可在网络上创建一个Java虚拟机的"王国",就象我们人类创造一个社区一样。在这个王国里的人、设备、数据和应用程序等网络公民均被动态地连接起来,从而能够共享信息和执行任务。
主要趋势---网络的普及这个世界正在网络化。例如,在今天,一个企业要想取得成功就必须建立网络。商业网络正在不断扩大,而且已经能够与供应商和客户实现直接交互。与无线网络的交互也几乎成为家常便饭。企业和消费者都要求能与网络进行更广泛的交流。出差在外的人无不希望在到达饭店后就能把自己的计算机插入网络接口,不但能与自己单位的工作环境进行交互工作,而且还能与饭店的本地服务,如打印机或传真机等进行交互工作。父母可能希望只需使用移动电话或笔记本电脑就能与家里的摄像机相连,通过它来察看家里的情况。人们无不希望随时随地能够连接和立即使用本地的定制服务。在不远的将来,我们将看到网络渗透到很多其它环境。例如,将会出现把电视机和立体声设备等音频/视频设备与家庭办公室的电脑和外设连接起来的网络,并控制安全监视器和温控恒温器等网络设备。电缆和ASDL等高带宽媒介将为家庭提供全新的服务。服务供应商不断为驾驶员提供越来越多的服务,网络也必将随之进入汽车领域。除导航系统外,游览景点和当地餐馆名单等本地服务也将出现在驾驶员的屏幕上。只要汽车与远程诊断设备相连,它就能自动完成对汽车的维护,并在汽车出现问题时通知驾驶员。
商业机遇---网络服务Jini所能带来的商业机遇是新型的网络服务。
例如,产品制造商将在基于网络的产品上提供新的服务。例如,磁盘可被看作与网络相连的存储服务,能向磁带和其它新型服务提供自动存储备份。联网的摄像机可能将提供诸如安全监视等新型成像服务。这些新的服务使制造商成为新型的网络服务供应商。
Jini还能帮助传统的服务供应商提供新型服务。
例如,某媒体服务供应商可能希望向某消费者的家庭打印机提供报纸? 服务。无线服务供应商可能希望通过蜂窝电话提供相似的服务。
Jini还可简化对现有服务的管理。
在隔天交货的情况里,Jini简化了分布在各处的工人与网络连通的方式。在个人银行里,基于Jini的计算机和外设可简化分行的系统管理。对于无线服务供应商,Jini可使蜂窝电话具备类似于电话的网络功能:屏幕大小、处理能力、使所提供的服务根据每一部电话的特点而专门设计。
问题是,在今天的环境中,联网还是太复杂了。例如,无论是把PC连接到网络上,还是使用联网的打印机都非常复杂。只有经验丰富的系统管理员才有能力处理装载驱动程序、设置配置文件等复杂的工作。显然,我们不可能指望一般消费者也能管理今天这样复杂的网络。
今天的网络还很脆弱和很不灵活。对网络稍加改动就可能造成不可挽救的大混乱。向网络中添加诸如磁盘存储等功能的过程也很复杂。例如,要想添加一个磁盘驱动器,我们就必须打开机箱,处理设置跳线器,并解决一系列复杂的设置问题。即使专家也会头疼。
实际上,从消费者的角度看,他们所需要的只不过是把硬件和软件插入联网的环境,并立即就能使用可用的服务:就象我们今天插接电话一样。在今天,当消费者从商店购买一部电话后,他不必对电话进行配置。消费者只需给电话服务供应商打一个电话,服务就会送上门。最后,消费者只需把电话插好,就能使用电话服务了。自主的联网。
Jini的价值Jini的作用就是能简化与网络的交互性。
从消费者的角度看,消费者把可插接的设备和软件插入网络,就像今天插接一部电话一样简单。
从传统服务供应商的角度看,Jini简化了Services Delivery (服务提供)的管理。设备不但能向网络推出增值服务,而且还能提供设备的属性和功能。现在,服务供应商可以针对每台设备设计服务。当然,Jini还将有可能打开一扇通向新的网络化服务的大门。
从产品制造商的角度看,Jini打开了全新的市场。因为Jini简化了设备向网络提供增值服务的能力。所以,产品就不仅仅作为商品而投入竞争,而是作为增值服务的产品参与竞争。
从Java程序员的角度看,Jini简化了编写分布式应用程序的工作,因而,任何Java程序员都能利用基于Jini的新设备编写应用程序和服务。因此,企业不再需要聘用有限的专家资源编写分布式应用程序,任何Java程序员都能为基于Jini的网络开发服务。
Jini的起源Bill Joy在1994年之前向Sun公司实验室提交了一份包括以下三个主要概念的建议书:
可在所有平台上运行的语言运行该语言的虚拟机,和允许分布式虚拟机像单一系统那样工作的网络化系统到1995年,这种语言和虚拟机相继面市,即Java编程语言和Java虚拟机。但该系统的概念则仍保留在Sun公司的研究与开发实验室,作进一步的研究和开发。这个系统的概念就是Jini。
Jini战略部署与合作伙伴Sun公司部署了广泛的战略,力求将Jini推向市场。我们可以这样说,Jini与任何向网络化环境提*品和/或服务的企业都密切相关。这包括传统的设备制造商、服务供应商和软件开发商。
Jini将如何进行授权?
为推动Jini的进一步创新,使其尽快被市场所接受,Jini源代码将象Netscape公司的Mozilla模型一样向所有开发商公开。为确保兼容性和质量,正在考虑对商业产品进行标记。围绕授权方式的很多具体细节目前仍在最后确定过程之中。拟议中的授权草案将于今年8月公布。
Jini技术概述
Jini技术可划分为两个范畴:体系结构和分布式编程。此外,还将提供在Jini上运行的网络服务。
基础结构
Jini基础结构解决设备和软件如何与网络连接并进行注册等基本问题。
基础结构的第一种要素称作Discovery and Join (发现与联合)。Discovery and Join解决设备和应用程序在对网络一无所知的情况下如何向网络进行首次注册这样的难题。
基础结构的第二个要素是Lookup (搜索)。Lookup可被看作网络中所有服务的公告板。
Network Services ---网络服务Other Services ---其它服务Leasing ---租用Transactions ---交易Distributed Event---分布式事件Other OS ---其它操作系统Other CPU ---其它CPU DISCOVERY AND JOIN 设备或应用程序插入网络后需要完成的第一个任务就是发现该网络,并使网络发现该设备或应用程序。我们之所以使用Discovery and Join这样的说法,是因为设备或应用程序事前不可能对网络有任何了解。
Discovery的工作原理如下:
当基于Jini的设备插入网络后,它就通过一个众所周知的端口向网络发送一个512字节的多路广播Discovery包。在其它信息中,该包包含对自己的引用。
Jini Lookup在众所周知的端口上进行监听。当接收到Discovery包后,Lookup就利用该设备的接口将Lookup的接口传递回插接的设备或应用程序。
现在,该设备或应用程序已经发现了该网络,并准备将其所有特性上载到Jini Lookup。上载特性是Discovery and Join中Join这方面的特性。
现在该设备或应用程序使用在Discovery阶段所接收到的Lookup接口与网络相连。上载到Lookup的特性包括该设备或应用程序所提供的所有增值服务(如驱动程序、帮助向导、属性等)。
LookupLookup是网络上所有服务的网络公告板。Lookup不但存储着指向网络上服务的指针,而且还存储着这些服务的代码和/或代码指针。
例如,当打印机向Lookup注册时,打印机将打印机驱动程序或驱动程序接口上载到Lookup。当客户机需要使用打印机时,该驱动程序和驱动程序接口就会从Lookup下载到客户机。这样,就不必事先把驱动程序装载到客户机上。
打印机还可能把其它增值服务装载入Lookup。例如,打印机可能存储关于自己的属性(如它是否支持postscript,或它是否为彩色打印机)。打印机还可能存储可在客户机上运行的帮助向导。
如果网络上没有Lookup,则网络就会使用一个Peer Lookup (对等Lookup )程序。当需要服务的客户机在网络上找不到Lookup时,Peer Lookup就开始工作。在这种情况下,客户机可发送与Lookup所用的相同的Discovery and Join包,并要求任何服务供应商进行注册。随后,服务供应商就会在客户机上注册,尽管那不是Lookup。
分布式编程Jini分布式编程为Java增添了创建分布式系统所必需的其它功能。尤其是Jini分布式编程可提供租用、分布式交易和分布式事件。
租用租用与租用一套公寓很类似。我们在租用一套公寓时,一般会商定使用该公寓的时间。类似地,在Jini中,对象彼此之间商定租期。例如,当某设备使用Discovery and Join协议发现网络时,它就注册一段租用时间。在租约到期之前,该设备必须重新商定租期。这样,如果租约到期或设备拔下后,该设备在Lookup中的记录就会被自动删除。这就是分布式垃圾收集的工作原理。
分布式事件在单一的计算机中,事件肯定能被接收方接收到,序列也肯定能按照顺序进行。
但在分布式环境中,分布的事件可能不是按照顺序被接收,或者,某个事件还可能丢失。
为便于在Java环境中处理分布的事件,Jini为分布的事件提供了一个简单的Java API。例如,当一个分布的事件发生时,该事件都带有一个事件号和序列号。利用这种信息,接收方就能检查事件是否丢失(序列号丢失)或事件是否按照顺序接收(序列号顺序不对)到。
分布式交易在分布式Java环境中,有时需要一种很简便的方法,来确保在整个交易完成之前,在该交易中发生的所有事件都被真正提交了(两阶段提交)。
为便于进行此类分布式计算,Jini提供了一种简单的Java API。该API可使对象起动一个能管理交易的交易管理器。每个参与交易的对象都向交易管理器注册。
当交易发生时,如果某个参与的对象说,交易中的某个事件没有发生,则此信息就被送回交易管理器。随后,交易管理器就告诉所有参与的对象回滚(rool back)到前一个已知状态。类似地,如果所有对象都完成了其交易的过程,则整个交易就向前进行。
Jini上的网络服务在Jini基础结构和分布式编程之上,可提供便于分布式计算的网络服务。JavaSpace就是这样的一种网络服务。
欲知有关JavaSpace的详细情况,请访问http://java.sun.com/products/javaspace我们期待着将来在Jini上建立更多其它的网络服务。
欲知有关Jini技术的详细情况,请访问http://java.sun.com/products/jini
Jini 能给您带来什么
Jini是实现大规模分布式计算的一种关键技术。它不仅可以解决网络兼容性的问题,更加不同凡响的是,通过这种技术可以在网络计算机设备和应用程序之间进行有效的交互和合作。Jini通过使用面向对象的语言JAVA,将即插即用特性赋予了各种各样的设备,例如PC、手持式电脑、蜂窝电话以及48KB的小内存设备,从而减少了网络上的冲突。但是,Jini网络的实现还需要开发人员艰苦不懈的努力。在此之前,程序员们仍要面临编写分布式应用程序的挑战。
Jini是一种用JAVA语言编写的代码,这种代码可以在网络上自动地检测计算机设备,并且注册它们所提供的服务。它是为在网络上提供分布式操作系统服务而采纳的开放式体系结构的核心部分。
Sun公司为下个世纪的网络计算绘制了一幅蓝图,将这幅蓝图变为现实的技术就是Jini。Jini是一种基于JAVA的体系结构,它提供操作系统的服务,并且将其功能扩展至整个网络。更一般地讲,Jini是在JAVA虚拟机(JVM)顶端运行的一个JAVA软件,为设备提供即插即用的网络功能。Sun在它的蓝图中描绘了这样一幅场景:在未来,任何一台装有微处理器以及小容量RAM的设备之间都能够相互合作,从而达到了计算上一个崭新的境界。虽然这是一种超前意识,但是采用Jini至少使我们离未来的蓝图又进了一步———它可以使我们免受设备驱动程序不兼容的困扰,并且不再让用户在登录到网络上时遇到麻烦。
举个例子,在Sun所勾画出的蓝图中,用户可以将掌上型电脑插入网络插槽并且能够被立即识别出来,从而自动地成为了网络的一部分。有了这样的手持式设备,用户就可以方便地访问一台计算机上的数据,并且利用另外一台计算机所提供的服务来处理这些数据;接下来他还可以在最近的一台打印机上打印数据,而不用在掌上型电脑上预装打印机驱动程序。这样不可思议的事是通过这部掌上型电脑自动下载一个基于JAVA的打印机驱动程序来实现的。网络与应用程序之间这种自动而便捷的集成可以应用到从PC到蜂窝电话的几乎任何一种电子设备之上。
这种分布式的计算体系结构并不新奇,Sun公司的Jini也不是实现下世纪网络世界的操作系统唯一的技术。Lucent Technologies公司在1997年推出了为嵌入式系统设计的Inferno技术,该技术在逻辑上与JAVA极为相似,也包含了虚拟机概念、编程语言以及通信协议;Oak Ridge国家实验室也推出了称为并行虚拟机(PVM)的技术,它旨在通过网络上完全不同的机器之间进行合作而提供一种低价位的超级计算机;IBM力推的T Spaces在概念与实现上与Sun也很类似;而脚踩两条船的Microsoft也正在研究分布式操作系统,他们关于分布式操作系统的大手笔项目称做Millennium。Microsoft希望通过Millennium取得两大伟绩:一是将桌面操作系统完全而无缝地分布到世界范围的网络中去,二是将程序员带往不再考虑底层机器细节的更高抽象层次上。这两个目标对于分布式系统来讲是相当关键而密不可分的。但是,由于Sun拥有JAVA编程语言以及相应的虚拟平台,它在将操作系统引入下个世纪中处于一个极为特殊的地位。
Jini是如何工作的
Jini解决的并不是诸如一个特定的应用程序如何在网络上进行工作这样的细节问题,而是为这些服务提供一种极为关键的能力,使得它们彼此之间可以意识到对方的存在,进而建立起相互的连接。Jini的核心是Sun JDK1.2中的JAVA Remote Method Invocation(RMI),这是一种使JAVA对象之间可以在网上实现交互的网络服务。这样看来,Jini就可以看作是JAVA软件组件模型JAVABeans在理论与实践上的一种延伸了。
Jini网络就像是一个市场,在其中商人们贩卖自己的商品。在Jini网络中,商人们就是最终用户、设备或者应用程序。贩卖的过程是这样的:一个新的商人来到这个市场,他宣告了自己的到来,并且很快建立起了商店;然后他将所卖的商品以及提供的服务写下来,像许多其他的商人一样写在一张卡片上,而这些卡片的信息就公布在一个布告栏中;Jini提供了这种销售的机制,根据它的规定,商人们被授予在布告栏上贴广告的地方,并在那里发布消息;顾客们则在布告栏前驻足,寻找他们感兴趣的卡片信息,然后从卡片上抄下与商家联系的方式;接下来顾客就与商人在诸如“什么时候交货”或者“怎么买卖”这样的细节问题上讨价还价;而商人们交易时所遵循的交易规则是由Sun的另外一个标准JAVASpaces来规定的;对于顾客来讲,商人之间的*交易是不可见的。
Jini所蕴涵的意思当然比这个比喻要来得丰富得多:例如消息在布告栏上不会被偷走,以及广告所占据的实际空间并不需要考虑等等。但是,这个虚拟市场也存在着固有的问题:例如这些商人对他们的顾客缺乏判断的准则,还有当网络发生故障、商家突然消失时如何进行交易也是需要考虑的问题
Jini中,这个由商人和顾客组成的市场被称为一个“联盟”。Jini通过一种“发现并加入”(Discovery and Join)服务为该联盟分配空间;它的另一种“查找”(Lookup)服务用来在布告栏中发布信息,并且接受交易要求;Jini由一种“出租”(Leasing)模型来解释何时可以将卡片从布告栏上撤走,以及制订合同所需遵循的规则;并且由一张“访问控制列表”(Access Control List)来规定谁可以使用特定的服务;服务的提供与进行由JAVASpaces和实际的应用程序共同操纵;商人之间交流所采用的通用语言由JAVA的RMI规定来决定。
Jini和JAVASpaces一起为当前集中式的系统服务带来了一种转变。一个操作系统实际上就是一些子功能的集合,但是它进行的是一些复合式的操作。Jini和JAVASpaces打破了这种单一的模式,而把许多服务分布到网络的不同部分上去,从而将OS分成了若干子系统,并且将这些子系统分散到了网络、客户机以及服务器上。对于实现分布式的合作来说,Jini是这种JAVA基础结构中起步性的关键步骤。由于JAVA具备面向对象的特性以及执行可传输代码的能力,Jini可以在网络上分发大量的软件对象。这些独立的应用程序或者对象可以根据用户的需要在网络上传输,从而与其他对象进行交互。
Jini是如何工作的
Jini将会给企业带来的影响
Jini和分布式系统在降低网络交互的复杂性方面将使企业得益非浅。许多公司内部的计算机设备种类繁多,诸如PC、打印机、手持式设备、蜂窝电话以及服务器等等,简直令人头痛。比方说,如果一台打印机发生了故障,那么立刻所有的网络用户就需要修改他们工作站上的打印设置。而Jini能自动识别网络上的变化,并且对用户透明地在网络上传输像打印驱动程序这样的代码,从而彻底地解决了这样的问题。Jini的梦想也为崭新的商业运作模式创造了可能,Sun希望在不远的将来,新的经营模式会产生于基于Jini的灵活机动的网络,比如出租大型硬盘组的磁盘空间等等。由于公司们正在致力于挖掘新的商机,Jini很可能为现在任何人都想象不到的计算机硬件工作模式提供其所需要的基础。
Jini走出第一步
像Jini这样的分布系统技术毫无疑问会成为今后十年里发展的主要力量,但是,Jini的应用还很不成熟。目前,它只不过是为开发人员更好地利用网络及其资源编写应用程序的基础工具。在更为基础的层次上,厂商们需要为他们所有可能在Jini网络上运行的设备编写基于JAVA的驱动程序,或者为驱动程序编写JAVA接口。
问题在于:何时Jini才能走出研究和开发阶段,何时它才能成为真正的产品从而造福于企业?
Jini的实质是JAVA。而在网络或者多台计算机上提供分布式的服务正是JAVA的目标。由于Jini基础结构使用的是JAVA RMI以及面向对象的编程,因此Jini对于JAVA和面向对象的程序员来说会显得更为直接,但是编写分布式应用程序比一个单独应用程序来说总归复杂得多。例如,开发一个经常在一开始时用作介绍的应用程序“Hello World”,在集中的操作系统以及应用模型中,可能只需编写几行代码就可以在屏幕上显示出“HelloWorld”消息,甚至新手在几分钟之内就可以编写出这个程序。但是如果是在分布式的环境中,编写同样应用程序的复杂性就会大大提高了。程序员们必须考虑到诸如网络故障、延迟以及安全等方面的问题。尽管Jini和JAVAspaces提供了分布式的安全模型以及对象处理机制,但是让它们能为今天的程序员们所应用还要经过相当长的时间。正像其他计算机方面的问题一样,这是一个培训和普及的问题,因为程序员们需要学习如何编写出高质量的分布式应用程序。
从另一方面看,Jini已得到了令人鼓舞的支持。Sun已经同诸如Quantum和Ericsson这样的公司建立起了伙伴关系,他们们均表示要采用该技术;Novell也表示要为Jini提供创建目录的服务。尽管目前重要的合作伙伴并未作出任何许诺,但至少一家并不著名的公司———Malaysian已经将Jini应用了起来。
Jini在很多方面是大多数传统操作系统无法匹敌的。虽然像Microsoft这样的公司正在研究自己的分布式计算系统,但目前Jini仍是领先的。一方面,程序员们已经可以创建Jini应用程序了,对于JAVA程序员来说,他们已经熟悉了许多Jini的特性;另一方面,由于JVM的普及,Jini必须与各种各样的环境进行合作和集成。由于分布式系统的前景无可限量,我们可以打赌:Sun或者是Microsoft将为未来的分布式操作环境制订标准。Jini建立在JAVA坚强的基石之上,并且JAVA深入人心,它代表了早些时候在计算模式上要进行广泛而深远转变的一种热潮;而Microsoft则控制了当前OS的标准。
创造强有力的系统和应用程序,从而更好地利用网络资源、使用分散的资源来解决大型的问题,这就是我们的目标。将这个梦想变为现实还需要长时间的努力,但至少目前,Jini已经在解决网络上互操作性的矛盾上给我们带来了希望,同时是它使得设备驱动程序的问题已经成为了过去。
Jini的作用 |
为分布式系统中的设备提供即插即用的网络功能 |
与Jini竞争的技术 |
Lucent的Inferno |
Oak Ridge国家实验室的并行虚拟机(PVM) |
IBM 的T Spaces |
Jini的短处 |
对编程人员要求高,编程复杂,需要学习一段时间才能掌握 |
初识JINI技术
一、前言
长久以来许多工程师们,都一直期盼著一个超大型的计算系统,这系统是由网路上许多机器,从超大型主机乃至嵌入在某些设备上的微小晶片,彼此相互合作而成。所有的工作,都可以在任何时间被分散到网路上的任何地方、任何种类的机器上去处理。这样的系统有很好的弹性,并且可以藉由不断地更新设备,来解决更多问题。
然而,我们 要一致的语言,以及更强的通讯协定( superprotocols)等,让网路上众多繁杂的成员,能彼此顺利地沟通。但是就目前的情况,要达到这样的目的很难,因此我们可以考虑把一种特殊的程式码(genetic code)嵌入到许多软硬体之服务中,使得网路上的成员可以轻易的相互分享彼此资源,这就是 Jini 所要达成的目标。
Jini 是由 SUN 公司 R&D 的Bill Joy 所提出的一项技术。我们可以藉著使用Jini,创造出一个富有弹性、容易管理、且可随时随地使用各种服务的网路计算环境。为了让使用者知道网路上有哪些服务可被使用,我们必须建立一个联盟( federation ),让网路上的服务主动加入。当有某个服务加入联盟时,也等於同时向整个网路告知:「我可以被使用,有谁 要我的服务?」。使用者透过联盟,可以得知有哪些服务可以使用。然而,我们要如何才能很简单、很轻易地使用这些服务关於这个问题,也就是 Jini 的工作重点之一。
让我们来看看Jini 是怎堋做的。网路上的服务要能够成为联盟的一份子,不管是硬体服务也好、软体服务也好,都必须嵌入Jini 的程式码。此外,网路上还必须提供 JVM的环境,才能执行Jini程式以获得这些服务。
Jini的程式码是利用 SUN 公司所提供的 Jini package 撰写而成。Jini package使用的语言是Java,并且包含了许多处理网路上资源的相关功能。例如:如何帮助网路服务寻找(discovery)、以及加入(join)联盟;或者帮助网路服务处理分散式的承租(leasing)、交易( transactions)等的问题。而这些网路服务彼此沟通时,所应用的技术是 RMI(Java Remote Method Invocation )。简言之,网路上的服务藉由 Jini 所提供的介面,得以相互沟通、合作,来完成使用者的
二、体系结构
Jini system 是由基础建设( infrastructure)、程式设计模型( programming model )、服务( services) 三方面所构成。如图一所示 :
· 基础建设( infrastructure)
Jini 基础建设的核心包含以下几个部分:
1. Discovery Protocol:
提供了如何让网路上任何种类的资源加入联盟的方式。
2. eXtended RMI :
Jini的元件彼此沟通时所使用的机制。
3. Distributed Security:
定义了Jini 联盟成员的使用权限。
4. Lookup Service:
用来展现联盟中的所有成员,以及帮助使用者寻找网路资源,或者负责提供联盟中的资源给使用者用。
· 程式设计模型( programming model )
Jini 提供一些分散式的程式设计模型,而 Jini 的基础构造,就是利用这些模型来组合。模型所提供的介面(Interface),包括以下几个类型:
1. Leasing Interface:
负责管理物件被使用的时间。
2. Two Phase Commit Interface :
是一个轻量级的(light-weight)、物件导向的( object-oriented)介面。负责管理分散式交易( transaction)的动作,如:roll back 、roll forward 等。
3. Events Interface:
在分散式计算的环境中,必须确保程式执行的先後顺序,利用事件的观念可以帮助我们解决这个问题。
· 服务(services)
有了Jini的架构以及程式设计模型後,我们可以利用这些技术来设计管理网路资源的服务,以促进分散式计算的发展。例如:JavaSpaces、Two Phase Commit Manager。
三、JavaSpace
Jini提供了在分散式环境中寻找( look-up)、注册( registration)、租借(leasing)等功能。而 JavaSpaces则负责管理分散式物件的处理程序( processing)、分享(sharing)、以及流通(migration )等。因此 Jini 与 JavaSpaces 彼此存在著相互合作的关系 。以军队作比喻, Jini扮演的是军 官的角色,负责分派许多武器装备给军队。JavaSpaces则扮演军队的角色,负则使用那些被分派的武器以执行命令。简单的说, JavaSpaces就好像网路上的一个市场,它提供一个简单、快速、统一的介面,让网路上分散的资源可以被分享、协调与流通 。
JavaSpaces是用 Java所发展的技术,并且以RMI实作其网路通讯的功能,一般应用在n-tiers 架构的中间层( middle tiers) 。JavaSpaces虽然能提供求者与供应者之间查询与沟通的机制,但它并不是资料库,而是以简单的messaging system为基础,进而提供更强大的功能。
除了Jini之外, JavaSpaces技术也可被应用在其它系统与服务中,如: Workflow systems 、Customer management systems、Supply chain management 、Intelligent rich data distribution、 Trading services 、Auction systems 、Resource allocation and management systems、Agent Systems、以及 Publish and subscribe services等。
四、应用
Jini技术有一个主要目的:让许多电子产品可以容易的被加入至网路上,也就是随插即用(plug-and-play) 。任何物件,如: DVD、CD 、VCR、桌上型电脑、可携式电脑、印表机、扫描器、磁碟机、播放器、电话、电视机、警报系统、医疗器材、空调系统、厨具、汽车引擎、汽车的丁器板等,只要利用Jini技术,就可以结合各类的电子产品成为网路上的资源服务 ,而使用者只 透过电话或无限通讯器材就能使用这些服务。
想像一个剧情:一个使用者坐在公园里,想要透过掌上型电脑来使用网路上的印表机,但是他并没有任何印表机的驱动程式。首先,Jini会启动 Lookup服务(类似 JavaSpaces),到联盟(federation )中搜寻符合使用者条件的印表机。找到之後,Jini会跟那台印表机沟通,取得它的驱动程式,并且传至使用者的掌上型电脑。使用者於是可以轻易的使用网路上的印表机。
我们也可以把家中的电器用品都结合到网路上,这样可以让我们在任何时间、任何地点来控制家里的电器,这将是多堋令人期待的一个理想。
目前已经有许多公司正在发展相关的技术,这些公司包括Axis、Canon、 Computer Associates、Datek 、Enocanto、Epson 、Ericsson、FedEx 、Mitsubishi、 Norwest Mortgage 、Novell、ODI、 Oki、Quantum、 Salomon Brother、 Seagate、以及 Toshiba等。
五、结论
Jini让许多电器设备、网路服务结成联盟( federation)。 Jini的最上层以 Lookup机制为基础的目录服务( directory service ),让许多含有 Jini技术的资源,来注册以及被公布於网路上。下一层则利用JavaSpaces 技术来管理联盟的资源,以让使用者或其他应用程式使用资源。底层则是以RMI为基础的协定,用来规范物件之间在网路上的沟通。
如同SUN公司所说:「网路就是电脑(The network is the computer)」。网路的出现提供了无限的计算资源,让我们可望达成一个超大型的计算系统。Java技术使得分散式计算变得容易可行,Jini 则实现网路就是一个超大型电脑的理想。
Jini白皮书什么是Jini?
Jini是Sun公司的研究与开发项目,它能极大扩展Java技术的能力。Jini技术可使范围广泛的多种硬件和软件---即可与网络相连的任何实体---能够自主联网。
Jini可以使人们极其简单地使用网络设备和网络服务,就象今天我们使用电话一样---通过网络拨号即插即用。Jini的目标是最大限度地简化与网络的交互性。
Jini利用了Java技术的优势。Jini包含了少量类库格式的Java代码和某些惯例,可在网络上创建一个Java虚拟机的"王国",就象我们人类创造一个社区一样。在这个王国里的人、设备、数据和应用程序等网络公民均被动态地连接起来,从而能够共享信息和执行任务。
主要趋势---网络的普及这个世界正在网络化。例如,在今天,一个企业要想取得成功就必须建立网络。商业网络正在不断扩大,而且已经能够与供应商和客户实现直接交互。与无线网络的交互也几乎成为家常便饭。企业和消费者都要求能与网络进行更广泛的交流。出差在外的人无不希望在到达饭店后就能把自己的计算机插入网络接口,不但能与自己单位的工作环境进行交互工作,而且还能与饭店的本地服务,如打印机或传真机等进行交互工作。父母可能希望只需使用移动电话或笔记本电脑就能与家里的摄像机相连,通过它来察看家里的情况。人们无不希望随时随地能够连接和立即使用本地的定制服务。在不远的将来,我们将看到网络渗透到很多其它环境。例如,将会出现把电视机和立体声设备等音频/视频设备与家庭办公室的电脑和外设连接起来的网络,并控制安全监视器和温控恒温器等网络设备。电缆和ASDL等高带宽媒介将为家庭提供全新的服务。服务供应商不断为驾驶员提供越来越多的服务,网络也必将随之进入汽车领域。除导航系统外,游览景点和当地餐馆名单等本地服务也将出现在驾驶员的屏幕上。只要汽车与远程诊断设备相连,它就能自动完成对汽车的维护,并在汽车出现问题时通知驾驶员。
商业机遇---网络服务Jini所能带来的商业机遇是新型的网络服务。
例如,产品制造商将在基于网络的产品上提供新的服务。例如,磁盘可被看作与网络相连的存储服务,能向磁带和其它新型服务提供自动存储备份。联网的摄像机可能将提供诸如安全监视等新型成像服务。这些新的服务使制造商成为新型的网络服务供应商。
Jini还能帮助传统的服务供应商提供新型服务。
例如,某媒体服务供应商可能希望向某消费者的家庭打印机提供报纸? 服务。无线服务供应商可能希望通过蜂窝电话提供相似的服务。
Jini还可简化对现有服务的管理。
在隔天交货的情况里,Jini简化了分布在各处的工人与网络连通的方式。在个人银行里,基于Jini的计算机和外设可简化分行的系统管理。对于无线服务供应商,Jini可使蜂窝电话具备类似于电话的网络功能:屏幕大小、处理能力、使所提供的服务根据每一部电话的特点而专门设计。
问题是……
问题是,在今天的环境中,联网还是太复杂了。例如,无论是把PC连接到网络上,还是使用联网的打印机都非常复杂。只有经验丰富的系统管理员才有能力处理装载驱动程序、设置配置文件等复杂的工作。显然,我们不可能指望一般消费者也能管理今天这样复杂的网络。
今天的网络还很脆弱和很不灵活。对网络稍加改动就可能造成不可挽救的大混乱。向网络中添加诸如磁盘存储等功能的过程也很复杂。例如,要想添加一个磁盘驱动器,我们就必须打开机箱,处理设置跳线器,并解决一系列复杂的设置问题。即使专家也会头疼。
实际上,从消费者的角度看,他们所需要的只不过是把硬件和软件插入联网的环境,并立即就能使用可用的服务:就象我们今天插接电话一样。在今天,当消费者从商店购买一部电话后,他不必对电话进行配置。消费者只需给电话服务供应商打一个电话,服务就会送上门。最后,消费者只需把电话插好,就能使用电话服务了。自主的联网。
Jini的价值Jini的作用就是能简化与网络的交互性。
从消费者的角度看,消费者把可插接的设备和软件插入网络,就像今天插接一部电话一样简单。
从传统服务供应商的角度看,Jini简化了Services Delivery (服务提供)的管理。设备不但能向网络推出增值服务,而且还能提供设备的属性和功能。现在,服务供应商可以针对每台设备设计服务。当然,Jini还将有可能打开一扇通向新的网络化服务的大门。
从产品制造商的角度看,Jini打开了全新的市场。因为Jini简化了设备向网络提供增值服务的能力。所以,产品就不仅仅作为商品而投入竞争,而是作为增值服务的产品参与竞争。
从Java程序员的角度看,Jini简化了编写分布式应用程序的工作,因而,任何Java程序员都能利用基于Jini的新设备编写应用程序和服务。因此,企业不再需要聘用有限的专家资源编写分布式应用程序,任何Java程序员都能为基于Jini的网络开发服务。
Jini的起源Bill Joy在1994年之前向Sun公司实验室提交了一份包括以下三个主要概念的建议书:
可在所有平台上运行的语言运行该语言的虚拟机,和允许分布式虚拟机像单一系统那样工作的网络化系统到1995年,这种语言和虚拟机相继面市,即Java编程语言和Java虚拟机。但该系统的概念则仍保留在Sun公司的研究与开发实验室,作进一步的研究和开发。这个系统的概念就是Jini。
Jini战略部署与合作伙伴Sun公司部署了广泛的战略,力求将Jini推向市场。我们可以这样说,Jini与任何向网络化环境提*品和/或服务的企业都密切相关。这包括传统的设备制造商、服务供应商和软件开发商。
Jini将如何进行授权?
为推动Jini的进一步创新,使其尽快被市场所接受,Jini源代码将象Netscape公司的Mozilla模型一样向所有开发商公开。为确保兼容性和质量,正在考虑对商业产品进行标记。围绕授权方式的很多具体细节目前仍在最后确定过程之中。拟议中的授权草案将于今年8月公布。
Jini技术概述
Jini技术可划分为两个范畴:体系结构和分布式编程。此外,还将提供在Jini上运行的网络服务。
基础结构
Jini基础结构解决设备和软件如何与网络连接并进行注册等基本问题。
基础结构的第一种要素称作Discovery and Join (发现与联合)。Discovery and Join解决设备和应用程序在对网络一无所知的情况下如何向网络进行首次注册这样的难题。
基础结构的第二个要素是Lookup (搜索)。Lookup可被看作网络中所有服务的公告板。
Network Services ---网络服务Other Services ---其它服务Leasing ---租用Transactions ---交易Distributed Event---分布式事件Other OS ---其它操作系统Other CPU ---其它CPU DISCOVERY AND JOIN 设备或应用程序插入网络后需要完成的第一个任务就是发现该网络,并使网络发现该设备或应用程序。我们之所以使用Discovery and Join这样的说法,是因为设备或应用程序事前不可能对网络有任何了解。
Discovery的工作原理如下:
当基于Jini的设备插入网络后,它就通过一个众所周知的端口向网络发送一个512字节的多路广播Discovery包。在其它信息中,该包包含对自己的引用。
Jini Lookup在众所周知的端口上进行监听。当接收到Discovery包后,Lookup就利用该设备的接口将Lookup的接口传递回插接的设备或应用程序。
现在,该设备或应用程序已经发现了该网络,并准备将其所有特性上载到Jini Lookup。上载特性是Discovery and Join中Join这方面的特性。
现在该设备或应用程序使用在Discovery阶段所接收到的Lookup接口与网络相连。上载到Lookup的特性包括该设备或应用程序所提供的所有增值服务(如驱动程序、帮助向导、属性等)。
LookupLookup是网络上所有服务的网络公告板。Lookup不但存储着指向网络上服务的指针,而且还存储着这些服务的代码和/或代码指针。
例如,当打印机向Lookup注册时,打印机将打印机驱动程序或驱动程序接口上载到Lookup。当客户机需要使用打印机时,该驱动程序和驱动程序接口就会从Lookup下载到客户机。这样,就不必事先把驱动程序装载到客户机上。
打印机还可能把其它增值服务装载入Lookup。例如,打印机可能存储关于自己的属性(如它是否支持postscript,或它是否为彩色打印机)。打印机还可能存储可在客户机上运行的帮助向导。
如果网络上没有Lookup,则网络就会使用一个Peer Lookup (对等Lookup )程序。当需要服务的客户机在网络上找不到Lookup时,Peer Lookup就开始工作。在这种情况下,客户机可发送与Lookup所用的相同的Discovery and Join包,并要求任何服务供应商进行注册。随后,服务供应商就会在客户机上注册,尽管那不是Lookup。
分布式编程Jini分布式编程为Java增添了创建分布式系统所必需的其它功能。尤其是Jini分布式编程可提供租用、分布式交易和分布式事件。
租用租用与租用一套公寓很类似。我们在租用一套公寓时,一般会商定使用该公寓的时间。类似地,在Jini中,对象彼此之间商定租期。例如,当某设备使用Discovery and Join协议发现网络时,它就注册一段租用时间。在租约到期之前,该设备必须重新商定租期。这样,如果租约到期或设备拔下后,该设备在Lookup中的记录就会被自动删除。这就是分布式垃圾收集的工作原理。
分布式事件在单一的计算机中,事件肯定能被接收方接收到,序列也肯定能按照顺序进行。
但在分布式环境中,分布的事件可能不是按照顺序被接收,或者,某个事件还可能丢失。
为便于在Java环境中处理分布的事件,Jini为分布的事件提供了一个简单的Java API。例如,当一个分布的事件发生时,该事件都带有一个事件号和序列号。利用这种信息,接收方就能检查事件是否丢失(序列号丢失)或事件是否按照顺序接收(序列号顺序不对)到。
分布式交易在分布式Java环境中,有时需要一种很简便的方法,来确保在整个交易完成之前,在该交易中发生的所有事件都被真正提交了(两阶段提交)。
为便于进行此类分布式计算,Jini提供了一种简单的Java API。该API可使对象起动一个能管理交易的交易管理器。每个参与交易的对象都向交易管理器注册。
当交易发生时,如果某个参与的对象说,交易中的某个事件没有发生,则此信息就被送回交易管理器。随后,交易管理器就告诉所有参与的对象回滚(rool back)到前一个已知状态。类似地,如果所有对象都完成了其交易的过程,则整个交易就向前进行。
Jini上的网络服务在Jini基础结构和分布式编程之上,可提供便于分布式计算的网络服务。JavaSpace就是这样的一种网络服务。
欲知有关JavaSpace的详细情况,请访问http://java.sun.com/products/javaspace我们期待着将来在Jini上建立更多其它的网络服务。
欲知有关Jini技术的详细情况,请访问http://java.sun.com/products/
Jini技术基础结构
Jini技术的即插即用的基础结构主要由三组协议组成:查找(Lookup)、发现(Discovery)和加入(Join)。查找服务是分布式Jini系统的基本组成部分,提供了在分布式Jini系统中服务的*注册机制。在Jini系统中,程序找到服务的首选方法是通过查找服务,而且查找服务也是提供给管理员和用户各种访问接口的基础。
查找服务的服务模型
查找服务保存了一个服务的表,表中的每个元素代表了系统中可用的一项服务,其中保存了访问这项服务所需要的代码和一系列可扩充的描述服务的属性。打个比方,查找服务就像电话簿,Jini系统中的服务就像电话簿中的用户,查找服务中保存的信息就是用户的电话号码。也就是说,凡是需要访问Jini系统中的服务,就必须知道查找服务中保存的“电话号码”。但是查找服务有不少超过电话簿的优点,例如:查找服务保存的是一个动态的“电话簿”,而且,系统中的服务可以在“电话簿”中主动加入和去掉自己的“电话号码”,而查找服务也完全支持这种机制。而在以后的内容里,我们会发现更多的不同点。
当服务在查找服务中注册后,会产生一个通知事件。系统管理员可以利用查找服务中的事件回调机制来收到这个通知。这就有利于系统管理员管理和维护系统。而且服务也会提供设置自身的用户界面,这个用户界面可以作为服务的属性保存到查找服务中。管理员能轻松地设置服务,不用忙着到处找各种各样的驱动程序和管理软件。
在服务的有效期内,如果服务遇到问题需要引起管理员的注意,例如打印服务发现纸张短缺服务就增加一个属性来指明问题。更改后的结果会保存到查找服务中。这时,同上所述,管理员利用查找服务的事件回调机制来收到上述问题的通知。有了这个有力的机制,大大减轻了系统管理员的负担。
发现协议和加入协议
网络中的服务在启动后,怎样加入到分布式Jini系统中,成为Jini系统中的服务,有两个重要的必不可少的步骤。第一步肯定是找到系统中的查找服务,这个过程就是Discovery过程,用到的协议就是发现协议。第二步就是把自己注册到查找服务中,这个过程是Join过程,描述这个过程的协议就是Join协议。一项服务在完成了这两步后,就真正成为了Jini系统中的一位成员。为了准确地描述这两个协议,先介绍一下用到的术语。
主机。拥有一或多个Java虚拟机并且能加入网络的一个硬件设备被称为主机组。一组Jini服务所组成的集合。组的名字是任意的字符串,用来描述该组的性质。
Discovery实体。Discovery实体就是处于同一主机内,将要开始,或者正处在找到查找服务的过程中一个或多个相互协作的Java语言中的对象的集合。
Join实体。Join实体就是处于同一主机内,已经获得了查找服务,处于从查找服务中查询服务或者将自己注册到Jini系统内过程中的一个或多个相互协作的Java语言中的对象的集合。在以后的文章中,为了方便描述,将Discovery实体和Join实体统称为实体。
Jini系统中的服务包括的范围很广,包括各种纯软件的服务和硬件设备的服务。如果一台主机希望加入Jini系统,成为Jini系统中的一项服务,需要具备以下几个条件:首先需要一个能够运行Jini代码的Java虚拟机;其次需要一个正确配置的网络协议栈。这个网络协议栈随着网络协议的不同而改变。这里假定采用的网络层的协议是IP协议,此时以下几个条件是必不可少的:IP地址(IP地址或者是静态IP地址,或者是由主机利用DHCP协议来取得的动态IP地址);支持TCP协议和UDP多点传送协议(在Discovery过程中会用到这两种协议)。举个例子,一台联网的、安装了JDK(Java开发工具包)的个人电脑就是一台主机。
每个查找服务都有相关联的组,这样可以使Jini系统中的服务结构更有层次感。例如:一个特定的查找服务可以属于打印设备组,任何打印服务都可以注册到该查找服务中。当然,组都是预定义的。在Discovery的过程中,Discovery实体确定自己感兴趣的组,也就是自己希望加入的组,如果找到的查找服务也属于这样的组,Discovery实体就加入到这个查找服务中。这就避免了查找服务的结构过于庞大,把组织系统中服务的责任分摊给系统中多个不同的查找服务。目前,组的命名还没有一个明确的规范,Sun公司只是希望组的名字最好符合网络域名的命名规范,但是目前并没有给出如何定义组的名字的详细规范。我们相信在未来的发展过程中,随着对Jini系统中服务的组织结构层次性要求的提高,这种命名规范会随之完善起来的。
1.发现
在Discovery实体和查找服务交互过程中用到的协议一共有三个,分别是:多点传送请求协议(multicast request protocol)、多点传送宣布协议(multicast announcement protocol)和单点传送发现协议(unicast Discovery protocol)。这里首先对这三个协议进行简单的介绍。
多点传送请求协议。Discovery实体使用该协议以发现Jini系统中存在的查找服务。这个协议可用于设计浏览Jini系统中的服务的浏览器。
多点传送宣布协议。查找服务在启动后或者在网络崩溃的恢复过程中,利用该协议在系统中发布自己存在的数据报。
单点传送发现协议。当Discovery实体和查找服务中有一个知道了另一个的网络地址和端口号时,就采用该协议来主动建立两者之间点到点的通讯。
在Discovery的过程中,Discovery实体和查找服务的联系是建立在socket层上的。两者既是客户方,也是服务方。在通讯的过程中,分为两个阶段。
第一个阶段:Discovery实体和查找服务各自都建立了一个单点传送服务的服务器,可以理解为普通的Internet服务器,例如FTP协议中的FTP服务器,目的就是让Discovery实体和查找服务能够建立与对方的点到点的连接。现在面临的问题是:如何让双方知道对方的服务器地址?在第二个阶段的描述中会找到这个问题的答案。
第二个阶段:此时Discovery实体和查找服务都不知道对方的网络地址,但是根据Jini系统的要求,双方在网络层加入了特定的多点传送的组(这个组不是Jini系统中的组的概念,而是指网络协议中的组),而且双方都知道对方加入的网络组的组地址。由于网络协议支持向网络组中所有机器同时发送UDP数据包,利用这个特性,双方都向对方所属的组发送数据包。Discovery实体发送数据包的过程称为多点传送请求,在查找服务中发送数据包的过程称为多点传送广播宣布。在两者发送的数据包中都保存了各自的地址和其它必要信息。同时,双方都建立了一个收听发向本组的UDP数据包的服务器。Discovery实体所建立的服务器的服务称为多点传送广播收听服务,在查找服务中建立的服务器的服务称为多点传送广播请求服务。服务器把收到的数据包进行解码,就可以知道客户方的地址。在这个阶段中用到的协议就是多点传送请求协议和多点传送宣布协议。这时,Discovery过程就进入了第三个阶段。
第三个阶段:此时Discovery实体和查找服务中有一个已经知道另一个的网络地址。这时双方就利用unicast 发现协议来进行通讯。协议的步骤如下:
第一步: 这一步有两个对等的过程。当查找服务的单点传送服务器收到Discovery实体的连接请求后,就建立了与Discovery实体的连接;或者是Discovery的单点传送服务器收到查找服务的连接请求,建立与查找服务的连接。两者之中那一个首先发起连接是等价的。双方都创建了一个线程来负责创建与对方服务器的连接。
第二步:当Discovery实体和查找服务建立连接后,由Discovery实体主动发送一个特定Discovery请求后,查找服务就把以后所需要用到的Java语言中的对象(帮助Discovery实体加入到查找服务中的对象)传给Discovery实体。
有时已经发现并加入系统的实体会再次使用发现协议。例如,一个实体需要确定特定的查找服务是否还在运行,或者关心是否有新的服务进入,以及其他诸如此类的问题。这时就会再次使用发现协议。
在Discovery实体的Discovery过程中,这三个发现协议互相协作。当实体启动的时候,使用多点传送请求协议来找到附近的查找服务;为了避免加重网络的负担,在经过一段时间后实体就会停止使用该协议,转变为利用多点传送宣布协议来收听查找服务的广播。在具体的实现中,这三个协议都是作为独立的线程来实现的,由Discovery实体来负责协调这三个线程的运行。
2.加入
Join协议向已经找到查找服务的服务提供了一系列应该遵循的标准步骤。当服务遵循这些步骤后就可以在查找服务中注册以加入Jini系统。值得注意的是,加入并不意味着简单的注册,而维持系统正确运行是加入的核心内容。
由于Jini系统是一个分布式系统,为了使系统在各种情况下正常运行,设计者对网络系统崩溃后系统的恢复和系统持久运行的能力特别重视。所以在实现时,Jini系统中的服务都保存了必须保存的永久状态信息。这些信息如下:
1)表示服务在Jini系统中的标识符。服务在不同的查找服务中注册的服务标识符是唯一的。
2)服务具备的属性。这些属性是Java语言中的对象。服务的属性描述了服务的状态。如果服务的状态改变了,那就必须修改属性以适应这个改变。为了保证Jini系统中状态的一致性,服务保存更改后的属性后,必须在每个已经注册的查找服务中做同样的更改。
3)一套服务想要加入的组的集合。
4)必须注册的特定的查找服务。对于这些查找服务,服务必须注册到该查找服务中,而不论查找服务所属的组是否服务希望加入的组。
每个服务都维持了一份它所注册过的查找服务的表和一份租约表。当服务在特定的查找服务中注册后,会得到一份租约,服务会分别把租约和这个查找服务加入到上述的表中。服务对租约定期续借来保证注册的有效性。如果服务需要退出特定的查找服务,服务就会取消和这个查找服务相关联的所有租约。由于租约机制的引入,使得不会出现系统资源不可回收的现象,增强了系统的鲁棒性。
每一个Jini设备通过实现Dicovery和Join协议,就可以随时随地加入或退出Jini系统,从而达到即插即用的效果。
拥抱Jini:从Starter Kit 2.0开始(第一部分)
肖文鹏
北京理工大学的硕士研究生
2003 年 8 月 25 日
Jini代表着分布式计算技术的深刻革命,其目的是通过对分布式资源的高效处理,将网络逐渐变成一个方便灵活且易于管理的工具,这样用户或任何其它可计算实体在Jini系统中都能够很方便地发现对其有用的资源,从而完成各种分布式计算。本文第一部分介绍了Jini的基本概念和实现原理,在本文的第二部分作者将介绍借助Jini Technology Starter Kit v2.0如何开发基于Jini的软件系统。
Jini代表着分布式计算技术的深刻革命,其目的是通过对分布式资源的高效处理,将网络逐渐变成一个方便灵活且易于管理的工具,这样用户或任何其它可计算实体在Jini系统中都能够很方便地发现对其有用的资源,从而完成各种分布式计算。本文第一部分介绍了Jini的基本概念和实现原理,在本文的第二部分作者将介绍借助Jini Technology Starter Kit v2.0如何开发基于Jini的软件系统。
为何求助Jini?
从计算机诞生那天起,在如何更好地将计算机互连起来以便充分利用各种资源这一问题上,人们从来没有停止过辛勤探索的脚步。从大型机到PC机,从局域网到广域网再到后来的Internet,整个世界似乎经历了一次网络化的大洗礼。现在,随着嵌入式设备的大量使用,无所不在的网络和无所不在的计算(everything connecting, everywhere computing)又在逐渐将人类带入一个崭新的信息社会。
一切都非常令人兴奋,并且随之而来各种电子设备的互联也将成为一种必然的趋势。今后,与人们生活息息相关的各种家电设备都能够联成网络并接入Internet,人们可以在任何时间、任何地点统一控制各种家电,让它们协同工作,从而将极大地影响和改变目前的生活方式。比如,在将电视机接入Internet后,你就可以通过电视机来浏览网页,获取所需的信息;又比如,你可以在下班前一小时,通过Internet控制家里的电饭煲和微波炉开始工作,这样当你到家时晚饭已经做好了;再比如……
可问题是现在联网还是太复杂了,无论是要把一台PC机连接到网络上,或者是使用联网的打印机,都是一件非常困难的事情,至少对一般的消费者来讲是这样。而类似安装驱动程序、修改配置文件等"专业性"的工作,更加只有那些经过严格训练并且经验丰富的系统管理员才有可能胜任。另一方面,目前的网络还相当脆弱,并且很不灵活,仅仅只对某些关键部件稍加改动很可能就会造成网络的一片混乱。而像添加磁盘驱动器这类看似非常简单的事情,管理员也必须先打开机箱,设置跳线,并解决一系列复杂的软件设置问题。
解决这个问题的办法是提出一种全新的分布式计算概念,使得任何设备无需预先配置和安装,便可在任何时间任何地点加入网络,并且能和网络中已有的各种软硬件一起协调工作完成计算。正是在这一思想的指引下,产生了Jini这一新的分布式计算平台,Jini的设计理念就是要让用户在使用计算机周边产品或嵌入式电器时,能像使用电话一样方便。从消费者的角度看,如果你想安装电话,只要申请到一个电话号码,再去买个电话机,然后把插头往墙壁上的插座一插,拿起话筒听到嗡嗡声后就可以正常使用了,不需要对电话进行任何配置。Jini的目标正是要在可靠性、可配置性和可管理性等方面达到类似于电话系统那样的水平,使得任何硬件或者软件只要进入网络这一大环境,就能够立即使用所有可用的服务,而不需要那么多烦琐的配置过程。
Jini是什么?
Jini是以Java技术为核心的分布式系统,它通过使用一个简易的"即插即用"模型,能够随时改变硬件或者软件的配置,从而提供了一个支持快速配置的分布式计算环境。Jini的迷人之处在于它能够使各种数字设备无需配置、安装或者人工干预,就能够在一个临时的称为服务联盟(federations of services)的设备集合*同工作。联盟中的任何设备无论大小都可以自行管理,共同组成一个服务网络,联盟中的每一个成员都可以为其它成员提供资源或服务,同时又可以从其它成员那里获取自己所需的资源和服务,Jini提供一套完善的机制使得硬件设备或者软件组件能够随时加入或者退出联盟。
Jini是一个主动的、响应式的分布式基础结构,它提供了在分布式环境中进行服务的建立、查找、通讯和调用的一整套机制。Jini技术被设计成可以运用在任何有能力连入网络的器件上,而不论该器件运行什么软件或运行在哪种硬件设备之上。Jini技术是以网络器件中的一个构件的面貌出现的,它为器件如何连入网络、共享信息和与网络进行互操作建立了一套规则,而同时又保持了对用户的完全透明。Jini本身与平台无关,采用它的器件不再受到所用软件、处理器、设备驱动器,或传统网络协议的制约,其唯一要求只是一个能够运行Java字节码的虚拟机,如图1所示。
图1 Jini运行环境
提出Jini这一体系结构的目标是将成组的硬件设备和软件组件联合成一个单一的、动态的分布式系统,联合后的网络系统更加易于管理和使用,同时在保持单机的灵活性、统一响应和控制的情况下,还能够支持由系统提供的共享能力。Jini这一体系结构中有几个非常重要概念:
· 服务(Service)
服务是一个独立的功能实体,它可以被人、程序或者其它服务使用。服务这一概念在Jini中包括的内涵非常丰富,它可以是一次计算过程或者存储操作,也可以是和另一个用户交流的通道,甚至可以是一个硬件设备或者另一个用户。Jini系统中成员间的联盟是为了对服务进行共享访问,一个Jini联盟不应被简单地看成是客户机和服务器的集合,而应当看作是组合到一起完成某个特定任务的服务集合。Jini提供了相应的机制,能够在分布式系统中实现对服务的构造、查找、通信和调用,同时还提供了一套服务协议来负责服务间的通信。
· 客户(Client)
Jini中的客户是需要利用服务的硬件设备或软件组件,Jini的目标是支持尽可能多的异构客户,包括各种硬件设备和软件平台。
· 查找服务(Lookup Service)
是Jini中的一种服务协议,它允许软硬件发现网络并变成联盟中的成员,同时将所提供的服务广播给联盟中的其它成员。
Jini如何工作?
一个完整的Jini系统由基础设施(Infrastructure)、编程模型(Programming Model)、服务(Services)三个部分组成,其体系结构如图2所示。
图2 Jini系统架构
3.1 基础设施
基础设施用来定义基于Jini的硬件设备和软件组件如何连接并注册到网络,它包括以下四个组成部分:
· Java RMI扩展实现 这是Jini系统中的构件在通信时所采用的底层通信机制。
· 分布式安全系统 用来将Java平台的安全模型扩展到分布式Jini系统,并定义联盟成员的使用权限。
· 发现/加入(Discovery/Join)协议 是一种服务协议,允许软硬件发现网络并成为联盟的成员,同时将所提供的服务广播给联盟中的其它成员。
· 查找(Lookup)服务 是网络中所有服务的公告牌(bulletin board),用来展示联盟中的所有成员,并且帮助使用者在联盟中寻找所需的资源和服务。
Jini基础设施负责实现添加、删除、定位和访问服务的相关机制,它通常驻留在网络中的三个地方:在查找服务中;在服务提供者中;或者在客户中。Jini基础设施的核心是Lookup、Discovery和Join三条协议,它们使得基于Jini的任何服务都可以随时加入或者退出联盟,并且在加入联盟时无需进行安装和配置,从而达到了即插即用的效果。
查找服务(Lookup Service) 是Jini体系结构中的基本组成部分,它负责在分布式系统中提供对服务的*注册机制。一旦进入Jini的世界,如果想找到所需的服务就必须通过查找服务,此外,查找服务还是为管理员和用户提供各种访问接口的基础。在一定程度上你可以将查找服务看成是网络中所有服务的公告牌,它维护着各个服务所提供的功能接口与实现该服务的对象集间的映射关系。Jini中的客户通过使用查找服务在分布式网络中查找和调用所需的服务,而查找服务中的对象本身可以包含其它查找服务,从而构成层次式的查找服务。
当硬件设备或者应用程序进入网络时,它所提供的服务如何被Jini发现并接纳,并进一步成为整个Jini分布式系统中的某项服务,需要经过两个必不可少的重要步骤。第一步是找到系统中的查找服务,这个过程称为发现(Discovery),所用到的协议是发现协议。第二步是将自己注册到查找服务中,这个过程称为加入(Join),描述这个过程的协议是Join协议。一个Jini服务只有在成功完成了这两个步骤之后,才能正式成为联盟中的一员,并开始向外界提供相应的服务。
在Jini这一分布式计算环境中,服务提供者所提供的服务既可能是硬件也可能是软件。当某一服务提供者需要加入到Jini系统中时,它首先必须找到网络中的查找服务,于是它在局域网中进行广播,请求加入到查找服务中。附近的查找服务在收到相应的请求后负责识别并接纳该服务,整个过程称之为发现,如图3所示。需要注意的是,服务提供者必须包含用于通讯的服务对象(service object)和描述该服务特点的服务属性(service attributes)。
图3 发现过程
当查找服务找到之后,服务提供者将与查找服务直接进行通讯,把自己的服务对象和服务属性注册到查找服务中,换句话说就是把服务对象和服务属性发送到查找服务中去。这个过程称为加入,如图4所示。
图4 加入过程
一旦服务被成功地加入到查找服务中后,如果Jini系统中的客户需要使用该服务,它可以根据服务的类型或者属性向查找服务查询合适的服务,查找服务负责把查询后的结果返回给客户,当客户决定使用该服务时,查找服务还会将该服务对象的拷贝发送给客户,如图5所示。
图5 查找过程
Jini客户从查找服务那里获得的服务对象是一个Java接口(Interface),其中包括用来调用服务的方法名称和参数,以及其它一些描述信息。Jini客户通过获得的服务对象与服务提供者进行直接联系,获得相应的服务。服务对象负责处理客户与服务提供者之间的通信,从而向用户隐藏了服务的具体实现细节,如图6所示。
图6 服务过程
3.2 编程模型
Jini是一个分布式的计算环境,其编程模型自然也是分布式的,编程模型在Jini的体系结构中占有非常重要的地位,其基础设施正是借助这一编程模型有机地结合在了一起。Jini的编程模型主要包括下面几个方面:
· 租用(Leasing)
在分布式系统中有一个非常严重的问题,那就是不能保证服务不突然崩溃。例如,当一台数字相机通过查找服务加入到Jini网络中时,将对外发布信息表明自己可用且一切正常,但如果此时用户在不正常关闭设备的情况下随意将相机拔掉,相应的问题就产生了。因为对联盟中的其他成员来说,此时它们无法判断是相机所连接的远程主机已经关掉,还是响应速度比较慢,或是相机本身产生了故障。为了解决这个问题,Jini使用了一种称为租用的技术。租用的基本思想是:不再保证可以在任意长的时间内访问资源,而是只能在一段固定时间内将资源"借给"某使用者。租用机制使得客户对服务的访问是基于租约的,租约保证了一段时间内的授权访问,租约必须在服务的使用者和服务提供者之间进行协商。租约在到期之前如果不续约的话,相应的资源将被释放。租约可以是唯一的,也可以不是唯一的,非唯一租约允许多用户共享同一资源。
· 分布式事件(Distributed events)
和Java类似,Jini也使用事件的概念来处理异步通知,事件可以被理解成是一个包含外部状态变化信息的对象。例如,当鼠标状态在AWT中发生变化时,不论是移动、点击还是释放,都将产生一个MouseEvent事件,事件产生后将被直接发送到希望得到该信息的相关实体(Listener)。Jini的事件模型和Java的非常类似,但它同时还能够支持分布式事件。Jini的编程模型允许一个对象注册对其他对象感兴趣的事件,并且在该事件发生时能立即得到相应的通知,这就使得基于事件的分布式程序能以有多种可靠性和扩展性保证的方式编写。
· 事务(Transaction)
分布式计算中另一个非常棘手的问题是部分失败,所谓部分失败指的是整个计算过程中的某一步产生了错误,或者计算所需的某个组成部分出现了故障。假如,银行想在两个帐户间进行转帐,即从一个帐户中减去一定数量的金额然后加到另一个帐户上,是不是只要编写一段代码实现从A帐户中减去一定的金额,然后再用另外一段代码实现向B帐户中加入同样的金额就可以了呢?看起来似乎没有什么问题,但实际上却存在非常严重的错误,如果资金从帐户A转出之后机器就崩溃了,很明显B将永远无法得到,而产生这一问题的根本原因就是没有考虑到程序可能会部分失败。 Jini通过引入事务的概念解决了部分失败这一问题,事务是将一系列相关操作进行分组,以保证所有操作要么全部成功,要么全部失败的一种方法。采用事务的好处是无论在执行过程中出现什么情况,系统都将进入一个确定的状态,这样处理起来就相对容易多了:事务成功则继续进行,事务失败则稍后再试。事务最早出现在数据库理论中,目前已经出现了许多实用的事务模型,Jini中采用的是两阶段提交(two-phase commit)这一事务模型。
3.3 服务
Jini的基础设施和编程模式使得服务能够在分布式环境中被注册和发现,并能够向用户宣布自己的存在。服务是Jini体系结构中一个非常重要的概念,它可以用来表示组织在一起形成Jini联盟的各个实体,这里所指的实体可以是硬件、软件或者软硬件的结合。
Jini中的每个服务都有一个接口描述,该接口定义了客户可以向这个服务请求的所有操作,并且反映了服务的类型。Jini中的服务是可以聚合的,即允许一个服务由多个子服务组合而成。整个Jini体系结构中最重要的一个服务是查找服务,它是Jini基础设施的一个子组件,其它作为Jini体系结构组成部分并实现为Jini服务的对象包括:
· JavaSpace 为Jini中的对象提供了一个可选的分布式持续性保存机制,并能够被用来进行简单的通信。
· 事务管理器 为Jini中的对象提供分布式事务服务,允许对象参与到由编程模式所定义的两阶段提交协议。
怎样启动Jini?
Jini目前还处于研发的早期阶段,因此迄今为止还没有哪个Jini实现系统声称它可以真正投入实际使用,自然也就没有完全遵循Jini规范的服务或者设备出现。尽管如此,Jini试图去解决的问题对许多软硬件厂商来讲已经非常急切了,因此Sun公司给出了一个Jini的参考实现系统:Jini Technology Starter Kit,它可以从 http://wwws.sun.com/software/jini/下载到,目前的最新版本是2.0。
从Sun公司的网站下载到Jini Technology Starter Kit Version 2.0的源码包jini-2_0-src.zip后,将其解压缩到d:\ jini2_0\目录下。由于Jini建立在一系列其他服务的基础之上,因此在正式启动Jini之前还必须先对这些服务进行配置,Jini Technology Starter Kit开发包中集成了一些支持Jini运行所必需的基本服务:
· HTTP服务器
在通过RMI下载代码时,需要利用HTTP协议完成传输,因此在运行Jini时需要一个HTTP服务器。Jini Technology Starter Kit带有一个非常简单的HTTP服务器,但它对于供在应用程序间传送代码已经完全足够了。通常情况下,需要在每个供其他应用程序下载代码的机器上运行一个HTTP服务器。
· RMI激活守护进程
这是Jini Technology Starter Kit基础结构中非常实用的一个部分,它使得那些很少被调用的对象基本保持在"睡眠"状态,在需要时又能够被自动"唤醒"。RMI激活守护进程负责管理对象在活跃和非活跃状态间的切换,并被其他Jini运行时核心服务所调用,它至少应该在查找服务所处的主机上运行。
· 查找服务
查找服务才是Jini的核心,它负责记录网络中当前激活的所有服务。尽管JDK中的RMI注册服务也可以作为查找服务使用,但不推荐使用,Jini Technology Starter Kit中提供的查找服务具有更加丰富和完善的功能。当出现故障或重新启动之后,查找服务需要依靠RMI激活守护进程来恢复其状态,因此在运行查找服务的机器上必须同时运行RMI激活守护进程。
Jini Technology Starter Kit v2.0在它的tools.jar包中自带了一个HTTP服务器,你可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件来启动它:
清单1:start-httpd.bat @rem 启动HTTP服务器的批处理文件 java -jar lib\tools.jar -port 8080 -dir lib -verbose |
缺省情况下,HTTP服务器将运行在8080端口,但如果此时系统中已经有一个Web服务器运行在8080端口了,那么可以用"-port"参数把Jini的HTTP服务器指定到另外的端口。参数"-dir"可以用来设置HTTP服务器的根目录,在上面的例子中将其设置为Jini的lib目录,这样做的好处是Jini的核心代码可以被直接下载。最后那个参数"-verbose"是用于调试的,它要求HTTP服务器显示所有来自客户端的请求信息以及这些请求的来源。
RMI激活守护进程rmid是由JDK所提供的,它必须在可激活对象所在的每一台主机上运行,其中包括Jini查找服务、事务管理器和JavaSpace。如果你已经成功地配置好了JDK,那么可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件来启动它:
清单2:start-rmid.bat @rem 启动RMI激活守护进程的批处理文件 rmid -J-Dsun.rmi.activation.execPolicy=none |
Jini Technology Starter Kit v2.0中查找服务的实现是Reggie,它位于reggie.jar包中,启动这个服务比启动其他服务要稍微复杂一些。首先在d:\jini2_0\config\目录下为Reggie创建一个内容如下的安全策略文件:
清单3:all.policy /* 安全策略文件 */ grant codeBase "file:lib${/}*" { permission java.security.AllPermission; }; |
接着在d:\jini2_0\config\目录下为Reggie创建一个内容如下的启动配置文件:
清单4:start-reggie.config /* 启动Reggie查找服务的配置文件 */ import com.sun.jini.config.ConfigUtil; import com.sun.jini.start.NonActivatableServiceDescriptor; import com.sun.jini.start.ServiceDescriptor; com.sun.jini.start { private static codebase = ConfigUtil.concat( new Object[] { "http://", ConfigUtil.getHostName(), ":8080/reggie-dl.jar" }); private static policy = "config${/}all.policy"; private static classpath = "lib${/}reggie.jar"; private static config = "config${/}reggie.config"; static serviceDescriptors = new ServiceDescriptor[] { new NonActivatableServiceDescriptor( codebase, policy, classpath, "com.sun.jini.reggie.TransientRegistrarImpl", new String[] { config }) }; } |
最后再在d:\jini2_0\config\目录下为Reggie创建一个内容如下的配置文件:
清单5:reggie.config /* Reggie查找服务的配置文件 */ import net.jini.jrmp.JrmpExporter; com.sun.jini.reggie {
serverExporter = new JrmpExporter(); initialMemberGroups = new String[] { "example.jini.sun.com" }; } |
为了简化Reggie查找服务的启动,可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件:
清单6:start-reggie.bat @rem 启动Reggie查找服务的批处理文件 java -Djava.security.policy=config\all.policy -jar lib\start.jar config\start-reggie.config |
这样在需要启动HTTP服务器、RMI激活守护进程或者Reggie查找服务时,只用在命令行方式下依次执行下面的命令就可以了:
D:\jini2_0> start script\start-httpd D:\jini2_0> start script\start-rmid D:\jini2_0> start script\start-reggie |
在Jini的世界中,所有可用的资源都被看成是服务,而对服务的查询和检索则是最频繁的操作之一,为此Jini Technology Starter Kit v2.0专用提供了一个实用工具Browser,利用它可以查询当前Jini网络中的所有服务。为了简化Browser的启动,可以在d:\jini2_0\script\目录下创建一个内容如下的批处理文件:
清单7:start-browser.bat @rem 启动Browser的批处理文件 java -Djava.security.policy=config\all.policy -Djava.rmi.server.codebase= http://%computername%:8080/browser-dl.jar -jar lib\browser.jar |
现在只要在命令行方式下依次执行下面的命令就可以启动Browser了:
D:\jini2_0> start script\start-browser |
正如前面介绍过的,查找服务是Jini中的一项特殊服务,因而此时如果Reggie查找服务已经正常启动了,那么可以在Browser中查询到它,如图7所示。为了监视Jini查找服务的运行状态,你可以让Browser一直运行下去。
图7 查询Jini服务
小结
Jini在很大程度上改变了人们对网络的看法,它以Java技术为依托,把网络上的各种硬件设备和软件组件联合成单一的、动态的分布式系统,从而使网络更易于操纵和管理,并具有更高的可配置性。Jini的目标是将所有可以联网的软硬件资源组织成一个完全自发的网络,使网络中不再需要手工的设备配制、驱动安装等专业性较强的工作。
参考资料
1. Jini Technology Starter Kit是Sun公司的一个Jini参考实现,它可以从 http://wwws.sun.com/software/jini/下载到。
2. 从 http://www.jini.org网站开始可以找到许多与Jini相关的资源。
3. California Software Labs网站上的Jini by Example( http://www.cswl.com/whiteppr/tutorials/jini.html#intro)是一篇不错的Jini入门读物。
4. Jan Newmarch's个人网站上的Guide to JINI Technologies( http://jan.netcomp.monash.edu.au/java/jini/tutorial/Jini.xml)是一篇非常优秀的Jini教程。
5. 有关Jini的FAQ可以在 http://www.artima.com/jini/faq.html找到。
6. San Diego州立大学网站上的Java Distributed Computing( http://www.eli.sdsu.edu/courses/spring99/cs696/notes/)详细讨论了Java分布式计算所涉及到的各个方面。
7. 有关RMI的各种信息可以在 http://java.sun.com/products/jdk/rmi/index.html上找到。
|
Jini技术基础结构- -
Jini技术的即插即用的基础结构主要由三组协议组成:查找(Lookup)、发现(Discovery)和加入(Join)。查找服务是分布式Jini系统的基本组成部分,提供了在分布式Jini系统中服务的*注册机制。在Jini系统中,程序找到服务的首选方法是通过查找服务,而且查找服务也是提供给管理员和用户各种访问接口的基础。
查找服务的服务模型
查找服务保存了一个服务的表,表中的每个元素代表了系统中可用的一项服务,其中保存了访问这项服务所需要的代码和一系列可扩充的描述服务的属性。打个比方,查找服务就像电话簿,Jini系统中的服务就像电话簿中的用户,查找服务中保存的信息就是用户的电话号码。也就是说,凡是需要访问Jini系统中的服务,就必须知道查找服务中保存的“电话号码”。但是查找服务有不少超过电话簿的优点,例如:查找服务保存的是一个动态的“电话簿”,而且,系统中的服务可以在“电话簿”中主动加入和去掉自己的“电话号码”,而查找服务也完全支持这种机制。而在以后的内容里,我们会发现更多的不同点。
当服务在查找服务中注册后,会产生一个通知事件。系统管理员可以利用查找服务中的事件回调机制来收到这个通知。这就有利于系统管理员管理和维护系统。而且服务也会提供设置自身的用户界面,这个用户界面可以作为服务的属性保存到查找服务中。管理员能轻松地设置服务,不用忙着到处找各种各样的驱动程序和管理软件。
在服务的有效期内,如果服务遇到问题需要引起管理员的注意,例如打印服务发现纸张短缺服务就增加一个属性来指明问题。更改后的结果会保存到查找服务中。这时,同上所述,管理员利用查找服务的事件回调机制来收到上述问题的通知。有了这个有力的机制,大大减轻了系统管理员的负担。
发现协议和加入协议
网络中的服务在启动后,怎样加入到分布式Jini系统中,成为Jini系统中的服务,有两个重要的必不可少的步骤。第一步肯定是找到系统中的查找服务,这个过程就是Discovery过程,用到的协议就是发现协议。第二步就是把自己注册到查找服务中,这个过程是Join过程,描述这个过程的协议就是Join协议。一项服务在完成了这两步后,就真正成为了Jini系统中的一位成员。为了准确地描述这两个协议,先介绍一下用到的术语。
主机。拥有一或多个Java虚拟机并且能加入网络的一个硬件设备被称为主机组。一组Jini服务所组成的集合。组的名字是任意的字符串,用来描述该组的性质。
Discovery实体。Discovery实体就是处于同一主机内,将要开始,或者正处在找到查找服务的过程中一个或多个相互协作的Java语言中的对象的集合。
Join实体。Join实体就是处于同一主机内,已经获得了查找服务,处于从查找服务中查询服务或者将自己注册到Jini系统内过程中的一个或多个相互协作的Java语言中的对象的集合。在以后的文章中,为了方便描述,将Discovery实体和Join实体统称为实体。
Jini系统中的服务包括的范围很广,包括各种纯软件的服务和硬件设备的服务。如果一台主机希望加入Jini系统,成为Jini系统中的一项服务,需要具备以下几个条件:首先需要一个能够运行Jini代码的Java虚拟机;其次需要一个正确配置的网络协议栈。这个网络协议栈随着网络协议的不同而改变。这里假定采用的网络层的协议是IP协议,此时以下几个条件是必不可少的:IP地址(IP地址或者是静态IP地址,或者是由主机利用DHCP协议来取得的动态IP地址);支持TCP协议和UDP多点传送协议(在Discovery过程中会用到这两种协议)。举个例子,一台联网的、安装了JDK(Java开发工具包)的个人电脑就是一台主机。
每个查找服务都有相关联的组,这样可以使Jini系统中的服务结构更有层次感。例如:一个特定的查找服务可以属于打印设备组,任何打印服务都可以注册到该查找服务中。当然,组都是预定义的。在Discovery的过程中,Discovery实体确定自己感兴趣的组,也就是自己希望加入的组,如果找到的查找服务也属于这样的组,Discovery实体就加入到这个查找服务中。这就避免了查找服务的结构过于庞大,把组织系统中服务的责任分摊给系统中多个不同的查找服务。目前,组的命名还没有一个明确的规范,Sun公司只是希望组的名字最好符合网络域名的命名规范,但是目前并没有给出如何定义组的名字的详细规范。我们相信在未来的发展过程中,随着对Jini系统中服务的组织结构层次性要求的提高,这种命名规范会随之完善起来的。
1.发现
在Discovery实体和查找服务交互过程中用到的协议一共有三个,分别是:多点传送请求协议(multicast request protocol)、多点传送宣布协议(multicast announcement protocol)和单点传送发现协议(unicast Discovery protocol)。这里首先对这三个协议进行简单的介绍。
多点传送请求协议。Discovery实体使用该协议以发现Jini系统中存在的查找服务。这个协议可用于设计浏览Jini系统中的服务的浏览器。
多点传送宣布协议。查找服务在启动后或者在网络崩溃的恢复过程中,利用该协议在系统中发布自己存在的数据报。
单点传送发现协议。当Discovery实体和查找服务中有一个知道了另一个的网络地址和端口号时,就采用该协议来主动建立两者之间点到点的通讯。
在Discovery的过程中,Discovery实体和查找服务的联系是建立在socket层上的。两者既是客户方,也是服务方。在通讯的过程中,分为两个阶段。
第一个阶段:Discovery实体和查找服务各自都建立了一个单点传送服务的服务器,可以理解为普通的Internet服务器,例如FTP协议中的FTP服务器,目的就是让Discovery实体和查找服务能够建立与对方的点到点的连接。现在面临的问题是:如何让双方知道对方的服务器地址?在第二个阶段的描述中会找到这个问题的答案。
第二个阶段:此时Discovery实体和查找服务都不知道对方的网络地址,但是根据Jini系统的要求,双方在网络层加入了特定的多点传送的组(这个组不是Jini系统中的组的概念,而是指网络协议中的组),而且双方都知道对方加入的网络组的组地址。由于网络协议支持向网络组中所有机器同时发送UDP数据包,利用这个特性,双方都向对方所属的组发送数据包。Discovery实体发送数据包的过程称为多点传送请求,在查找服务中发送数据包的过程称为多点传送广播宣布。在两者发送的数据包中都保存了各自的地址和其它必要信息。同时,双方都建立了一个收听发向本组的UDP数据包的服务器。Discovery实体所建立的服务器的服务称为多点传送广播收听服务,在查找服务中建立的服务器的服务称为多点传送广播请求服务。服务器把收到的数据包进行解码,就可以知道客户方的地址。在这个阶段中用到的协议就是多点传送请求协议和多点传送宣布协议。这时,Discovery过程就进入了第三个阶段。
第三个阶段:此时Discovery实体和查找服务中有一个已经知道另一个的网络地址。这时双方就利用unicast 发现协议来进行通讯。协议的步骤如下:
第一步: 这一步有两个对等的过程。当查找服务的单点传送服务器收到Discovery实体的连接请求后,就建立了与Discovery实体的连接;或者是Discovery的单点传送服务器收到查找服务的连接请求,建立与查找服务的连接。两者之中那一个首先发起连接是等价的。双方都创建了一个线程来负责创建与对方服务器的连接。
第二步:当Discovery实体和查找服务建立连接后,由Discovery实体主动发送一个特定Discovery请求后,查找服务就把以后所需要用到的Java语言中的对象(帮助Discovery实体加入到查找服务中的对象)传给Discovery实体。
有时已经发现并加入系统的实体会再次使用发现协议。例如,一个实体需要确定特定的查找服务是否还在运行,或者关心是否有新的服务进入,以及其他诸如此类的问题。这时就会再次使用发现协议。
在Discovery实体的Discovery过程中,这三个发现协议互相协作。当实体启动的时候,使用多点传送请求协议来找到附近的查找服务;为了避免加重网络的负担,在经过一段时间后实体就会停止使用该协议,转变为利用多点传送宣布协议来收听查找服务的广播。在具体的实现中,这三个协议都是作为独立的线程来实现的,由Discovery实体来负责协调这三个线程的运行。
2.加入
Join协议向已经找到查找服务的服务提供了一系列应该遵循的标准步骤。当服务遵循这些步骤后就可以在查找服务中注册以加入Jini系统。值得注意的是,加入并不意味着简单的注册,而维持系统正确运行是加入的核心内容。
由于Jini系统是一个分布式系统,为了使系统在各种情况下正常运行,设计者对网络系统崩溃后系统的恢复和系统持久运行的能力特别重视。所以在实现时,Jini系统中的服务都保存了必须保存的永久状态信息。这些信息如下:
1)表示服务在Jini系统中的标识符。服务在不同的查找服务中注册的服务标识符是唯一的。
2)服务具备的属性。这些属性是Java语言中的对象。服务的属性描述了服务的状态。如果服务的状态改变了,那就必须修改属性以适应这个改变。为了保证Jini系统中状态的一致性,服务保存更改后的属性后,必须在每个已经注册的查找服务中做同样的更改。
3)一套服务想要加入的组的集合。
4)必须注册的特定的查找服务。对于这些查找服务,服务必须注册到该查找服务中,而不论查找服务所属的组是否服务希望加入的组。
每个服务都维持了一份它所注册过的查找服务的表和一份租约表。当服务在特定的查找服务中注册后,会得到一份租约,服务会分别把租约和这个查找服务加入到上述的表中。服务对租约定期续借来保证注册的有效性。如果服务需要退出特定的查找服务,服务就会取消和这个查找服务相关联的所有租约。由于租约机制的引入,使得不会出现系统资源不可回收的现象,增强了系统的鲁棒性。
每一个Jini设备通过实现Dicovery和Join协议,就可以随时随地加入或退出Jini系统,从而达到即插即用的效果。
我的Visual C++入门之路——N次失败与1次成功 |
程序员之家 作者:不祥 日期:2004-4-1 9:59:00 |
“N次失败,1次成功,还学的不怎么样……你也太笨了吧!”如果您有这样的评价,那么祝贺您,您已经了解了我这人的99.9%。N这个数字具体是多少连我自己也记不清楚,保守地讲(N≥6==TRUE)这个表达式是能够成立的。回想我的Visual C++入门过程,一路过来,绝对不是像黄飞鸿的功夫那样潇洒精彩,而更像是一颗石头顺流而下,在河床底摸爬滚打、磕磕碰碰。今天是周末,我就把以前N次失败留给我的经验教训胡写上几笔,如果有朋友看到这篇拙文,又刚好打算尝试一下Visual C++,也就算是我给您留下的莽原一径吧。
二.VC学习资料的选择 三.内因与外因:“三心二意”和“高手朋友”你有吗? 四.VC入门随笔 |
Jini和RMI开发中的codebase问题
codebase问题其实是一个怎样从网络上下载类的问题,我想不只是在Jini和RMI程序开发中要用到。只要需要从网络上下载类,就要涉及到codebase问题。例如applet等。但是因为我对applet程序不是很熟悉,所以我就只谈Jini和RMI,但我想codebase问题应该是通用的。
毫无疑问,对于大多数Jini和RMI开发新手来说,如何使用codebase是比较容易令人迷惑的一件事。(我的一位师妹就很痛苦过,而且怀疑这个是不是sun的一个骗局:P)下面我就讲讲codebase要注意的几个方面,也就是容 易出问题的地方。
一、为什么需要codebase
当我们用一个对象作为远程方法调用的参数时,对象是以序列化流来传输到远端,然后在远端重新生成对象。这样就可能在两个Java虚拟机中交换对象了。但是序列化是这种传递对象的一部分。当你序列化对象时,你仅仅是把对象的成员数据转化成字节流,而实际实现该对象的代码却没有。也就是说,传递的只是数据部分,而做为控制逻辑的程序代码部分却没有被传递。
这就是RMI初学者容易误解的地方,我已经序列化对象了,而且对象也传过去了,怎么还说找不到呢。其实,对象数据的确过去了,不过找不到是类定义,这个并不是序列化传过去的,RMI协议是不传递代码的。但是,对于本地没有的类文件的对象,RMI提供了一些机制允许接收对象的一方去取回该对象的类代码。而到什么地方去取,这就需要 发送方设置codebase了。
二、什么是codebase
简单说,codebase就是远程装载类的路径。当对象发送者序列化对象时,会在序列化流中附加上codebase的信息。这个信息告诉接收方到什么地方寻找该对象的执行代码。
你要弄清楚哪个设置codebase,而哪个使用codebase。任何程序如果发送一个对方可能没有的新类对象时就要设置codebase(例如jdk的类对象,就不用设置codebase)。codebase实际上是一个url表,在该url下有接受方需要下载的类文件。如果你不设置codebase,那么你就不能把 一个对象传递给本地没有该对象类文件的程序。
三、怎样设置codebase
在大多数情况下,你可以在命令行上通过属性java.rmi.server.codebase来设置codebase。例如,如果你在机器url上运行web服务器,端口是8080,你所提供下载的类文件在webserver的根目录下。那么运行应用程序的java 命令行:
-Djava.rmi.server.codebase=http://url:8080/
这就是告诉任何接受对象的程序,如果本地没有类文件,可以从这个url下载。
四、类文件应该在什么地方
如上所示,当接收程序试图从url的webserver上下载代码时,它会把对象的包名转化成目录,到相对于codebase的该目录下寻找(这点和classpath是一样的)。例如,如果你传递的是类文件yourgroup.project.bean的实例,那么接受方就会到下面的url去下载类文件:
-Djava.rmi.server.codebase=http://url:8080/yourgroup/project/bean.class
一定要保证你把类文件放到webserver根目录下的正确位置,这样这些类文件才能被找到。另一方面,如果你把所有的类文件包装成jar文件,那么设置codebase时就要明确的指出这个jar文件。(这又和classpath一致了,其实codebase就是网络范围的类路径。)例如你的jar文件是myclasses.jar,那么codebase 如下:
-Djava.rmi.server.codebase=http://url:8080/myclasses.jar
你注意这两种形式的不同。用jar文件后面不用跟‘/’,而用路径的一定用跟‘/’。
Codebase和安全问题
我们需要注意的是下载代码如何与Java的安全机制进行协调。本质上讲,codebase属性是应用程序在运行时动态地扩展自己classpath的一种方法。很明显,这会引起安全问题,你可能会下载一些不安全的类代码。所以一个Java程序如果要下载远程的类,必须安装安全管理器。如果没有安全管理器,一个Java程序只能在装载局部代码,并且忽略所接受到的codebase信息。大部分RMI程序需要从远端下载stub文件,而所有的Jini程序都需要下载服务代理。所以如果你不安装安全管理器,你就不能开发RMI和Jini程序。当你遇到安全例外的错误时,你最好检查以下自己的程序,是否安装了安全管理器。
开发时的问题
使用codebase经常出现的问题可能与我们的开发观念有关。我们许多人在安装我们的开发环境时都是尽可能的方便。也就是说,当开发分布式应用程序时,我们把客户端和服务端的程序放在同一目录下运行。这会产生许多问题,首先因为客户程序和服务程序都在本地,即使你没有正确的设置codebase属性,类文件也可以在本地的classpath装载进JVM。其次,你可能会忘记安装安全管理器,因为所有的类都可以在本地找到。
也就是说,我们这样开发,最大的弊端就是,我们不知道那些类是应该从远端下载的,因为所有的类在本地都找得到。这样你也许会发现你的程序在开发调试时运行的很正常,而一旦到了真正的运行环境,也就说分发到了一个分布式环境中时,就出现了许多问题。也就是我们所说的codebase,以及从网络上下载类的各种问题。我将在另一篇文章中讲如何安装你的开发环境来仿真多机环境。
一些常见的codebase错误
上面我们所讲的时codebase是怎么一回事,它是如何工作的。现在,我想讲几个Jini和RMI开发者应该注意的几个问题。
1、在codebase中指定多个url:在一个单独的codebase中分隔多个url正确的方法是用空格。例如
-Djava.rmi.server.codebase="http://url:8080
http://url:8080/myclasses.jar"
2、不要使用带file的url:如果你有一个可用的webserver,或者你不想以后运行时出现麻烦,建议你不要使用file:URL的形式作为一个codebase。我曾经看过一个讲codebase的例子,还使用file:形式,真的是有些误导读者。用file这种形式不是个好主意。因为如果服务器给客户传递一个file codebase,那么客户只会试图从本地文件系统装载类代码。如果你在同一台机器上开发和调试服务和客户程序,那么这是可以工作的。但是如果你在不同的机器上运行程序,就会出现问题。
在codebase URL中不要使用localhost:localhost是用来指定当前机器的。如果服务器设置的url中包含localhost,那么客户分析这个url,就会试图从自己的系统装载类文件。这和file一样是个不好的习惯。
开发RMI程序是不是需要一个webserver
有时我也怀疑为了开发RMI程序就安装一个webserver,是不是有点太夸张了。开发RMI程序是不是真的需要一个单独的webserver。其实codebase的设置是很灵活的。我们可以使用一个单独的webserver,来作为一个组成员的类文件下载的服务器。对于开发大型的RMI应用程序来说,这是不会有问题的。如果是个人开发的,现在在Jini开发时,sun公司提供了一个简单的webserver,httpd。这个是完全可以完成类文件下载的。