12 2019 档案
摘要:当今的架构领域,已经从先前的门派林立、各种思想和概念混杂的基础探索时期,演 化成为了这样两个重要的潮流:一个是开始大量使用架构描述语言(ADL)及其相应辅助 工具;另一个是全范围地接受产品线架构方法论。 1.架构描述语言及辅助工具 业界现在已经普遍认识到,先前通过使用一些非正式的图表来表达一个系统结
阅读全文
摘要:构建符合上述特征要求的软件系统产品线,对以往的系统开发确实是一个严峻的挑战。 如果仅仅使用传统的系统开发方式,则很难满足产品线开发的要求。如图8-1所示,如果 —个公司决定将其现有的软件系统产品进行产品线化工作,则需要在六个主要方面采取相应的变革,我们称之为产品线架构变革过程模型,简称为PLAEM模
阅读全文
摘要:从20世纪90年代开始,由于系统架构的全方位兴起(例如面向对象的架构技术、构 件技术、架构与设计模式等),越来越多的从业人员认识到提高架构和设计质量的重要性。 这使得架构评审得到了飞跃式的演化。通过近十几年的发展,架构评审己经有了长足的进 步。我们现在可以看到业界许多体系化的架构评审方法和评审技术,
阅读全文
摘要:根据业界的统计数据显示,在一个软件系统从开始研发到最终消亡的整个生命周期过 程中,前期的架构、设计、编码、测试所付出的成本及代价只占所有系统相关工作的 20%~40%。绝大部分的工作重点,还需要花费到系统投入生产的后续维护和在以往系统上 进行的升级工作上。 与此形成鲜明对比的是,系统开发行业,尤其是
阅读全文
摘要:4.以测试为驱动 “Only testing can prove the ultimate software quality” 是一句大家都知道的名言。这 意味着,作为衡量一个系统品质的最好方法就是进行髙质量的系统测试。虽然进行测试这 项工作,并不是架构师和设计人员分内的职责。但是,作为系统的主要技
阅读全文
摘要:本系列的文章是自己在边学习购买的书籍《软件架构的艺术》时,边记录下来的,用于加深学习效果和以后的回顾,如若侵权,请告知,我会及时删除。
阅读全文
摘要:商业架构概念的完成,能够有效地帮助系统架构人员全面、清晰、准确地构建一个商 业所涉及的内部及外部各种重要的概念:组织结构划分、人员角色及职能分工、业务流程 组成、业务活动顺序、业务信息交换与信息依赖、业务规则要求等静态及动态商业特征。 通过商业架构概念的构建,系统架构人员已经完全具备了该商业领域的相
阅读全文
摘要:从软件工程发展的历史来看,我们可以看到许多各式各样耳熟能详的流程或模型:例 如瀑布式软件开发流程、迭代式的RUP、敏捷开发流程、CMM/CMMI、各个公司自己定制 的流程等。但是,无论是哪种软件开发流程,无论其使用了怎样的用词和行文来表述流程, 基本上都遵循了 “V-Model”这个著名的软件开发流
阅读全文
摘要:提供高效的帮助和引导。具体而言,架构师的工作内容主要包括: ♦冷静和系统地平衡功能与性能的要求,分析软件系统盾量的要求和其他系统特征。 #控制和处理有关系统粒度、范围、包含、连接和耦合的问題。 澄清接口策略,制定接口架构约束原則。 ^计划系统资源分配与调度原则。 •稳定业务关系模型(实体、关系、协同
阅读全文
摘要:■ 2.1软件架构师的定义、分类和职责 从1985年开始,在过去二十多年中,关于什么是“软件架构(Software Architecture)” 已经基本得到了软件工程领域普遍的认同。其中一些重要的定义介绍如下。 “软件架构代表了一个系统的组织结构•这包括将系统分解为不同的部分、界定它们之 间的连接
阅读全文
摘要:就在同一时期,其他的相关研究也正逐渐起步。这些研究的目的是试图从那些非正式、 不标准的经验知识中,提炼和组织出构造软件架构可利用的、相似的问题解决手段和设计 风格。这样,研究的成果就可以被不同的领域、在解决相似的问题时所重用。这些研究都 是针对当时一些著名系统进行分析和总结的,试图识别出那些通用的系
阅读全文
摘要:扩展无状态的微服务是相对简单的。但如果我们把数据存储在一个数据库呢?我们也需要 知道如何扩展数据库。不同类型的数据库会提供不同形式的扩展,理解哪种形式最适合你 的使用场景,将确保从一开始你就选择了正确的数据库技术。 11.8.1服务的可用性和数据的持久性 更直接地说,重要的是你要区分服务的可用性和数
阅读全文
摘要:12.1微服务的原则 我们在第2章讨论过,微服务原则可以发挥什么样的作用。它们主要描述了该如何做,以 及为什么应该这样做的问题。这些原则可以帮助我们在构建系统时做出各种决定。你绝对 应该定义自己的原则,但微服务的一些关键原则,如图12-1总结的,我认为值得在这里洋 述。这些原则将帮助我们,创建出一系
阅读全文
摘要:11.1故障无处不在 我们知道事情可能会出错,硬盘可能会损坏,软件可能会崩溃。任何读过“分布式计算 的故障” (https://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing)的人都会告诉 你,网络也是不可靠的。我们可以尽力尝试去限制
阅读全文
摘要:数据加密是一种责任,尤其当它是敏感数据时。希望我们已经做了可以做的一切,以确保 攻击者不能攻破我们的网络,也不能攻破我们的应用程序或操作系统,然后近距离访问底 层数据。然而,我们需要做好准备,万一他们真的攻破了,我们该怎么办。深度防御非常 关键。 在许多有名的安全漏洞中,都发生了静态数据被攻击者获取
阅读全文
摘要:到目前为止,本书大部分的内容集中在向细粒度架构迈进时所面临的技术挑战。但除此之 外,我们也需要考虑组织方面的问题。在这一章,我们将了解到忽略公司的组织结构会带 来什么样的危险。 我们的行业还很年轻,它似乎在不断地重塑自己。不过,一些关键定律还是经受住了时间 的考验。例如摩尔定律,它表示集成电路上可容
阅读全文
摘要:正如我之前所展示的,将系统拆分成更小的、细粒度的微服务会带来很多好处。然而,它 也增加了生产系统的监控复杂性。在本章中,我将带大家看看细粒度的系统在系统监控和 定位问题上所面临的挑战,同时还会介绍一些应对方法,让鱼和熊掌兼得! 我们现在有多个服务需要监控,有多个日志需要筛选,多个地方有可能因为网络延
阅读全文
摘要:我们需要考虑,在数据从一个点到另一个点的传输过程中,如何保护它们,也需要考虑在 其他情况下如何进行保护。我们需要考虑底层操作系统及网络的安全。有太多需要考虑的 点,有太多可以做的事情!那到底需要多安全呢?我们如何知道什么是足够安全呢? 我们还需要考虑人的因素。谁在使用我们的系统,他又会做些什么?而这
阅读全文
摘要:7.1测试类型 作为一名顾问,我喜欢使用形式各异的象限来对世界进行分类。起初,我以为这本书不会 有这样的象限。幸运的是,Brian Marick想出了一个非常棒的分类测试体系,恰好就是用 象限的方式。图7-1展示了 Lisa Crispin和Janet Gregory在《敏捷软件测试》一书中,用来
阅读全文
摘要:使用之前所提到的端到端测试,我们试图解决的关键问题是什么?是试图确保部署新的服 务到生产环境后,变更不会破坏新服务的消费者。有一种不需要使用真正的消费者也能达 到同样目的的方式,它就是CDC (Consumer-Driven Contract,消费者驱动的契约)。 当使用CDC时,我们会定义服务(或
阅读全文
摘要:很早之前,就有关于“每台机器(machine)应该有多少个服务”的讨论。在我们继续之 前,应该找一个比“机器”更好的术语。在前虚拟化时代,单个运行操作系统的主机与底 层物理基础设施之间的映射形式有很多种。因此,我倾向于使用“主机”(host)这个词来 做通用的隔离单元,也就是能够运行服务的一个操作系
阅读全文
摘要:其实,对我们来说知道订单被捕获并被处理就足够了,因为可以后面再对仓库的提取表做 一次插人操作。我们可以把这部分操作放在一个队列或者日志文件中,之后再尝试对其进 行触发。对于某些操作来说这是合理的,但要保证重试能够修复这个问题。 很多地方会把这种形式叫作最终一致性。相对于使用事务来保证系统处于一致的状
阅读全文
摘要:你真的在做Cl吗 我猜你很有可能正在组织内使用持续集成。如果没有的话,你应该开始这么做,因为这个 关键实践允许我们更快速、更容易地修改代码。如果没有持续集成,向微服务架构进行转 型就会非常痛苦。即便如此,很多宣称自己在做CI的团队并没有真正在做。他们认为使 用了 ci工具就算是采用了 ci这个实践,
阅读全文
摘要:论过了。然后,尝试理解这个单块系统能够被映射到哪些限界上下文中。假设一开始我们 识别出这个单块后台系统包含以下四个上下文。 •产品目录 与正在销售的商品相关的元数据。 •财务 账户、支付、退款等项目的报告。 • 仓库 -分发客户订单、处理退货、管理库存等。 • 推荐 该系统的算法正在申请专利。它是革
阅读全文
摘要:前面提到的那些选择各自都有其适用的范围。一个组织会选择基于片段组装的方式来构建 网站,但对于移动应用来说,BFF可能是更好的方式。关键是要保持底层服务能力的内聚 性。比如,预定音乐和改变客户信息的逻辑应该处在相应的服务中,避免这些逻辑在系统中到处散布。将太多的逻辑放入到刚才提到的那种中间层中是一个常
阅读全文
摘要:4.8实现基于事件的异步协作方式 前面讨论了一些与请求/响应模式相关的技术。那么基干事件的异步通信呢? 4.8.1技术选择 主要有两个部分需要考虑:微服务发布事件机制和消费者接收事件机制。 传统上来说,像RabbitMQ这样的消息代理能够处理上述两个方面的问题。生产者 (producer)使用API
阅读全文
摘要:由于服务端使用标准文本形式的响应,所以客户端可以很灵活地对资源进行使用,而基于 HTTP的REST能够提供多种不同的响应形式。到目前为止我们看到的例子都是XML的, 但事实上目前JSON更加流行。 JSON无论从形式上还是从使用方法上来说都更简单。有些支持者认为,相比XML, JSON的内容更加紧凑
阅读全文
摘要:3.2什么样的服务是好服务 在MusicCorp的团队为了把八轨带(eight track tape)递送到所有人手中而开始辛苦工作、 创建一个又一个的服务之前,让我们先缓缓,讨论一些很重要的基本原则。什么是好的服 务?如果你曾经尝试过SOA并且失败了,大概就知道我下一步要说什么了。不过万一你 没那
阅读全文
摘要:在我看来,集成是微服务相关技术中最重要的一个。做得好的话,你的微服务可以保持自 治性,你也可以独立地修改和发布它们;但做得不好的话会带来灾难。希望本章能够帮助 你在微服务之旅中,避免曾经在SOA中遇到的那些问题。 4.1寻找理想的集成技术 微服务之间通信方式的选择非常多样化,但哪个是正确的呢? SO
阅读全文
摘要:本系列的文章是自己在边学习购买的书籍《微服务设计》时,边记录下来的,用于加深学习效果和以后的回顾,如若侵权,请告知,我会及时删除。
阅读全文
摘要:2.3分区 前面我们将架构师比作城市规划师,那么在这个比喻里面,区域的概念对应的是什么呢? 它们应该是我们的服务边界,或者是一些粗粒度的服务群组。作为架构师,不应该过多关 注每个区域内发生的事情,而应该多关注区域之间的事情。这意味着我们应该考虑不同的 服务之间如何交互,或者说保证我们能够对整个系统的
阅读全文
摘要:Eric Evans的《领域驱动设计》一书帮助我们理解了用代码呈现真实世界的重要性, 并且 告诉我们如何更好地进行建模。持续交付理论告诉我们如何更有效及更高效地发布软件 产品, 并指出保持每次提交均可发布的重要性。 基于对Web的理解,我们寻找到了机器 与机器交互的更好方式。Alistair Coc
阅读全文
摘要:19.1 重新认识构架商业周期 在第1章中.我们介绍了构架商业周期的概念,并将它作为了本书的主题。本书对这 些周期的各个阶段进行了详细的讨论,并给出了若干个实例,以说明构架创建、描述、评 估、开发等各环节的•些基本原则。我们也已经强调过,里然作为•个研究领域,软件构 架有着很深的渊源.但该领域本身相
阅读全文
摘要:1.基于浏览器的客户机 基于浏览器的用户接口客户机相当于J2EE中基于浏览器的客户机。它们不受限于Web 浏览器.而是同样支持其他形式的标记语言.如面向蜂窝电话的无线应用协议(WAP)的 无线标记语訏(WML)。标记语言在这种情况下是不同的(也就是WML),但仍然可以采 用用于交付内容的相同的机制-
阅读全文
摘要:在整本书中我们都强调了所期望的质量属性和构架之闾的关系„我们所做的趣本假设 是控制系统设计就可以控制所实现的质量厲性。慢慢地这变得不再正确。现在,所构造的 系统采用了越来越多的商业组件,这•方面是为了节约成本,还有就足在许多方面所需要的技术太专业了。组件改变了设计过程,它们还可能会限制构架。尽管所选
阅读全文
摘要:此处的示例是在软件工程研究所(Software Engineering丨nstitute, SEI)幵发,用于自 动管理SE丨和其过渡期合作伙伴之间的交互的基于Web的信息系统。创建自动SEI许可人管理(Automated SEI Licensee Management, ASEILM)系统有如下儿
阅读全文
摘要:第16章 J2EE/EJB:工业标准计算基础结构的案例分析 16.3 构架解决方案 阁16.2给出了 J2EE多层模型的简单部署图。表16.3进一步描述了该构架的元素。 各层的作用如下所示: • 客户层。在Web应用中,客户层包括•个Intemet浏览器,它提交HTTP请求并 从Web服务器下载HT
阅读全文
摘要:EJB依祺它的容器提供所有的外部信息。如果EJB需要访问某个JDBC连接或者另 个bean,那么,它使用容器服务。访问其调用者的身份.获得对其自身的引用以及访问特 性都是通过容器服务完成的。这是一个使用“仲裁者”战术的示例。Bean通过以下某个机 制与它的,容器交互:回调方法、EJBContext接
阅读全文
摘要:第iv部分继续讲述构架商业周期。第I〜3部分讲述了构架的质量属性、编档、设计、 重构、评估等内容。第IV部分论述的重点是根据该构架构造多个系统.它讨论了系统产品 线.并给出了相关示例。这一部分是从如下5个方面进行论述的:产品线所采用的技术: 构建海军舰艇发射控制系统的产品线的•家公司;行业范围内的构
阅读全文
摘要:在核心资产存储庳的所有资产中,软件构架是重中之重。构建一个成功的软件产品线 的本质就是区别在产品线家族的所有成员中,什么会保持不变,什么会发生变化。软件构架在构建时已经为处理这种两重性做好了准备,因为所有的构架都是承认存在众多实例的抽象:毕竟,其主要的概念价值就在于能够使我们把重点放在大蛩不同实现中
阅读全文
摘要:Mk2.5系统采用的是少数点到点连接的处理器,而SS2000系列产品则采用大量的、分布 程度很高且有容错要求的处理器。实现软件生命周期的方法也由原来的基于RTL/2的结构 化分析/设计和瀑布式开发过程转变为采用更具面向对象特征的Ada83和迭代式开发过 程。对开发的支持手段也由原来自定义的本地创建和
阅读全文
摘要:13.3.1满足最初的需求:libWWW库 如前所述.libWWW库就是--个用以创建能够在客户机或服务器上运行的应用程序的 软件库。这个库提供由大多数应用程序共享的一些基本功能,如与远程主机建立连接的能 力、理解HTML数据流的能力等。 构建libWWW库的目的是要创建一个小型的、可移植的软件库,
阅读全文
摘要:正如我们在第11章所看到的.构架权衡分析方法(ATAM)为软件设汁师提供了种 在设计或维护软件系统时,对所面临的技术权衡进行评佔的手段„在ATAM中,我们主要 研究了系统的涉众认为重要的质量属性,其在实际或建议构架的设计中的实现程度。我们 还对构架权衡进行了分析-某个决策同时会对几个质量厲性产生影响
阅读全文
摘要:现在我们把CBAM方法应用到实际系统.以给出该方法在实际应用中的一个示例。 该系统具有重要的性能和可用性需求。该项目具有长期性,因此可修改性也非常重要。 ECS项目的管理人员只有有限的年度预箅来维持和增强当前的系统。在ATAM评估 中,我们从系统涉众那儿获取了许多期望对系统进行的变更。从而产生了大量
阅读全文
摘要:本章将介绍构架权衡分析方法,它是评估软件构架的一种综合全面的方法。之所以称 为ATAM方法,是因为这种方法不仅可以揭示出构架满足特定质量目标的情况,而且(因 为它认识到了构架决策会影响多个质量厲性)可以使我们更清楚地认识到质量目标之间的 联系一即如何权衡诸多质量目标。 评估大型系统的构架是一项复杂的
阅读全文
摘要:我们还选择了具有集成COTS产品经验的人,因为客户告诉 我们Nightingale采用了几个商业软件包。令人欣喜的是,我们的‘个提问者还具有在卫生 保健业工作的经验. 我们举行了 一个为时1天的开工会议,由评估小组、项目经理、首席设计师和 Nightingale的第1位客户的项目经理参加。项目经理、
阅读全文
摘要:10.1介 绍 在本书中,我们始终把构架当作在很大程度上受您控制的亊物,并说明了如何制定构 架决策(第3部分将阐述如何分析这些决策进行),以实现待开发系统的目标和需求。但是,我们还需耍考虑另外一方面。假定个系统己经存在,但不知道其构架。也许最初 ;的开发人员从来没有编写过构架文档:也许曾编写过文档,
阅读全文
摘要:在构架商业周期中.设计师已经设计了构架并将其•编成了文档。现在的任务是,讨论 如何评估和分析构架,以确保该构架满足了需求,能够正常发挥作用。这就是第III部分的 重点,我们首先回答关于构架评估的•些基本问题——原因、时间、成本、收益、技巧、 计划内、计划外、前览条件以及结果。 原 因 关于系统构架的
阅读全文
摘要:正如我们反复看到的一样,系统的软件构架在系统开发和开发该构架的组织中起到了 -个中心作用。对于系统和开发系统的项目,构架起到的是蓝图的作用。它定义了必须由 设汁和实现小组完成的工作任务,是系统质量厲性的主要载体,如性能、可修改性和安全 性。如果没有统一的构架构想,任何一个质量属性都无法实现。构架是一
阅读全文
摘要:现在,我们看一下使视围文档完整所需要做的工作,即捕获应用于多个视图或作为一 个整体的文档软件包的信息。跨视图的文档仅由3个主要方面组成,我们将其总结为“如何-什么-为什么”: (1)如何安排和组织构架的文档,以使构架的涉众能够有效可靠地找到所需要的信息。 本部分由于一个视图目录和一个视图模板组成。
阅读全文
摘要:在构架的模块分解结构的最初几个层次相当稳定后,就可以把这些模块分配给开发小 组。所得到的结果就是第2章所讨论的工作分配视图。该视图或者将模块分配给现有的开 发单元,或者定义新的单元。 早在1968年,构架与其开发者的密切关系就引起了有关人土的关注。[Conway 68, 29]曾做过如下阐述: 任取
阅读全文
摘要:今天的飞行模拟系统是现在最为复杂的软件系统之-。飞行模拟系统具有很强的分布 性,有严格的时间要求,而且还必须能够经常更新,以保持与所模拟的不断变化的飞行器 及环境的逼真性。在对如下几个方面进行设计时.这些大型软件系统的创建和维护对软件 开发提出了巨大的挑战: •严格的实时性能。 •可修改性,以适应需
阅读全文
摘要:6.1与构架商业周期的关系 阁6.3向我们展示了空中交通符制系统与构架商业周期的关系。这里的最终用户足联 邦航空管理部门,客户则足美W联邦航空局。开发组织足-家为美国政府提供了许多取耍 的软件密集型系统的大公司。技术环境因素包括要求使用Ada语言作为政府大型软件系统 的实现语言.以及将分布式计算作为
阅读全文
摘要:几乎在我们遇到的所有成功的面向对象系统中都具有但失败的系统中缺少 的两个特性是:存在一个强大的构架构想,应用管理良好的迭代式增量开发 周期. -Grady Booch[Stikeleather 96] 现在我们把注意力转向构架的设计以及当构架逐渐形成时您能够做些什么。本章将讨 论如下4个主题: •
阅读全文
摘要:可以把实现安全性的战术分为:与抵抗攻击有关的战术、与检测攻击有关的战术以及 与从攻击中恢复有关的战术。这3种战术都非常重要。我们对此做个很熟悉的比较,给 门装锁就是在抵抗攻出,在房子中放-个运动传感器就是在检测攻击.给房子上保险就是 从攻击中恢复过来。阁5.8给出了安全性战术的目标。 5.5.1抵抗
阅读全文
摘要:第4 章刻画了许多系统质量属性。该刻画是通过场景的集合进行的。理解为什么质量属性能够使您获取质量需求,但无助于理解如何实现它们。本萆就给您提供这种帮助。对 于在第4辟详细描述的6个成量属性,我们提供了如何实现每个质最属性的构架方面的指 导。这里阐述的战术并不涉及所有可能的质量属性,但我们在第8草将看
阅读全文
摘要:性能与时间有关。事件(中断、消息、用户请求或时间已到)发生时.系统必须对其 做出响应。事件到达和响应有很多特性,但性能苺本上与事件发生时,将要耗费系统多长 时间做出响应有关。 在使性能变得复杂的众多因素中,其中一个因素就是事件源的数量和到达模式。事件 可以来自用户请求、其他系统或系统内部。基于Web
阅读全文
摘要:—般场景的用途之一就是能够使涉众进行沟通-我们已经指出,每个属性团体都有其 描述基本概念的词汇,不同的术语可能代表相同的事件。这可能会给沟通带来麻烦。例如. 在有关性能的讨论中,代表用户的涉众可能并没有意识到对事件响应的等待时间与用户有 关。 促进这种了解将有助于对构架决策的讨论,尤其是对于权衡的讨
阅读全文
摘要:使用结构是A-7E系统所强调的构架层次上的第二个结构。分解结构没有说明软件运 行时的任何信息。我们可以理智地猜想在系统运行时不同模块中的两个过程足如何进行交 互的。但这样的信息在模块分解中实际上是找不到的。而使用结构则对软件交互的方式给 出了权威的描述。 使用关系。使用结构的思想是建立在使用关系的基
阅读全文
摘要:本书第丨部分介绍了构架商业周期(ABC),它为分析软件构架獎定了莲础。尤其是, 它陈述了当设计师开始构建系统时的各种影响因素,并指出了特定的质量属性要求(如性 能或可修改性)通常产生于组织的业务目标。设计师如何创建构架?这就足第丨丨部分的艰 点。因为质1域性的实现对系统的成功至关重要,因此我们开始对
阅读全文
摘要:第1章讨论了构架对企业的重要性。本章将从技术的角度重点讨论构架的重要性。软 件构架之所以重要,主要有以下3个基本原因: (1)涉众之间的交流。软件构架是种常见的对系统的抽象,绝大多数(如果不足 全部的话)系统的涉众都以此作为彼此理解、协商、达成共识或相互沟通的基础。 (2)早期设计决策。软件构架是所
阅读全文
摘要:面向对象程序的运行时结构与其代码结构之间经常存在较大的差异.在对程 序进行编译时,代码结构就巳固定下来了.,面向对象的代码结构由若干类构成,各类之间是固定的继承关系。 程序的运行时结构则由若干相互联系,相互通信的对象构成,而且这些对象 及其之间的关系是处于快速变化的。实际上,代码结构与运行时结构在
阅读全文
摘要:与Linda Northrop共同撰 如果一个项目的系统构架(包括理论基础)尚未确定,就不应该进行此 系统的全面开发.只有对构架做出明确清楚的表述,才能使之在整个开 发和维护过程中加以充分利用. -Barry Boehm [Boehm 95] 上-节阐述了构架在保证开发组织实现其商业目标方面所起的重
阅读全文
摘要:周伯生 美国卡内基•梅降大学软件工程研究所(CMU/SEI)是炎国联邦政府资助构建的研究 单位,由美国国防部主管。他们确认,为了保证软件开发工作的成功.由软件幵发人员、 软件采办人员和软件用户组成的集成化团队必须具有必要的软件工程知识和技能,以保证 能按时向用户交付正确的软件。所谓“正确的”就是指在
阅读全文
摘要:软件构架源自何处?当然来自设计师的聪明才智。但究竟逛如何构想出来的呢?要能 够设计出软件构架,设计师应该具备什么样的素质?另外,到底什么是软件构架?软件构架与软件设计是否相同?如果相同,何必再用软件构架这个词呢?如果不同.釕哪些差异, 为什么说软件构架很歌要? 软件构架是软件系统的核心,其影响久远,
阅读全文
摘要:本系列的文章是自己在边学习《软件构架实践》时,边记录下来的,用于加深学习效果和以后的回顾,如若侵权,烦请告知,我会及时删除。
阅读全文
摘要:除了可能会出现在class文件中的这200条指令的操作码,Java虚拟机规范还定义了另外两类操作码: 保留的操作码和"quick”操作码,这两种操作码不会合法地出现在Java class文件中。 Java虚拟机规范列出了三种保留操作码,如表A-1所示。这些操作码是为Java虚拟机实现及其工具所保留的
阅读全文
摘要:Java虚拟机的指令集包括四种调用方法的指令,本章对这四种指令和这些指令执行的环境进 行阐述。 19.1方法调用 Java程序设计语言提供了两种基本的方法:实例方法和类(或者静态)方法。这两种方法的区别在于: 1)实例方法在被调用之前,需要一个实例,而类方法不需要。 2)实例方法使用动态(迟)绑定,
阅读全文
摘要:不过,大多数情况下,监视器保护那些通过监视区域代码来访问的数据,在这种情况下一即要求数据仅可以由监视区域访问,监视器可以确保线程会互斥地访问这些数据。 另一种我们提到的被监视器所支持的同步是协作。互斥帮助线程在访问共享数据时不被其他线程干扰,而协作帮助线程与其他线程共同工作。 当一个线程需要一些特别
阅读全文
摘要:javac为remainder ()方法产生下列字节码序列: // The main bytecode sequence for remainder (); // Push local variable 0 {arg passed as0 iload_0 // dividend) // Push t
阅读全文
摘要:18.1微型子例程 字节码中的finally子句在方法内部的表现很像“微型子例程”。Java虚拟机在每个try语句块和与其相关的catch子句的结尾处都会“调用”finally子句的子例程。finally子句结束后(这里的结束指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行
阅读全文
摘要:只有对象引用和基本类型可以在Java的桟中以局部变量形式存在。Java栈不能容纳对象。 Java虚拟机中的对象和基本类型的结构分离在java编程语言中体现为:对象不能作为局部变量声明,只有对象引用和基本类型可以。对象引用在声明后并不指向任何有意义的东西,只有在引用被显式初始化后(无论是使引用指向一个
阅读全文
摘要:16.1条件分支 在Java源代码中,可以在一个方法中使用if、if-else、while、 do-while、for和switch语句来指定基本的控制流。当把所有源代码转换成为字节码的时候,除了switch语句外,Java编译器使用同样的操作码集。例如,Java提供的最简单的控制流是if语句。当编
阅读全文
摘要:12.1 二进制补码运算Java虚拟机所支持的所有的整数类型-byte, short、int和long,它们都是带符号的二进制补码数。二进制补码方案既能够描述正整数,也能够描述负整数。在一个二进制补码数中,最重要的位就是它的符号位。符号位为1,表示负整数;符号位为0,表示正整数和数字0。 能够被二进
阅读全文
摘要:13.1逻辑操作码Java虚拟机的逻辑操作主要针对int和long类型。这些处理int和long类型的操作与处理带符号二进制补码数的方式不同,而是按照通用的位模式进行处理。整数移位通过ishl、ishr, iushr操作码进行。Java的“<<”操作符由ishl实现,“>>”操作符由ishr实现,“
阅读全文
摘要:10.1常量入栈操作许多操作码执行常量入栈操作。操作码在执行常量入栈操作之前,使用如下三种方式指明 常量的值:常量值隐式包含在操作码内部,常量值在字节码流中如同操作数一样紧随在操作码 之后,或者从常量池中取出常量。 一些操作码自行指明入栈的常量的类型和值,例如,iconst_1操作码告知Java虚拟
阅读全文
摘要:11.1转换操作码Java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有 操作数,转换的值从桟顶端获得。Java虚拟机从栈顶端弹出一个值,对它进行转換,然后再把转 换结果压入栈。进行int、long, float和double类型之间转换的操作码如表11-1所示,针对这
阅读全文
摘要:堆碎块是在正常的程序运行过程中产生的。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活 动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间 是足够的,这是因为,堆中没有连续的空闲空间放得下新的对象。在一个虚拟内存系统中,增 长的堆所需要的额外分页
阅读全文
摘要:8.1.20示例:类型安全性与装载约束 在Java虚拟机的早期实现中,搞乱Java的类型系统是有可能的。一个Java程序可能欺骗Java 虚拟机,用一种类型的对象冒充另一种类型的对象。这种能力让破坏者非常高兴,因为他们可 以欺骗受信任的类非法访问非公开的数据,或者通过把类替换成新的版本改变方法的行为
阅读全文
摘要:8.1.19示例:卸载无法触及的greeter类 动态装载的类型变为无法触及而要被虚拟机卸载时的例子如下面的程序: 因为引用的类(这里是HowDoYouDo )是被GreeterClassLoader对象装载的。这两个类都是Java API的一部分,不管怎样都会最终被启动类装载器装载,因为loadC
阅读全文
摘要:8.1.17使用1.2版本的用户自定义类装载器 前一节描述的类装载器最初是为1.1版虚拟机设计的,但也可以在1.2版本中工作。虽然1.2版 本为java.lang.ClassLoader加人了默认的loadClass ()具体实现,这个具体的方法仍然可以被子 类所覆盖。因为loadClass ()的
阅读全文
摘要:不同之处在于,loadClass()试图保证被装载的类型是被装载到用户自定义的类装载器的命名空 间里,而forName()试图确认所需的类型被装载到当前命名空间中,这个当前命名空间就是类 型(该类型的方法包括forName ()调用)所属的定义类装载器的命名空间。 因为forName ()从类Eas
阅读全文
摘要:loadCIass ()方法从检查被请求调用的类型是否已经被自己装载过了开始。这是通过调用 findLoadedClass ()实现的,后者是ClassLoader的一个方法,传递被请求的类型的全限定名作为参数。如果这个类装载已经被标记为是这个具有该全限定名的类型的初始类装载器, findLoade
阅读全文
摘要:8.1.12直接引用 •常量池解析的最终目标是把符号引用替换为直接引用。符号引用的格式在第6章中详细定义了,但是直接引用应该是什么格式呢?你可能认为,直接引用的格式也是由不同的java虚拟机实现的设计者决定的。然而,在大多数实现中,总会有一些通用的特征。 指向类型、类变量和类方法的直接引用可能是指向
阅读全文
摘要:8.1.13 _quick 指令 Java虚拟机的第一版规范中描述了一种用来加速字节码解释的技术,Sun早期的一种java虚拟机实现中曾经使用过它。这种方案是,如果常量池入口已经被解析过,使用常量池人口的操 作码会被一个“_quick”操作码取代。当虚拟机遇到一个_quick指令时,它就知道常量池人
阅读全文
摘要:8.1.11编译时常量解析 在第7章讲过,被初始化为编译时常量的静态final变量的引用,在编译时被解析为常量值的 一个本地拷贝,这对于所有的基本类型和java.lang.String都是正确的。 这种对于常量的特别处理使Java语言具有了两个特性。首先,常量值的本地拷贝使得静态 final变量可以
阅读全文
摘要:8.1.10装载约束 Java类型可以符号化地引用常量池中的其他类型,解析时需要特别关照,当存在多个类装载 器的时候,要保证类型安全。当一个类型包含指向另一个类型中的字段的符号引用时,符号引 用包含一个描述符——它指明了该字段的类型。当一个类型包含指向另外一个类型的方法的符 号引用时,符号引用也包含
阅读全文
摘要:8.1.6 解析CONSTANT_Methodref_info入 口 要解析CONSTANT_Methodref_info类型的常量池人口,虚拟机必须先解析class_index项中 指定的CONSTANT_Class_info人口。也就是说,所有CONSTANT_Class_info解析过程中可能
阅读全文
摘要:8.1.7 解析CONSTANT_interfaceMethodref_info入口 要解析类型为CONSTANT_interfaceMethodref_info的常量池人口,虚拟机首先要解析 class_index项中指定的CONSTANT_Class_info人口。所以,任何在解析CONSTAN
阅读全文
摘要:8.1.8 解析CONSTANT_String_info入口 要解析类型是CONSTANT_String_info入口的人口,Java虚拟机必须把一个指向内部字符串对象 的引用放置到要被解析的常量池人口数据中去。该字符串对象(java.lang.String类的实例)必须 按照 string_ind
阅读全文
摘要:8.1.4 解析CONSTANT_Class_info入 口 在所有常量池入口类型中,解析起来最复杂的就是CONSTANT_Class_info了。这种人口 类型用来表示指向类(包括数组类)和接口的符号引用。有几个指令,比如new和anewarray, 直接使用CONSTANT_Class_info
阅读全文
摘要:8.1.5 解析CONSTANT_Fieldref_info入口要解析类型是CONSTANT_Fieldref_info的常量池入口,虚拟机必须首先解析class_index项 中指明的CONSTANT_Class_info入口。因此,解析CONSTANT_Fieldref_info时可能抛出任何因
阅读全文
摘要:8.1.2类装载器与双亲委派横型 在第3章曾讲过,1.2版本中引人了类装载器的形式化双亲委派模型。虽然老式版本(即12 版本之前)编写的类装载器无法享受双亲委派模型的好处,但仍然可以在1.2版本中使用,1.2版 本及更高版本中推荐使用双亲委派模型创建类装载器。1.2版本中每一个用户自定义的类装载器在
阅读全文
摘要:8.1.3常量池解析 本节描述解析每一种常量池入口类型的细节,包括可能在解析过程中抛出的错误。如果在 解析过程中抛出了错误,错误被看成是由指向执行解析的常量池入口的引用者抛出的。除了这里描述的错误,触发常量池入口解析的不同的指令,可能导致抛出其他的错误。比如,getstatic 导致CONSTANT
阅读全文
摘要:8.1.1解析和动态扩展 除了简单地在运行时连接类型之外,Java程序还可以在运行时决定连接哪一个类型。Java的 体系结构允许动态扩展Java程序,这个过程包括运行时决定所使用的类型,装载它们,使用它们。 通过传递类型的名字到java.lang.Class的forName ()方法,或者用户自定义
阅读全文
摘要:从程序员的角度来看,理解Java体系结构最重要的方面之一就是连接模型。前几章曾讲过, Java的连接模型允许用户自行设计类装载器,这样以来就可以在运行时定制地扩展用户的程序。 通过用户自定义的类装载器,你的程序可以装载在编译时并不知道或许尚未存在的类或者接口, 并动态连接它们。 驱动Java连接模型
阅读全文
摘要:7.3卸载类型 在很多方面,虚拟机中类的生命周期和对象的生命周期很相似。虚拟机创建并初始化对象,使程序能使用对象,然后在对象变得不再被引用后可选地执行垃圾收集。同样,虚拟机装 载、连接并初始化类,使程序能使用类,当程序不在引用它们的时候可选地卸载它们。 类的垃圾收集和卸载之所以在Java虚拟机中很重
阅读全文
摘要:7.2对象的生命周期一旦一个类被装载、连接和初始化,它就随时可以使用了。程序可以访问它的静态字段, 调用它的静态方法,或者创建它的实例。本节会讨论类的实例化和初始化,即对象生命起始阶 段的活动;还要讨论垃圾收集和终结,即对象生命尽头的活动。 7.2.1类实例化 在Java程序中,类可以被明确或者隐含
阅读全文
摘要:7.2.2垃圾收集和对象的终结 前面的章节中曾讲过,Java虚拟机实现必须具有某种自动堆存储管理策略一大部分是采用 垃圾收集器,本章前面也讲过,程序可以明确或者隐含地为对象分配内存,但是不能明确地释 放内存。但一个对象不再为程序所引用了,虚拟机必须回收(垃圾收集)那部分内存。实现可 以决定何时应垃圾
阅读全文
摘要:装载阶段由三个基本动作组成,要装载一个类型,Java虚拟机必须: •通过该类型的完全限定名,产生一个代表该类型的二进制数据流。 •解析这个二进制数据流为方法区内的内部数据结构。 •创建一个表示该类型的java.lang.Class类的实例。 这个二进制数据流可能遵守Java class文件格式,但是
阅读全文
摘要:当类型被装载后,就准备进行连接了。连接过程的第一步是验证——确认类型符合Java语言 的语义,并且它不会危及虚拟机的完整性。 在验证上,不同的虚拟机实现拥有一些灵活性。虚拟机实现的设计者可以决定如何以及何 时验证类型。Java虚拟机规范列出了虚拟机可以拋出的异常以及在何种条件下必须抛出它们。不 管J
阅读全文
摘要:Java虚拟机通过装载、连接和初始化一个java类型,使该类型可以被正在运行的java程序所 使用、其中,装载就是把二进制形式的Java类型读入Java虚拟机中;而连接就是把这种已经读人 虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去。连接阶段分为三个子步骤-验证、准备和解析。“验证”步骤
阅读全文
摘要:如前所述,属性在Java class文件中多处出现。它们可以出现在ClassFile、field_info、 method_info和Code_attribute表中。Code_attribme表本身即为一个属性,本节将对它进行阐述。(自我感悟:注意这里的field_info与后面的CONSTANT
阅读全文
摘要:常量池中容纳的符号引用包括三种特殊的字符串:全限定名、简单名称和描述符。所有的符 号引用都包括类或者接口的全限定名。字段的符号引用除了全限定类型名之外,还包括简单字段 名和字段描述符。方法的符号引用除了全限定类型名之外,还包括简单方法名和方法描述符。 在符号引用中使用的特殊字符串也同样用来描述被cl
阅读全文
摘要:一个class文件中只能包含一个类或者接口。占据多个字节空间的项按照高位在前的顺序分为几个连续的字节存放。可变长度的ClassFile表中的项,如表6-2所示,按照它们在class文件中出现的顺序列出了主要部分。 表6-2 ClassFile表的格式 类型 名 称 数量 u4 magic 1 u2
阅读全文
摘要:任何Java虚拟机实现的核心都是它的执行引擎。在Java虚拟机规范中,执行引擎的行为使用 指令集来定义。对于每条指令,规范都详细规定了当实现执行到该指令时应该处理什么,但是却对如何处理言之甚少。在前面的章节中提到过,实现的设计者有权决定如何执行字节码:实 现可以采取解释、即时编译或直接用芯片上的指令
阅读全文
摘要:并不强求Java虚拟机实现支持任何特定的本地方法接口。有些实现可以根本不支持本地方法 接口,还有一些可能支持少数几个,每一个对应一种不同的需求。 Sun的Java本地接口,或者称作JNI,是为可移植性准备的。JNI设计的可以被任何java虚拟机实现支持,而不管它们使用何种垃圾收集或者对象表示技术。这
阅读全文
摘要:栈帧由三部分组成:局部变量区,操作数找和帧数据区。局部变量区和操作数栈的大小要 视对应的方法而定,它们是按字长计算的。编译器在编译时就确定了这些值并放在class文件中。 而帧数据区的大小依赖于具体的实现。当虚拟机调用一个Java方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数 栈的大小
阅读全文
摘要:前面提到的所有运行时数据区都是在Java虚拟机规范中明确定义的,除此之外,对于一个运 行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地 方法时,它就进人了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接 口来访问虚拟机的运行时数据区,但不止于此
阅读全文
摘要:每当启动一个新线程时,Java虚拟机都会为它分配一个java栈。前面我们曾经提到Java栈以帧为单位保存线程运行状态。虚拟机只会直接对java栈执行两种操作:以帧为单位的压栈或出栈。 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当 前方法所属的类称为当前类,当前类的常
阅读全文
摘要:Java对象中包含的基本数据由它所属的类及其所有超类声明的实例变量组成。只要有一个对 象引用,虚拟机就必须能够快速地定位对象实例的数据。另外,它也必须能通过该对象引用访 问相应的类数据(存储于方法区的类型信息)。因此在对象中通常会有一个指向方法区的指针。 —种可能的堆空间设计就是,把堆分为两部分:一
阅读全文
摘要:对于一个运行中的Java程序而言,其中的每一个线程都有它自己的PC (程序计数器)寄存 器,它是在该线程启动时创建的。PC寄存器的大小是一个字长,因此它既能够持有一个本地指 针,也能够持有一个returnAddress。当线程执行某个Java方法时,PC寄存器的内容总是下一条 将被执行指令的“地址“
阅读全文
摘要:在Java虚拟机中,关于被装载类型的信息存储在一个逻辑上被称为方法区的内存中。当虚拟 机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件--个线性二进制数据流——然后将它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些 信息存储到方法区。该类型中的类(静态)
阅读全文
摘要:Java虚拟机中,最基本的数据单元就是字(word ),它的大小是由每个虚拟机实现的设计者 来决定的。字长必须足够大,至少是一个字单元就足以持有byte、short, int、char, float, return Address或者reference类型的值,而两个字单元就足以持有long或者do
阅读全文
摘要:和所有其他对象一样,用户自定义的类装载器以及Class类的实例都放在内存中的堆区,而装载的类型信息则都位于方法区。 ClassLoader中的四个方法是通往Java虚拟机的通道:// Four of the methods declared in class java.lang.ClassLoade
阅读全文
摘要:java语言中的所有基本类型同样也都是虚拟机中的基本类型。但是boolean有点特别,虽 然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持,当编译器把java源码编译为字节码时,它会用int或byte来表示boolean。在Java虚拟机中,false是由整
阅读全文
摘要:而本地方法调用的状态,则是以某种依赖于具体实现的方式存储在本地方法栈中,也可能是在寄存器或者其他某些与特定实现相关的内存区中。
阅读全文
摘要:到现在为止,在本章中给出的基本算法中,AccessController自顶向下对栈进行检查,严格地要求每一个栈帧都有执行某个操作的权限,以防一段不可靠的代码隐藏在一段可信任代码后 面。因为AccessControIler-路向下地查看调用栈,所以,它最终会找到任何不能被允许执行被 请求操作的方法。例
阅读全文
摘要:一个运行时的Java虚拟机实例的天职就是:负责运行一个Java程序。当启动一个Java程序时, 一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果在同一 台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己 的Java虚拟机实例中
阅读全文
摘要:当类装载器将类型装入Java虚拟机时,它们将为每个类型指派一个保护域。保护域定义了授 予一段特定代码的所有权限。(一个保护域对应策略文件中的一个或多个grant子句。)装载入Java虚拟机的每一个类型都属于一个且仅属于—个保护域。 类装载器知道它装载的所有类或接口的代码库和签名者。它利用这些信息来创
阅读全文
摘要:为了决定由传递给AccessController的checkPermission ()方法的Permission对象所代表的操作,是否包含在(或隐含在)和调用栈中的代码相关联的权限中,AccessController利用了一个名为implies ()的重要方法。这个implies ()方法是在Per
阅读全文
摘要:这些类型(Doer、Friend和Stranger)是为了说明访问控制的栈捡查机制而设计的。在本章后 面将给出一些栈检査的例子,那时读者就会理解设计它们的目的。 为了用Java 2 SDK 1.2中的jarsigner工具对JAR文件进行签名,keystore文件中必须存储签名者的公钥/私钥对,这个
阅读全文
摘要:在版本1.2的安全体系结构中,对应于整个Java应用程序的一个访问控制策略是由抽象类 java.security.Policy的一个子类的单个实例所表示的。在任何时候,每一个应用程序实际上都只有一个Policy对象。获得许可的代码可以用一个新的Policy对象替换当前的Policy对象,这是通过调用
阅读全文
摘要:java1.2和之前的版本中的安全管理器的区别和关联:page-61:java api实际上间接地调用了checkPermission()方法对于版本1.2及其以后的版本中引入的新的潜在不安全操作的概念(译者注:不在上面列表中的新的检查点),不存在老式的check方法。所以,在这种情况下,java
阅读全文
摘要:然后使用一个工具(例如版本1.2 SDK中的jarsinger)对整个JAR文件签名。这个签名工具将首先对JAR文件的内容进行单向散列计算,以产生一个散列。这个单向散列计算之所以被称为“单向”,是因为在只给出散列(即那个少量的数据)的情况下, 这个散列值不能包含足够的输人的信息,因此不能从散列重新生
阅读全文
摘要:本系列的文章是自己在边学习《深入Java虚拟机(原书第二版)》时,边记录下来的,用于加深学习效果和以后的回顾,如若侵权,烦请告知,我会及时删除。
阅读全文
摘要:该平台面向三类用户:下家(合作商),上家(代理商),平台管理员。该平台提供给下家的功能包括:合作商入驻、充值价格查询、充值接口,充值结果查询、对账接口等。平台可以接入多个上家,根据每个上家充值接口的服务质量,充值时动态切换上家,目前暂时只接入一个上家。平台还提供了手机号码归属地查询接口,可以自动切换
阅读全文
摘要:本附录主要内容 OAuth2密码授权(password grant) OAuth2客户端凭据授权(client credentials grant) OAuth2鉴权码授权(authorization code grant) OAuth2隐式授权(implicit grant) OAuth2令牌刷新
阅读全文
摘要:到目前为止,所有的代码都已经被构建和标记,并且已经创建了一个Docker镜像。我们现在已准备好将服务部署到10.1.3节中创建的Amazon ECS容器。完成这项部署所做的工作可在travis_scripts/deploy_to_amazon_ecs.sh中找到。代码清单10-7展示了这个脚本的代码
阅读全文
摘要:此时,所有的预构建配置和依赖项安装都已完成。要执行构建,将要使用Travis的script属性。就像before_install属性一样,script属性也会接受一系列将被执行的命令。由于这些命令太过冗长,我选择将构建中的每个主要步骤封装到它自己的shell脚本中,并让Travis执行shell脚本
阅读全文
摘要:从10.3节中介绍的通用架构中可以看到,在构建/部署管道背后有许多活动部件。由于本书的目的是“在实战中”向读者介绍知识,我们将详细介绍为EagleEye服务实现构建/部署管道的细节。图10-16列出了要用来实现这一管道的不同技术。 图10-16 EagleEye构建中使用的技术 (1)GitHub—
阅读全文
摘要:本章的目标是为读者提供构建和部署管道的工作组件,以便读者可以将这些组件定制到自己的特定环境。 让我们通过查看构建和部署管道的通用架构以及它表现出的一些通用模式来开始讨论。为了保持这些示例的流畅,我做了一些我通常不会在自己的环境中做的事情,我会相应地介绍这些东西。 关于部署微服务的讨论将从第1章中看到
阅读全文
摘要:我们目前已经建立了基础设施,现在可以进入本章的第二节。在本节中,我们将把EagleEye服务部署到Amazon ECS容器中。此工作将要分成两部分来完成。第一部分工作是为那些做事情做到最后丧失耐心的人(如我)而做的,将展示如何将EagleEye手动部署到Amazon实例中。这将有助于了解部署服务的机
阅读全文
摘要:要创建Redis集群,我们将要使用亚马逊的ElastiCache服务。ElastiCache允许开发人员使用Redis或Memcached构建内存中的数据缓存。对于EagleEye服务,我们将把在Docker中运行的Redis服务器迁移到ElastiCache。 先回到AWS控制台的主页(点击页面左
阅读全文
摘要:在开始本节之前,我们需要创建和配置AWS账户。完成之后,我们的第一项任务就是创建要用于EagleEye服务的PostgreSQL数据库。要做到这一点,我们将要登录到AWS控制台并执行以下操作。 (1)在第一次登录到控制台时,我们将看到一个亚马逊Web服务列表。找到RDS的链接并点击它,进入RDS仪表
阅读全文
摘要:本章主要内容 理解为什么DevOps运动对微服务至关重要 配置EagleEye服务使用的核心亚马逊基础设施 手动将EagleEye服务部署到亚马逊的EC2容器服务中 为服务设计构建和部署管道 从持续集成转向持续部署 将基础设施视为代码 构建不可变的服务器 在部署中测试 将应用程序部署到云 本书已经接
阅读全文
摘要:Spring Cloud Sleuth和Zipkin不仅会跟踪HTTP调用,Spring Cloud Sleuth还会向Zipkin发送在服务中注册的入站或出站消息通道上的跟踪数据。 消息传递可能会在应用程序内引发它自己的性能和延迟问题。这句话的意思是,服务可能无法快速处理队列中的消息,或者可能存在
阅读全文
摘要:如果读者检查使用Spring Cloud Sleuth进行服务调用所返回的HTTP响应,永远不会看到在调用中使用的跟踪ID在HTTP响应首部中返回。通过查阅Spring Cloud Sleuth的文档,就会得知Spring Cloud Sleuth团队认为返回的跟踪数据可能是一个潜在的安全问题(尽管
阅读全文
摘要:让我们以一个场景来开始这一节。假设你是EagleEye 应用程序的一名开发人员,并且你在这周处于待命状态。你从客户那里收到一张工单,他抱怨说EagleEye应用程序的某一部分现在运行缓慢。你怀疑是许可证服务导致的,但问题是,为什么它会运行缓慢呢?问题究竟出在了哪里呢?许可证服务依赖于组织服务,而这两
阅读全文
摘要:在Zipkin中添加自定义跨度是非常容易的。我们可以从向许可证服务添加一个自定义跨度开始,这样就可以跟踪从Redis中提取数据所需的时间。然后,我们将向组织服务添加自定义跨度,以查看从组织数据库中检索数据需要多长时间。 为了将一个自定义跨度添加到许可证服务对Redis的调用中,我们需要修改licen
阅读全文
摘要:本章主要内容 使用Spring Cloud Sleuth将跟踪信息注入服务调用 使用日志聚合来查看分布式事务的日志 通过日志聚合工具进行查询 在跨多个微服务调用时,使用OpenZipkin直观地理解用户的事务 使用Spring Cloud Sleuth和Zipkin定制跟踪信息 微服务架构是一种强大
阅读全文
摘要:要在两个服务(许可证和组织)中开始使用Spring Cloud Sleuth,我们需要在两个服务的pom.xml文件中添加一个Maven依赖项: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-
阅读全文
摘要:具有关联ID的统一日志记录平台是一个强大的调试工具。但是,在本章的剩余部分中,我们将不再关注如何跟踪日志条目,而是关注如何跨不同微服务可视化事务流。一张干净简洁的图片比一百万条日志条目有用。 分布式跟踪涉及提供一张可视化的图片,说明事务如何流经不同的微服务。分布式跟踪工具还将对单个微服务响应时间作出
阅读全文
摘要:现在先从设置许可证服务以使用Redis开始。幸运的是,Spring Data已经简化了将Redis引入许可证服务中的工作。要在许可证服务中使用Redis,需要做以下4件事情。 (1)配置许可证服务以包含Spring Data Redis依赖项。 (2)构造一个到Redis服务器的数据库连接。 (3)
阅读全文
摘要:之前我们在许可证服务和组织服务之间构建了消息集成,以便使用默认的output和input通道,这些通道与Source和Sink接口一起打包在Spring Cloud Stream项目中。然而,如果想要为应用程序定义多个通道,或者想要定制通道的名称,那么开发人员可以定义自己的接口,并根据应用程序需要公
阅读全文
摘要:现在我们已经了解完Spring Cloud Stream中的基本组件,接下来看一个简单的Spring Cloud Stream示例。对于第一个例子,我们将要从组织服务传递一条消息到许可证服务。在许可证服务中, 唯一要做的事情就是将日志消息打印到控制台。 另外,在这个例子中,因为只有一个Spring
阅读全文
摘要:到目前为止,我们已经修改了组织服务,以便在组织服务更改组织数据时向Kafka发布消息。任何对组织数据感兴趣的服务,都可以在不需要由组织服务显式调用的情况下作出反应。这还意味着开发人员可以轻松地添加新的功能,可以让它们监听消息队列中的消息来对组织服务中的更改作出反应。现在让我们换一个角度,看看服务如何
阅读全文
摘要:使用消息传递方式将会在许可证服务和组织服务之间注入队列。该队列不会用于从组织服务中读取数据,而是由组织服务用于在组织服务管理的组织数据内发生状态更改时发布消息。图8-2演示了这种方法。 图8-2 当组织状态更改时,消息将被写入位于两个服务之间的消息队列之中 在图8-2所示的模型中,每次组织数据发生变
阅读全文
摘要:本章主要内容 了解事件驱动的架构处理以及它与微服务的相关性 使用Spring Cloud Stream简化微服务中的事件处理 配置Spring Cloud Stream 使用Spring Cloud Stream和Kafka发布消息 使用Spring Cloud Stream和Kafka消费消息 使
阅读全文
摘要:Spring Cloud可以轻松地将消息传递集成到基于Spring的微服务中,它是通过Spring Cloud Stream项目来实现这一点的。Spring Cloud Stream是一个由注解驱动的框架,它允许开发人员在Spring应用程序中轻松地构建消息发布者和消费者。 Spring Cloud
阅读全文
摘要:本章主要内容 了解安全在微服务环境中的重要性 认识OAuth2标准 建立和配置基于Spring的OAuth2服务 使用OAuth2执行用户验证和授权 使用OAuth2保护Spring微服务 在服务之间传播OAuth2访问令牌 提到“安全”这个词往往会引起开发人员不由自主地痛苦沉吟。你会听到他们咕哝着
阅读全文
摘要:OAuth2是一个基于令牌的验证框架,但具有讽刺意味的是,它并没有为如何定义其规范中的令牌提供任何标准。为了矫正OAuth2令牌标准的缺陷,一个名为JSON Web Token(JWT)的新标准脱颖而出。JWT是因特网工程任务组(Internet Engineering Task Force,IET
阅读全文
摘要:虽然通过Zuul网关代理所有请求确实可以简化服务调用,但是在想要编写应用于所有流经网关的服务调用的自定义逻辑时, Zuul的真正威力才发挥出来。在大多数情况下,这种自定义逻辑用于强制执行一组一致的应用程序策略,如安全性、日志记录和对所有服务的跟踪。 这些应用程序策略被认为是横切关注点,因为开发人员希
阅读全文
摘要:Spring Cloud集成了Netflix开源项目Zuul。Zuul是一个服务网关,它非常容易通过Spring Cloud注解进行创建和使用。Zuul提供了许多功能,具体包括以下几个。 将应用程序中的所有服务的路由映射到一个URL——Zuul不局限于一个URL。在Zuul中,开发人员可以定义多个路
阅读全文
摘要:本章主要内容 结合微服务使用服务网关 使用Spring Cloud和Netflix Zuul实现服务网关 在Zuul中映射微服务路由 构建过滤器以使用关联ID并进行跟踪 使用Zuul进行动态路由 在像微服务架构这样的分布式架构中,需要确保跨多个服务调用的关键行为的正常运行,如安全、日志记录和用户跟踪
阅读全文
摘要:当一个@HystrixCommand被执行时,它可以使用两种不同的隔离策略——THREAD(线程)和 SEMAPHORE(信号量)来运行。在默认情况下,Hystrix 以 THREAD隔离策略运行。用于保护调用的每个Hystrix命令都在一个单独的线程池中运行,该线程池不与父线程共享它的上下文。这意
阅读全文
摘要:在基于微服务的应用程序中,开发人员通常需要调用多个微服务来完成特定的任务。在不使用舱壁模式的情况下,这些调用默认是使用同一批线程来执行调用的,这些线程是为了处理整个Java容器的请求而预留的。在存在大量请求的情况下,一个服务出现性能问题会导致Java容器的所有线程被刷爆并等待处理工作,同时堵塞新请求
阅读全文
摘要:我们将会看到两大类别的Hystrix实现。在第一个类别中,我们将使用Hystrix断路器包装许可证服务和组织服务中所有对数据库的调用。然后,我们将使用Hystrix包装许可证服务和组织服务之间的内部服务调用。虽然这是两个不同类别的调用,但是Hystrix的用法是完全一样的。图5-4展示了使用Hyst
阅读全文
摘要:本章主要内容 实现断路器模式、后备模式和舱壁模式 使用断路器模式来保护微服务客户端资源 当远程服务失败时使用Hystrix 实施Hystrix的舱壁模式来隔离远程资源调用 调节Hystrix的断路器和舱壁的实现 定制Hystrix的并发策略 所有的系统,特别是分布式系统,都会遇到故障。如何构建应用程
阅读全文
摘要:现在有一个基于Spring的Eureka服务器正在运行。在本节中,我们将配置组织服务和许可证服务,以便通过Eureka服务器来注册它们自身。这项工作是为了让服务客户端从Eureka注册表中查找服务做好准备。在本节结束时,读者应该对如何通过Eureka注册Spring Boot微服务有一个明确的认识。
阅读全文
摘要:本系列的文章是自己在边学习购买的书籍《Spring微服务实战》时,边记录下来的,用于加深学习效果和以后的回顾,如若侵权,请告知,我会及时删除。
阅读全文
摘要:本章主要内容 为什么服务发现对基于云的应用程序环境很重要 与传统的负载均衡方法作对比,了解服务发现的优缺点 建立一个Spring Netflix Eureka服务器 通过Eureka注册一个基于Spring Boot的微服务 使用Spring Cloud和Netflix的Ribbon库来完成客户端负
阅读全文
摘要:如果在Spring Cloud配置服务器上的某个属性的值是加密的,但提供的加密串是错误的, 比如将licensingservice.yml文件中的下列属性: spring.datasource.password: "{cipher}11db9cabb9e352467114f7e91e0f83d5d8
阅读全文
摘要:在默认情况下,Spring Cloud配置服务器在应用程序配置文件中以纯文本格式存储所有属性,包括像数据库凭据这样的敏感信息。 将敏感凭据作为纯文本保存在源代码存储库中是一种非常糟糕的做法。遗憾的是,它发生的频率比我们想象的要高得多。Spring Cloud Config可以让我们轻松加密敏感属性。
阅读全文
摘要:在上一章中,我们构建了一个简单的许可证服务框架,这个框架只是返回一个代表数据库中单个许可记录的硬编码Java对象。在下一个示例中,我们将构建许可证服务,并与持有许可数据的Postgres数据库进行交流。 我们将使用Spring Data与数据库进行通信,并将数据从许可证表映射到保存数据的POJO。数
阅读全文
摘要:在上一节的LicenseService类中,读者可能已经注意到,在getLicense()中使用了来自config.getExampleProperty()的值来设置license.withComment()的值。所指的代码如下: public License getLicense(String o
阅读全文
摘要:1、构建jar:在idea中导入工程后,使用maven的package命令打包为jar:configurationserver-0.0.1-SNAPSHOT.jar。 2、修改配置文件application.yml为如下内容: server: port: 8888 spring: profiles:
阅读全文
摘要:以第3章示例:spmia-chapter3-master中的子项目confsvr为例说明: 其pom文件内容摘要如下: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-paren
阅读全文
摘要:本章主要内容 将服务配置与服务代码分开 配置Spring Cloud配置服务器 集成Spring Boot微服务 加密敏感属性 在某种程度上来说,开发人员是被迫将配置信息与他们的代码分开的。毕竟,自上学以来,他们就一直被灌输不要将硬编码带入应用程序代码中的观念。许多开发人员在应用程序中使用一个常量类
阅读全文
摘要:服务引导(图2-6中的步骤2)发生在微服务首次启动并需要加载其应用程序配置信息的时候。图2-8为引导处理提供了更多的上下文。 任何应用程序开发人员都知道,有时需要使应用程序的运行时行为可配置。通常这涉及从应用程序部署的属性文件读取应用程序的配置数据,或从数据存储区(如关系数据库)读取数据。 微服务通
阅读全文
摘要:从DevOps的角度来看,微服务架构背后的一个关键概念是可以快速部署微服务的多个实例,以应对变化的应用程序环境(如用户请求的突然涌入、基础设施内部的问题等)。 为了实现这一点,微服务需要作为带有所有依赖项的单个制品进行打包和安装,然后可以将这个制品部署到安装了Java JDK的任何服务器上。这些依赖
阅读全文
摘要:对于DevOps工程师来说,微服务的设计关乎在投入生产后如何管理服务。编写代码通常是很简单的,而保持代码运行却是困难的。 虽然DevOps是一个丰富而新兴的IT领域,在本书后面,读者将基于4条原则开始微服务开发工作并根据这些原则去构建。这些原则具体如下。 (1)微服务应该是独立的和可独立部署的,多个
阅读全文
摘要:现在已经有了构建脚本,并实现了一个简单的Spring Boot引导类,接下来就可以开始编写第一个代码来做一些事情。这个代码就是控制器类。在Spring Boot应用程序中,控制器类公开了服务端点,并将数据从传入的HTTP请求映射到将处理该请求的Java方法。 遵循REST 本书中的所有微服务都遵循R
阅读全文
摘要:我们的目标是在Spring Boot中运行一个简单的微服务,然后重复这个步骤以提供功能。为此,我们需要在许可证服务微服务中创建以下两个类。 一个Spring引导类,可被Spring Boot用于启动和初始化应用程序。 一个Spring控制器类,用来公开可以被微服务调用的HTTP端点。 如刚才所见,S
阅读全文
摘要:架构师需要关心的最后一部分,是应用程序中的微服务该如何彼此交流。使用微服务构建业务逻辑时,服务的接口应该是直观的,开发人员应该通过学习应用程序中的一两个服务来获得应用程序中所有服务的工作节奏。 一般来说,可使用以下指导方针思考服务接口设计。 (1)拥抱REST的理念——REST对服务的处理方式是将H
阅读全文
摘要:一个微服务架极采用了丌同癿方法来提供癿功能。具体来诪,微服务架极有以下特性: 有限的:微服务单一职责、范围有限。微服务拥抱Unix哲学:一个应用只不过是一个服务集合,每个服务做一件事,并且一件事情做得很好。 松耦合:一个微服务应用就是一个小服务集合,仅仅通过使用非专有的调用协议(例如,HTT
阅读全文
摘要:微服务架极具有仔下特点:、 n 微服务通信基亍几个基本原则(注意我说的是原则,没有标准)和采用轻量级的通信协议如HTTP和JSON(JavaScript Object Notation)为服务消费者和服务提供者乊间提供数据交换。 n 服务的底层实现不技术无关,因为应用程序总是不技术无关的协议通信(J
阅读全文
摘要:之前一时不查,导致CSDN博客账号被盗,所有文章被删,N年心血毁于一旦,不过,幸好自己备份了一些。再次开博之前,自己比较了一下不同的博客平台,从总体而言,最终选择了博客园,后面,我会陆续将之前写的文章、多年的技术和感想,放上去分享给大家,欢迎大家来踩,一起探讨。最后在此,提醒各位技术追求者,要注意做
阅读全文

浙公网安备 33010602011771号