关闭

分布式JAVA应用

标签: 分布式java读书笔记
429人阅读 评论(0) 收藏 举报
分类:

《对于分布式JAVA应用》读书笔记,看过的知识没有归纳mark下来总是忘记,这里随意的mark一下,供需要的时候稍稍看看也能想起~~

1. 分布式JAVA应用

1.1 基于消息实现系统间通讯

系统间进行通讯,需要相互进行发送消息,消息可以根据需求而定,可以是字节流,字节数组,甚至java对象等。通常基于网络协议来实现,常用有TCP/IP和UDP/IP(这两种协议应该都有一定了解了吧,不详细说了)。这里说一下的是按POSIX标准分为同步IO和异步IO两种,同步IO常用的是BIO(blocking IO)和异步IO(Non-blocking IO),异步IO—AIO。

  • 同步:java程序自身处理IO读写。
  • 异步:Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO操作API。
  • 阻塞:Java调用会一直阻塞到读写完成才返回。
  • 非阻塞:使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成。

    HTTP/1.1出现后,有了Http长连接,这样除了超时和指明特定关闭的http header外,这个链接是一直打开的状态的,这样在NIO处理中可以进一步的进化,在后端资源中可以实现资源池或者队列,当请求来的话,开启的线程把请求和请求数据传送给后端资源池或者队列里面就返回,并且在全局的地方保持住这个现场(哪个连接的哪个请求等),这样前面的线程还是可以去接受其他的请求,而后端的应用的处理只需要执行队列里面的就可以了,这样请求处理和后端应用是异步的.当后端处理完,到全局地方得到现场,产生响应,这个就实现了异步处理。


简单而言:
  • BIO是一个连接一个线程。
  • NIO是一个请求一个线程。
  • AIO是一个有效请求一个线程。

1.2 基于远程调用方式实现系统间通讯

系统间通讯时可以通过调用本地的一个Java接口的方法,透明地调用远程的Java实现。具体细节由Java或框架完成。实现有基于RMI,webservice,hession,restful等等。

对于基于Java自身技术实现,与基于开源框架具体实现系统间通讯不详细mark。

2. 大型分布式Java应用与SOA

分别讲述以下几种方式实现SOA平台,详情略:

  • 基于SCA
  • 基于ESB
  • 基于Tusany
  • 基于Mule

3. 深入理解JVM

3.1 Java代码执行机制

3.1.1 Java源码编译机制

Sun JDK将Java源码编译为class文件的步骤:
1. 分析和输入到符号表(Parse and Enter)
2. 注解处理(Annotation Processing)
3. 语义分析和生成class文件(Analyse and Generate)
3.1 分析包括关联表达式、变量、方法、类型;检查变量;推导泛型;检查类型匹配;常量折叠;等步骤。
3.2 class文件不止字节码,还有辅助jvm执行class附加信息:
结构信息、元数据、方法信息
eg: 执行javac -g Foo.java编译,然后通过javap -c -s -l -verboseFoo可以查看编译后的class文件,结合class文件格式可以看到其中关键内容。

3.1.2 类加载机制

类加载机制指的是class文件加载到JVM,并形成class对象的机制。之后应用就可以对class对象进行实例化并调用,类加载机制可在运行时动态加载外部类、远程网络下载过来的class文件等。分为3个步骤:
1. 装载(load)
装载指二进制字节码加载到JVM中,JVM通过类的全限定名及类加载器(ClassLoaderA实例)完成加载。采用以上两个元素来标识一个被加载的类:类的全限定名+ClassLoader实例ID。
2. 链接(Link)
链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量及解析类中调用的接口、类。
3. 初始化(Initialize)
初始化过程即执行类中的静态初始代码、构造器代码及静态属性的初始化,在以下四种情况会被触发:
3.1 调用了new;
3.2 反射调用了类的方法;
3.3 子类调用了初始化;
3.4 JVM启动过程中指定的初始化类。

ClassLoader
JVM的类加载通过ClassLoader及其子类来完成,有以下四种ClassLoader:
1. Bootstrap ClassLoader
Sun JDK采用C++实现此类,非ClassLoader子类,代码中无法获取,JDK启动时会初始化此ClassLoader,并由ClassLoader完成对$JAVA_HOME中jre/lib/rt.jar的class进行加载。
2. Extension ClassLoader
JVM用此ClassLoader来加载扩展功能的一些jar包,例如Sun JDK目录下有dns工具jar包等,sun JDK中的ClassLoader对于的类名为ExtClassLoader。
3. System ClassLoader
JVM用此ClassLoader来加载启动参数中指定的Classpath中的jar包及目录,在Sun JDK中ClassLoader对应的类名为AppClassLoader。
4. User-Defined ClassLoader
User-Defined ClassLoader是开发人员继承ClassLoader抽象类自行实现的ClassLoader,可以用于加载非Classpath中(例如从网络上下载的jar或二进制)的jar及目录、还可以在加载前对class文件做一些动作,例如解密等。

注意:JVM的ClassLoader采用的是树形结构,除了Bootstrap ClassLoader外,其他ClassLoader都会有parent ClassLoader。例如User-Defined ClassLoader默认的parent ClassLoader为System ClassLoader。加载类时通常会按照树形结构的原则进行,也就是说,首先从parent ClassLoader中尝试进行加载,当parent无法加载时,再从其下级ClassLoader进行加载。

3.1.3 类加载机制

0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13535次
    • 积分:372
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:0篇
    • 译文:1篇
    • 评论:0条
    文章分类