摘要:
Aug 24th, 2017 Posted by 飒然Hang in architecture 之前开头的《架构设计原则》一文一直没有把坑填上。而最近在公司内部做了一次架构交流/培训,把架构的概念、架构的形式、架构设计原则都做了阐述,正好算是对此文的完成和补充。 阅读全文
posted @ 2019-12-03 22:52
mongotea
阅读(140)
评论(0)
推荐(0)
摘要:
除了可能会出现在class文件中的这200条指令的操作码,Java虚拟机规范还定义了另外两类操作码: 保留的操作码和"quick”操作码,这两种操作码不会合法地出现在Java class文件中。 Java虚拟机规范列出了三种保留操作码,如表A-1所示。这些操作码是为Java虚拟机实现及其工具所保留的 阅读全文
posted @ 2019-12-03 22:43
mongotea
阅读(294)
评论(0)
推荐(0)
摘要:
不过,大多数情况下,监视器保护那些通过监视区域代码来访问的数据,在这种情况下一即要求数据仅可以由监视区域访问,监视器可以确保线程会互斥地访问这些数据。 另一种我们提到的被监视器所支持的同步是协作。互斥帮助线程在访问共享数据时不被其他线程干扰,而协作帮助线程与其他线程共同工作。 当一个线程需要一些特别 阅读全文
posted @ 2019-12-03 22:42
mongotea
阅读(172)
评论(0)
推荐(0)
摘要:
Java虚拟机的指令集包括四种调用方法的指令,本章对这四种指令和这些指令执行的环境进 行阐述。 19.1方法调用 Java程序设计语言提供了两种基本的方法:实例方法和类(或者静态)方法。这两种方法的区别在于: 1)实例方法在被调用之前,需要一个实例,而类方法不需要。 2)实例方法使用动态(迟)绑定, 阅读全文
posted @ 2019-12-03 22:42
mongotea
阅读(278)
评论(0)
推荐(0)
摘要:
javac为remainder ()方法产生下列字节码序列: // The main bytecode sequence for remainder (); // Push local variable 0 {arg passed as0 iload_0 // dividend) // Push t 阅读全文
posted @ 2019-12-03 22:41
mongotea
阅读(124)
评论(0)
推荐(0)
摘要:
18.1微型子例程 字节码中的finally子句在方法内部的表现很像“微型子例程”。Java虚拟机在每个try语句块和与其相关的catch子句的结尾处都会“调用”finally子句的子例程。finally子句结束后(这里的结束指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行 阅读全文
posted @ 2019-12-03 22:41
mongotea
阅读(255)
评论(0)
推荐(0)
摘要:
只有对象引用和基本类型可以在Java的桟中以局部变量形式存在。Java栈不能容纳对象。 Java虚拟机中的对象和基本类型的结构分离在java编程语言中体现为:对象不能作为局部变量声明,只有对象引用和基本类型可以。对象引用在声明后并不指向任何有意义的东西,只有在引用被显式初始化后(无论是使引用指向一个 阅读全文
posted @ 2019-12-03 22:40
mongotea
阅读(115)
评论(0)
推荐(0)
摘要:
16.1条件分支 在Java源代码中,可以在一个方法中使用if、if-else、while、 do-while、for和switch语句来指定基本的控制流。当把所有源代码转换成为字节码的时候,除了switch语句外,Java编译器使用同样的操作码集。例如,Java提供的最简单的控制流是if语句。当编 阅读全文
posted @ 2019-12-03 22:40
mongotea
阅读(194)
评论(0)
推荐(0)
摘要:
12.1 二进制补码运算Java虚拟机所支持的所有的整数类型-byte, short、int和long,它们都是带符号的二进制补码数。二进制补码方案既能够描述正整数,也能够描述负整数。在一个二进制补码数中,最重要的位就是它的符号位。符号位为1,表示负整数;符号位为0,表示正整数和数字0。 能够被二进 阅读全文
posted @ 2019-12-03 22:39
mongotea
阅读(291)
评论(0)
推荐(0)
摘要:
13.1逻辑操作码Java虚拟机的逻辑操作主要针对int和long类型。这些处理int和long类型的操作与处理带符号二进制补码数的方式不同,而是按照通用的位模式进行处理。整数移位通过ishl、ishr, iushr操作码进行。Java的“<<”操作符由ishl实现,“>>”操作符由ishr实现,“ 阅读全文
posted @ 2019-12-03 22:39
mongotea
阅读(84)
评论(0)
推荐(0)
摘要:
10.1常量入栈操作许多操作码执行常量入栈操作。操作码在执行常量入栈操作之前,使用如下三种方式指明 常量的值:常量值隐式包含在操作码内部,常量值在字节码流中如同操作数一样紧随在操作码 之后,或者从常量池中取出常量。 一些操作码自行指明入栈的常量的类型和值,例如,iconst_1操作码告知Java虚拟 阅读全文
posted @ 2019-12-03 22:38
mongotea
阅读(349)
评论(0)
推荐(0)
摘要:
11.1转换操作码Java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有 操作数,转换的值从桟顶端获得。Java虚拟机从栈顶端弹出一个值,对它进行转換,然后再把转 换结果压入栈。进行int、long, float和double类型之间转换的操作码如表11-1所示,针对这 阅读全文
posted @ 2019-12-03 22:38
mongotea
阅读(153)
评论(0)
推荐(0)
摘要:
堆碎块是在正常的程序运行过程中产生的。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活 动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间 是足够的,这是因为,堆中没有连续的空闲空间放得下新的对象。在一个虚拟内存系统中,增 长的堆所需要的额外分页 阅读全文
posted @ 2019-12-03 22:19
mongotea
阅读(242)
评论(0)
推荐(0)
摘要:
8.1.20示例:类型安全性与装载约束 在Java虚拟机的早期实现中,搞乱Java的类型系统是有可能的。一个Java程序可能欺骗Java 虚拟机,用一种类型的对象冒充另一种类型的对象。这种能力让破坏者非常高兴,因为他们可 以欺骗受信任的类非法访问非公开的数据,或者通过把类替换成新的版本改变方法的行为 阅读全文
posted @ 2019-12-03 22:14
mongotea
阅读(190)
评论(0)
推荐(0)
摘要:
8.1.19示例:卸载无法触及的greeter类 动态装载的类型变为无法触及而要被虚拟机卸载时的例子如下面的程序: 因为引用的类(这里是HowDoYouDo )是被GreeterClassLoader对象装载的。这两个类都是Java API的一部分,不管怎样都会最终被启动类装载器装载,因为loadC 阅读全文
posted @ 2019-12-03 22:12
mongotea
阅读(241)
评论(0)
推荐(0)
摘要:
8.1.17使用1.2版本的用户自定义类装载器 前一节描述的类装载器最初是为1.1版虚拟机设计的,但也可以在1.2版本中工作。虽然1.2版 本为java.lang.ClassLoader加人了默认的loadClass ()具体实现,这个具体的方法仍然可以被子 类所覆盖。因为loadClass ()的 阅读全文
posted @ 2019-12-03 21:55
mongotea
阅读(137)
评论(0)
推荐(0)
摘要:
不同之处在于,loadClass()试图保证被装载的类型是被装载到用户自定义的类装载器的命名空 间里,而forName()试图确认所需的类型被装载到当前命名空间中,这个当前命名空间就是类 型(该类型的方法包括forName ()调用)所属的定义类装载器的命名空间。 因为forName ()从类Eas 阅读全文
posted @ 2019-12-03 21:55
mongotea
阅读(132)
评论(0)
推荐(0)
摘要:
loadCIass ()方法从检查被请求调用的类型是否已经被自己装载过了开始。这是通过调用 findLoadedClass ()实现的,后者是ClassLoader的一个方法,传递被请求的类型的全限定名作为参数。如果这个类装载已经被标记为是这个具有该全限定名的类型的初始类装载器, findLoade 阅读全文
posted @ 2019-12-03 21:54
mongotea
阅读(183)
评论(0)
推荐(0)
摘要:
8.1.12直接引用 •常量池解析的最终目标是把符号引用替换为直接引用。符号引用的格式在第6章中详细定义了,但是直接引用应该是什么格式呢?你可能认为,直接引用的格式也是由不同的java虚拟机实现的设计者决定的。然而,在大多数实现中,总会有一些通用的特征。 指向类型、类变量和类方法的直接引用可能是指向 阅读全文
posted @ 2019-12-03 21:53
mongotea
阅读(236)
评论(0)
推荐(0)
摘要:
8.1.13 _quick 指令 Java虚拟机的第一版规范中描述了一种用来加速字节码解释的技术,Sun早期的一种java虚拟机实现中曾经使用过它。这种方案是,如果常量池入口已经被解析过,使用常量池人口的操 作码会被一个“_quick”操作码取代。当虚拟机遇到一个_quick指令时,它就知道常量池人 阅读全文
posted @ 2019-12-03 21:53
mongotea
阅读(210)
评论(0)
推荐(0)
摘要:
8.1.11编译时常量解析 在第7章讲过,被初始化为编译时常量的静态final变量的引用,在编译时被解析为常量值的 一个本地拷贝,这对于所有的基本类型和java.lang.String都是正确的。 这种对于常量的特别处理使Java语言具有了两个特性。首先,常量值的本地拷贝使得静态 final变量可以 阅读全文
posted @ 2019-12-03 21:31
mongotea
阅读(225)
评论(0)
推荐(0)
摘要:
8.1.10装载约束 Java类型可以符号化地引用常量池中的其他类型,解析时需要特别关照,当存在多个类装载 器的时候,要保证类型安全。当一个类型包含指向另一个类型中的字段的符号引用时,符号引 用包含一个描述符——它指明了该字段的类型。当一个类型包含指向另外一个类型的方法的符 号引用时,符号引用也包含 阅读全文
posted @ 2019-12-03 21:30
mongotea
阅读(154)
评论(0)
推荐(0)
摘要:
8.1.6 解析CONSTANT_Methodref_info入 口 要解析CONSTANT_Methodref_info类型的常量池人口,虚拟机必须先解析class_index项中 指定的CONSTANT_Class_info人口。也就是说,所有CONSTANT_Class_info解析过程中可能 阅读全文
posted @ 2019-12-03 21:29
mongotea
阅读(723)
评论(0)
推荐(0)
摘要:
8.1.7 解析CONSTANT_interfaceMethodref_info入口 要解析类型为CONSTANT_interfaceMethodref_info的常量池人口,虚拟机首先要解析 class_index项中指定的CONSTANT_Class_info人口。所以,任何在解析CONSTAN 阅读全文
posted @ 2019-12-03 21:29
mongotea
阅读(702)
评论(0)
推荐(0)
摘要:
8.1.8 解析CONSTANT_String_info入口 要解析类型是CONSTANT_String_info入口的人口,Java虚拟机必须把一个指向内部字符串对象 的引用放置到要被解析的常量池人口数据中去。该字符串对象(java.lang.String类的实例)必须 按照 string_ind 阅读全文
posted @ 2019-12-03 21:29
mongotea
阅读(765)
评论(0)
推荐(1)
摘要:
8.1.4 解析CONSTANT_Class_info入 口 在所有常量池入口类型中,解析起来最复杂的就是CONSTANT_Class_info了。这种人口 类型用来表示指向类(包括数组类)和接口的符号引用。有几个指令,比如new和anewarray, 直接使用CONSTANT_Class_info 阅读全文
posted @ 2019-12-03 21:28
mongotea
阅读(969)
评论(0)
推荐(0)
摘要:
8.1.5 解析CONSTANT_Fieldref_info入口要解析类型是CONSTANT_Fieldref_info的常量池入口,虚拟机必须首先解析class_index项 中指明的CONSTANT_Class_info入口。因此,解析CONSTANT_Fieldref_info时可能抛出任何因 阅读全文
posted @ 2019-12-03 21:28
mongotea
阅读(589)
评论(0)
推荐(0)
摘要:
8.1.2类装载器与双亲委派横型 在第3章曾讲过,1.2版本中引人了类装载器的形式化双亲委派模型。虽然老式版本(即12 版本之前)编写的类装载器无法享受双亲委派模型的好处,但仍然可以在1.2版本中使用,1.2版 本及更高版本中推荐使用双亲委派模型创建类装载器。1.2版本中每一个用户自定义的类装载器在 阅读全文
posted @ 2019-12-03 21:27
mongotea
阅读(157)
评论(0)
推荐(0)
摘要:
8.1.3常量池解析 本节描述解析每一种常量池入口类型的细节,包括可能在解析过程中抛出的错误。如果在 解析过程中抛出了错误,错误被看成是由指向执行解析的常量池入口的引用者抛出的。除了这里描述的错误,触发常量池入口解析的不同的指令,可能导致抛出其他的错误。比如,getstatic 导致CONSTANT 阅读全文
posted @ 2019-12-03 21:27
mongotea
阅读(135)
评论(0)
推荐(0)
摘要:
8.1.1解析和动态扩展 除了简单地在运行时连接类型之外,Java程序还可以在运行时决定连接哪一个类型。Java的 体系结构允许动态扩展Java程序,这个过程包括运行时决定所使用的类型,装载它们,使用它们。 通过传递类型的名字到java.lang.Class的forName ()方法,或者用户自定义 阅读全文
posted @ 2019-12-03 21:26
mongotea
阅读(193)
评论(0)
推荐(0)
摘要:
从程序员的角度来看,理解Java体系结构最重要的方面之一就是连接模型。前几章曾讲过, Java的连接模型允许用户自行设计类装载器,这样以来就可以在运行时定制地扩展用户的程序。 通过用户自定义的类装载器,你的程序可以装载在编译时并不知道或许尚未存在的类或者接口, 并动态连接它们。 驱动Java连接模型 阅读全文
posted @ 2019-12-03 21:25
mongotea
阅读(372)
评论(1)
推荐(0)
摘要:
7.3卸载类型 在很多方面,虚拟机中类的生命周期和对象的生命周期很相似。虚拟机创建并初始化对象,使程序能使用对象,然后在对象变得不再被引用后可选地执行垃圾收集。同样,虚拟机装 载、连接并初始化类,使程序能使用类,当程序不在引用它们的时候可选地卸载它们。 类的垃圾收集和卸载之所以在Java虚拟机中很重 阅读全文
posted @ 2019-12-03 21:23
mongotea
阅读(248)
评论(0)
推荐(0)
摘要:
7.2对象的生命周期一旦一个类被装载、连接和初始化,它就随时可以使用了。程序可以访问它的静态字段, 调用它的静态方法,或者创建它的实例。本节会讨论类的实例化和初始化,即对象生命起始阶 段的活动;还要讨论垃圾收集和终结,即对象生命尽头的活动。 7.2.1类实例化 在Java程序中,类可以被明确或者隐含 阅读全文
posted @ 2019-12-03 21:22
mongotea
阅读(250)
评论(0)
推荐(0)
摘要:
7.2.2垃圾收集和对象的终结 前面的章节中曾讲过,Java虚拟机实现必须具有某种自动堆存储管理策略一大部分是采用 垃圾收集器,本章前面也讲过,程序可以明确或者隐含地为对象分配内存,但是不能明确地释 放内存。但一个对象不再为程序所引用了,虚拟机必须回收(垃圾收集)那部分内存。实现可 以决定何时应垃圾 阅读全文
posted @ 2019-12-03 21:22
mongotea
阅读(151)
评论(0)
推荐(0)
摘要:
装载阶段由三个基本动作组成,要装载一个类型,Java虚拟机必须: •通过该类型的完全限定名,产生一个代表该类型的二进制数据流。 •解析这个二进制数据流为方法区内的内部数据结构。 •创建一个表示该类型的java.lang.Class类的实例。 这个二进制数据流可能遵守Java class文件格式,但是 阅读全文
posted @ 2019-12-03 21:21
mongotea
阅读(167)
评论(0)
推荐(0)
摘要:
当类型被装载后,就准备进行连接了。连接过程的第一步是验证——确认类型符合Java语言 的语义,并且它不会危及虚拟机的完整性。 在验证上,不同的虚拟机实现拥有一些灵活性。虚拟机实现的设计者可以决定如何以及何 时验证类型。Java虚拟机规范列出了虚拟机可以拋出的异常以及在何种条件下必须抛出它们。不 管J 阅读全文
posted @ 2019-12-03 21:21
mongotea
阅读(158)
评论(0)
推荐(0)
摘要:
Java虚拟机通过装载、连接和初始化一个java类型,使该类型可以被正在运行的java程序所 使用、其中,装载就是把二进制形式的Java类型读入Java虚拟机中;而连接就是把这种已经读人 虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去。连接阶段分为三个子步骤-验证、准备和解析。“验证”步骤 阅读全文
posted @ 2019-12-03 21:20
mongotea
阅读(212)
评论(0)
推荐(0)
摘要:
如前所述,属性在Java class文件中多处出现。它们可以出现在ClassFile、field_info、 method_info和Code_attribute表中。Code_attribme表本身即为一个属性,本节将对它进行阐述。(自我感悟:注意这里的field_info与后面的CONSTANT 阅读全文
posted @ 2019-12-03 21:19
mongotea
阅读(257)
评论(0)
推荐(0)
摘要:
常量池中容纳的符号引用包括三种特殊的字符串:全限定名、简单名称和描述符。所有的符 号引用都包括类或者接口的全限定名。字段的符号引用除了全限定类型名之外,还包括简单字段 名和字段描述符。方法的符号引用除了全限定类型名之外,还包括简单方法名和方法描述符。 在符号引用中使用的特殊字符串也同样用来描述被cl 阅读全文
posted @ 2019-12-03 21:18
mongotea
阅读(598)
评论(0)
推荐(0)
摘要:
一个class文件中只能包含一个类或者接口。占据多个字节空间的项按照高位在前的顺序分为几个连续的字节存放。可变长度的ClassFile表中的项,如表6-2所示,按照它们在class文件中出现的顺序列出了主要部分。 表6-2 ClassFile表的格式 类型 名 称 数量 u4 magic 1 u2 阅读全文
posted @ 2019-12-03 21:16
mongotea
阅读(286)
评论(0)
推荐(0)
摘要:
任何Java虚拟机实现的核心都是它的执行引擎。在Java虚拟机规范中,执行引擎的行为使用 指令集来定义。对于每条指令,规范都详细规定了当实现执行到该指令时应该处理什么,但是却对如何处理言之甚少。在前面的章节中提到过,实现的设计者有权决定如何执行字节码:实 现可以采取解释、即时编译或直接用芯片上的指令 阅读全文
posted @ 2019-12-03 21:12
mongotea
阅读(255)
评论(0)
推荐(0)
摘要:
并不强求Java虚拟机实现支持任何特定的本地方法接口。有些实现可以根本不支持本地方法 接口,还有一些可能支持少数几个,每一个对应一种不同的需求。 Sun的Java本地接口,或者称作JNI,是为可移植性准备的。JNI设计的可以被任何java虚拟机实现支持,而不管它们使用何种垃圾收集或者对象表示技术。这 阅读全文
posted @ 2019-12-03 21:12
mongotea
阅读(210)
评论(0)
推荐(0)
摘要:
栈帧由三部分组成:局部变量区,操作数找和帧数据区。局部变量区和操作数栈的大小要 视对应的方法而定,它们是按字长计算的。编译器在编译时就确定了这些值并放在class文件中。 而帧数据区的大小依赖于具体的实现。当虚拟机调用一个Java方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数 栈的大小 阅读全文
posted @ 2019-12-03 21:11
mongotea
阅读(328)
评论(0)
推荐(0)
摘要:
前面提到的所有运行时数据区都是在Java虚拟机规范中明确定义的,除此之外,对于一个运 行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地 方法时,它就进人了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接 口来访问虚拟机的运行时数据区,但不止于此 阅读全文
posted @ 2019-12-03 21:11
mongotea
阅读(193)
评论(0)
推荐(0)
摘要:
每当启动一个新线程时,Java虚拟机都会为它分配一个java栈。前面我们曾经提到Java栈以帧为单位保存线程运行状态。虚拟机只会直接对java栈执行两种操作:以帧为单位的压栈或出栈。 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当 前方法所属的类称为当前类,当前类的常 阅读全文
posted @ 2019-12-03 21:09
mongotea
阅读(108)
评论(0)
推荐(0)
摘要:
Java对象中包含的基本数据由它所属的类及其所有超类声明的实例变量组成。只要有一个对 象引用,虚拟机就必须能够快速地定位对象实例的数据。另外,它也必须能通过该对象引用访 问相应的类数据(存储于方法区的类型信息)。因此在对象中通常会有一个指向方法区的指针。 —种可能的堆空间设计就是,把堆分为两部分:一 阅读全文
posted @ 2019-12-03 21:08
mongotea
阅读(135)
评论(0)
推荐(0)
摘要:
对于一个运行中的Java程序而言,其中的每一个线程都有它自己的PC (程序计数器)寄存 器,它是在该线程启动时创建的。PC寄存器的大小是一个字长,因此它既能够持有一个本地指 针,也能够持有一个returnAddress。当线程执行某个Java方法时,PC寄存器的内容总是下一条 将被执行指令的“地址“ 阅读全文
posted @ 2019-12-03 21:08
mongotea
阅读(119)
评论(0)
推荐(0)
摘要:
在Java虚拟机中,关于被装载类型的信息存储在一个逻辑上被称为方法区的内存中。当虚拟 机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件--个线性二进制数据流——然后将它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些 信息存储到方法区。该类型中的类(静态) 阅读全文
posted @ 2019-12-03 20:45
mongotea
阅读(116)
评论(0)
推荐(0)
摘要:
Java虚拟机中,最基本的数据单元就是字(word ),它的大小是由每个虚拟机实现的设计者 来决定的。字长必须足够大,至少是一个字单元就足以持有byte、short, int、char, float, return Address或者reference类型的值,而两个字单元就足以持有long或者do 阅读全文
posted @ 2019-12-03 20:44
mongotea
阅读(147)
评论(0)
推荐(0)
摘要:
和所有其他对象一样,用户自定义的类装载器以及Class类的实例都放在内存中的堆区,而装载的类型信息则都位于方法区。 ClassLoader中的四个方法是通往Java虚拟机的通道:// Four of the methods declared in class java.lang.ClassLoade 阅读全文
posted @ 2019-12-03 20:44
mongotea
阅读(104)
评论(0)
推荐(0)
摘要:
java语言中的所有基本类型同样也都是虚拟机中的基本类型。但是boolean有点特别,虽 然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持,当编译器把java源码编译为字节码时,它会用int或byte来表示boolean。在Java虚拟机中,false是由整 阅读全文
posted @ 2019-12-03 20:43
mongotea
阅读(111)
评论(0)
推荐(0)
摘要:
而本地方法调用的状态,则是以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其他某些与特定实现相关的内存区中。 阅读全文
posted @ 2019-12-03 20:38
mongotea
阅读(107)
评论(0)
推荐(0)
摘要:
到现在为止,在本章中给出的基本算法中,AccessController自顶向下对栈进行检查,严格地要求每一个栈帧都有执行某个操作的权限,以防一段不可靠的代码隐藏在一段可信任代码后 面。因为AccessControIler-路向下地查看调用栈,所以,它最终会找到任何不能被允许执行被 请求操作的方法。例 阅读全文
posted @ 2019-12-03 20:37
mongotea
阅读(1306)
评论(0)
推荐(0)
摘要:
一个运行时的Java虚拟机实例的天职就是:负责运行一个Java程序。当启动一个Java程序时, 一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果在同一 台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己 的Java虚拟机实例中 阅读全文
posted @ 2019-12-03 20:37
mongotea
阅读(162)
评论(0)
推荐(0)
摘要:
当类装载器将类型装入Java虚拟机时,它们将为每个类型指派一个保护域。保护域定义了授 予一段特定代码的所有权限。(一个保护域对应策略文件中的一个或多个grant子句。)装载入Java虚拟机的每一个类型都属于一个且仅属于—个保护域。 类装载器知道它装载的所有类或接口的代码库和签名者。它利用这些信息来创 阅读全文
posted @ 2019-12-03 20:36
mongotea
阅读(389)
评论(0)
推荐(0)
摘要:
为了决定由传递给AccessController的checkPermission ()方法的Permission对象所代表的操作,是否包含在(或隐含在)和调用栈中的代码相关联的权限中,AccessController利用了一个名为implies ()的重要方法。这个implies ()方法是在Per 阅读全文
posted @ 2019-12-03 20:36
mongotea
阅读(1331)
评论(0)
推荐(0)
摘要:
这些类型(Doer、Friend和Stranger)是为了说明访问控制的栈捡查机制而设计的。在本章后 面将给出一些栈检査的例子,那时读者就会理解设计它们的目的。 为了用Java 2 SDK 1.2中的jarsigner工具对JAR文件进行签名,keystore文件中必须存储签名者的公钥/私钥对,这个 阅读全文
posted @ 2019-12-03 20:35
mongotea
阅读(212)
评论(0)
推荐(0)
摘要:
在版本1.2的安全体系结构中,对应于整个Java应用程序的一个访问控制策略是由抽象类 java.security.Policy的一个子类的单个实例所表示的。在任何时候,每一个应用程序实际上都只有一个Policy对象。获得许可的代码可以用一个新的Policy对象替换当前的Policy对象,这是通过调用 阅读全文
posted @ 2019-12-03 20:35
mongotea
阅读(123)
评论(0)
推荐(0)
摘要:
java1.2和之前的版本中的安全管理器的区别和关联:page-61:java api实际上间接地调用了checkPermission()方法对于版本1.2及其以后的版本中引入的新的潜在不安全操作的概念(译者注:不在上面列表中的新的检查点),不存在老式的check方法。所以,在这种情况下,java 阅读全文
posted @ 2019-12-03 20:34
mongotea
阅读(133)
评论(0)
推荐(0)
摘要:
然后使用一个工具(例如版本1.2 SDK中的jarsinger)对整个JAR文件签名。这个签名工具将首先对JAR文件的内容进行单向散列计算,以产生一个散列。这个单向散列计算之所以被称为“单向”,是因为在只给出散列(即那个少量的数据)的情况下, 这个散列值不能包含足够的输人的信息,因此不能从散列重新生 阅读全文
posted @ 2019-12-03 20:34
mongotea
阅读(141)
评论(0)
推荐(0)
摘要:
本系列的文章是自己在边学习《深入Java虚拟机(原书第二版)》时,边记录下来的,用于加深学习效果和以后的回顾,如若侵权,烦请告知,我会及时删除。 阅读全文
posted @ 2019-12-03 20:31
mongotea
阅读(143)
评论(0)
推荐(0)
摘要:
Apr 25th, 2018 Posted by 飒然Hang in architecture 最新版本可见:https://github.com/superhj1987/pragmatic-java-engineer/blob/master/book/appendix/arch-usage.md 阅读全文
posted @ 2019-12-03 14:22
mongotea
阅读(177)
评论(0)
推荐(0)
摘要:
该平台面向三类用户:下家(合作商),上家(代理商),平台管理员。该平台提供给下家的功能包括:合作商入驻、充值价格查询、充值接口,充值结果查询、对账接口等。平台可以接入多个上家,根据每个上家充值接口的服务质量,充值时动态切换上家,目前暂时只接入一个上家。平台还提供了手机号码归属地查询接口,可以自动切换 阅读全文
posted @ 2019-12-03 13:24
mongotea
阅读(1203)
评论(0)
推荐(0)
摘要:
本附录主要内容 OAuth2密码授权(password grant) OAuth2客户端凭据授权(client credentials grant) OAuth2鉴权码授权(authorization code grant) OAuth2隐式授权(implicit grant) OAuth2令牌刷新 阅读全文
posted @ 2019-12-03 11:13
mongotea
阅读(425)
评论(0)
推荐(0)
摘要:
到目前为止,所有的代码都已经被构建和标记,并且已经创建了一个Docker镜像。我们现在已准备好将服务部署到10.1.3节中创建的Amazon ECS容器。完成这项部署所做的工作可在travis_scripts/deploy_to_amazon_ecs.sh中找到。代码清单10-7展示了这个脚本的代码 阅读全文
posted @ 2019-12-03 11:07
mongotea
阅读(206)
评论(0)
推荐(0)
摘要:
此时,所有的预构建配置和依赖项安装都已完成。要执行构建,将要使用Travis的script属性。就像before_install属性一样,script属性也会接受一系列将被执行的命令。由于这些命令太过冗长,我选择将构建中的每个主要步骤封装到它自己的shell脚本中,并让Travis执行shell脚本 阅读全文
posted @ 2019-12-03 11:05
mongotea
阅读(125)
评论(0)
推荐(0)
摘要:
从10.3节中介绍的通用架构中可以看到,在构建/部署管道背后有许多活动部件。由于本书的目的是“在实战中”向读者介绍知识,我们将详细介绍为EagleEye服务实现构建/部署管道的细节。图10-16列出了要用来实现这一管道的不同技术。 图10-16 EagleEye构建中使用的技术 (1)GitHub— 阅读全文
posted @ 2019-12-03 11:04
mongotea
阅读(361)
评论(0)
推荐(1)
摘要:
本章的目标是为读者提供构建和部署管道的工作组件,以便读者可以将这些组件定制到自己的特定环境。 让我们通过查看构建和部署管道的通用架构以及它表现出的一些通用模式来开始讨论。为了保持这些示例的流畅,我做了一些我通常不会在自己的环境中做的事情,我会相应地介绍这些东西。 关于部署微服务的讨论将从第1章中看到 阅读全文
posted @ 2019-12-03 11:03
mongotea
阅读(342)
评论(0)
推荐(0)
摘要:
我们目前已经建立了基础设施,现在可以进入本章的第二节。在本节中,我们将把EagleEye服务部署到Amazon ECS容器中。此工作将要分成两部分来完成。第一部分工作是为那些做事情做到最后丧失耐心的人(如我)而做的,将展示如何将EagleEye手动部署到Amazon实例中。这将有助于了解部署服务的机 阅读全文
posted @ 2019-12-03 11:02
mongotea
阅读(410)
评论(0)
推荐(0)
摘要:
要创建Redis集群,我们将要使用亚马逊的ElastiCache服务。ElastiCache允许开发人员使用Redis或Memcached构建内存中的数据缓存。对于EagleEye服务,我们将把在Docker中运行的Redis服务器迁移到ElastiCache。 先回到AWS控制台的主页(点击页面左 阅读全文
posted @ 2019-12-03 11:01
mongotea
阅读(1771)
评论(0)
推荐(0)
摘要:
在开始本节之前,我们需要创建和配置AWS账户。完成之后,我们的第一项任务就是创建要用于EagleEye服务的PostgreSQL数据库。要做到这一点,我们将要登录到AWS控制台并执行以下操作。 (1)在第一次登录到控制台时,我们将看到一个亚马逊Web服务列表。找到RDS的链接并点击它,进入RDS仪表 阅读全文
posted @ 2019-12-03 11:00
mongotea
阅读(558)
评论(0)
推荐(0)
摘要:
本章主要内容 理解为什么DevOps运动对微服务至关重要 配置EagleEye服务使用的核心亚马逊基础设施 手动将EagleEye服务部署到亚马逊的EC2容器服务中 为服务设计构建和部署管道 从持续集成转向持续部署 将基础设施视为代码 构建不可变的服务器 在部署中测试 将应用程序部署到云 本书已经接 阅读全文
posted @ 2019-12-03 11:00
mongotea
阅读(210)
评论(0)
推荐(0)
摘要:
Spring Cloud Sleuth和Zipkin不仅会跟踪HTTP调用,Spring Cloud Sleuth还会向Zipkin发送在服务中注册的入站或出站消息通道上的跟踪数据。 消息传递可能会在应用程序内引发它自己的性能和延迟问题。这句话的意思是,服务可能无法快速处理队列中的消息,或者可能存在 阅读全文
posted @ 2019-12-03 10:59
mongotea
阅读(223)
评论(0)
推荐(0)
摘要:
如果读者检查使用Spring Cloud Sleuth进行服务调用所返回的HTTP响应,永远不会看到在调用中使用的跟踪ID在HTTP响应首部中返回。通过查阅Spring Cloud Sleuth的文档,就会得知Spring Cloud Sleuth团队认为返回的跟踪数据可能是一个潜在的安全问题(尽管 阅读全文
posted @ 2019-12-03 10:58
mongotea
阅读(353)
评论(0)
推荐(0)
摘要:
让我们以一个场景来开始这一节。假设你是EagleEye 应用程序的一名开发人员,并且你在这周处于待命状态。你从客户那里收到一张工单,他抱怨说EagleEye应用程序的某一部分现在运行缓慢。你怀疑是许可证服务导致的,但问题是,为什么它会运行缓慢呢?问题究竟出在了哪里呢?许可证服务依赖于组织服务,而这两 阅读全文
posted @ 2019-12-03 10:58
mongotea
阅读(141)
评论(0)
推荐(0)
摘要:
在Zipkin中添加自定义跨度是非常容易的。我们可以从向许可证服务添加一个自定义跨度开始,这样就可以跟踪从Redis中提取数据所需的时间。然后,我们将向组织服务添加自定义跨度,以查看从组织数据库中检索数据需要多长时间。 为了将一个自定义跨度添加到许可证服务对Redis的调用中,我们需要修改licen 阅读全文
posted @ 2019-12-03 10:58
mongotea
阅读(144)
评论(0)
推荐(0)
摘要:
本章主要内容 使用Spring Cloud Sleuth将跟踪信息注入服务调用 使用日志聚合来查看分布式事务的日志 通过日志聚合工具进行查询 在跨多个微服务调用时,使用OpenZipkin直观地理解用户的事务 使用Spring Cloud Sleuth和Zipkin定制跟踪信息 微服务架构是一种强大 阅读全文
posted @ 2019-12-03 10:57
mongotea
阅读(229)
评论(0)
推荐(0)
摘要:
要在两个服务(许可证和组织)中开始使用Spring Cloud Sleuth,我们需要在两个服务的pom.xml文件中添加一个Maven依赖项: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring- 阅读全文
posted @ 2019-12-03 10:57
mongotea
阅读(234)
评论(0)
推荐(0)
摘要:
具有关联ID的统一日志记录平台是一个强大的调试工具。但是,在本章的剩余部分中,我们将不再关注如何跟踪日志条目,而是关注如何跨不同微服务可视化事务流。一张干净简洁的图片比一百万条日志条目有用。 分布式跟踪涉及提供一张可视化的图片,说明事务如何流经不同的微服务。分布式跟踪工具还将对单个微服务响应时间作出 阅读全文
posted @ 2019-12-03 10:57
mongotea
阅读(1200)
评论(0)
推荐(0)
摘要:
现在先从设置许可证服务以使用Redis开始。幸运的是,Spring Data已经简化了将Redis引入许可证服务中的工作。要在许可证服务中使用Redis,需要做以下4件事情。 (1)配置许可证服务以包含Spring Data Redis依赖项。 (2)构造一个到Redis服务器的数据库连接。 (3) 阅读全文
posted @ 2019-12-03 10:56
mongotea
阅读(522)
评论(0)
推荐(0)
摘要:
之前我们在许可证服务和组织服务之间构建了消息集成,以便使用默认的output和input通道,这些通道与Source和Sink接口一起打包在Spring Cloud Stream项目中。然而,如果想要为应用程序定义多个通道,或者想要定制通道的名称,那么开发人员可以定义自己的接口,并根据应用程序需要公 阅读全文
posted @ 2019-12-03 10:56
mongotea
阅读(352)
评论(0)
推荐(0)
摘要:
现在我们已经了解完Spring Cloud Stream中的基本组件,接下来看一个简单的Spring Cloud Stream示例。对于第一个例子,我们将要从组织服务传递一条消息到许可证服务。在许可证服务中, 唯一要做的事情就是将日志消息打印到控制台。 另外,在这个例子中,因为只有一个Spring 阅读全文
posted @ 2019-12-03 10:55
mongotea
阅读(397)
评论(0)
推荐(0)
摘要:
到目前为止,我们已经修改了组织服务,以便在组织服务更改组织数据时向Kafka发布消息。任何对组织数据感兴趣的服务,都可以在不需要由组织服务显式调用的情况下作出反应。这还意味着开发人员可以轻松地添加新的功能,可以让它们监听消息队列中的消息来对组织服务中的更改作出反应。现在让我们换一个角度,看看服务如何 阅读全文
posted @ 2019-12-03 10:55
mongotea
阅读(130)
评论(0)
推荐(0)
摘要:
使用消息传递方式将会在许可证服务和组织服务之间注入队列。该队列不会用于从组织服务中读取数据,而是由组织服务用于在组织服务管理的组织数据内发生状态更改时发布消息。图8-2演示了这种方法。 图8-2 当组织状态更改时,消息将被写入位于两个服务之间的消息队列之中 在图8-2所示的模型中,每次组织数据发生变 阅读全文
posted @ 2019-12-03 10:54
mongotea
阅读(225)
评论(0)
推荐(0)
摘要:
本章主要内容 了解事件驱动的架构处理以及它与微服务的相关性 使用Spring Cloud Stream简化微服务中的事件处理 配置Spring Cloud Stream 使用Spring Cloud Stream和Kafka发布消息 使用Spring Cloud Stream和Kafka消费消息 使 阅读全文
posted @ 2019-12-03 10:54
mongotea
阅读(705)
评论(0)
推荐(0)
摘要:
Spring Cloud可以轻松地将消息传递集成到基于Spring的微服务中,它是通过Spring Cloud Stream项目来实现这一点的。Spring Cloud Stream是一个由注解驱动的框架,它允许开发人员在Spring应用程序中轻松地构建消息发布者和消费者。 Spring Cloud 阅读全文
posted @ 2019-12-03 10:54
mongotea
阅读(239)
评论(0)
推荐(0)
摘要:
本章主要内容 了解安全在微服务环境中的重要性 认识OAuth2标准 建立和配置基于Spring的OAuth2服务 使用OAuth2执行用户验证和授权 使用OAuth2保护Spring微服务 在服务之间传播OAuth2访问令牌 提到“安全”这个词往往会引起开发人员不由自主地痛苦沉吟。你会听到他们咕哝着 阅读全文
posted @ 2019-12-03 10:53
mongotea
阅读(401)
评论(0)
推荐(0)
摘要:
OAuth2是一个基于令牌的验证框架,但具有讽刺意味的是,它并没有为如何定义其规范中的令牌提供任何标准。为了矫正OAuth2令牌标准的缺陷,一个名为JSON Web Token(JWT)的新标准脱颖而出。JWT是因特网工程任务组(Internet Engineering Task Force,IET 阅读全文
posted @ 2019-12-03 10:53
mongotea
阅读(501)
评论(0)
推荐(0)
摘要:
虽然通过Zuul网关代理所有请求确实可以简化服务调用,但是在想要编写应用于所有流经网关的服务调用的自定义逻辑时, Zuul的真正威力才发挥出来。在大多数情况下,这种自定义逻辑用于强制执行一组一致的应用程序策略,如安全性、日志记录和对所有服务的跟踪。 这些应用程序策略被认为是横切关注点,因为开发人员希 阅读全文
posted @ 2019-12-03 10:51
mongotea
阅读(451)
评论(0)
推荐(0)
摘要:
Spring Cloud集成了Netflix开源项目Zuul。Zuul是一个服务网关,它非常容易通过Spring Cloud注解进行创建和使用。Zuul提供了许多功能,具体包括以下几个。 将应用程序中的所有服务的路由映射到一个URL——Zuul不局限于一个URL。在Zuul中,开发人员可以定义多个路 阅读全文
posted @ 2019-12-03 00:06
mongotea
阅读(316)
评论(0)
推荐(0)

浙公网安备 33010602011771号