将Java EE Monolith雕刻成微服务

在介绍了为什么微服务应该由事件驱动的简介博客之后,我想采取一些其他步骤,并在有关博客的同时准备我即将进行的一系列演讲(请参阅jBCNconf和Red Hat Summit,旧金山 )。 在Twitter @christianposta上关注我,了解该项目的更新。 在本文中,我们讨论了雕刻整体的第一部分。

我将在这些文章中深入探讨的整体内容来自Ticket Monster教程 ,该教程很长时间以来一直是如何使用Java EE和Red Hat技术构建出色应用程序的典型示例。 我们之所以使用Ticket Monster,是因为它是一款写得很好的应用程序,可以很好地跨越“非平凡的”和“示例过于复杂”的界限。 出于说明目的,它是完美的,我们可以具体指出它,并使用真实的示例代码讨论某些方法的优缺点。 请根据进一步的讨论仔细研究领域和当前架构 。

拱门

看看上面的当前架构,我们可以发现事情已经很好地解决了。 我们具有UI组件,业务服务和长期持久性存储,它们之间很好地分离和解耦,但打包为单个可部署文件(在这种情况下为WAR文件)。 如果我们检查源代码,就会发现代码具有类似的 结构 。 如果我们要部署它,则对任何组件的任何更改都将决定整个可部署程序的构建,测试和发布。 进行微服务的先决条件之一是组件的自治性 ,因此可以在不中断系统其余部分的情况下隔离地开发,测试和部署它们。 那么,如果我们仅在此处划分不同的层并独立部署,该怎么办? 那么我们可以实现某些自主权吗?

过去,我们已经花了很多时间争论这种类型的体系结构,这似乎是有道理的。 我们希望能够根据其需求扩展各个组件。 如果我们需要处理更多的Web请求,请扩展Web层。 如果这些服务开始成为瓶颈,则可以扩展业务服务层。 与其余应用程序/服务无关地处理和管理数据库以及数据访问层。 将UI逻辑与中间层和数据访问“分离”是一个很好的指导原则,但不要将其与要求的层混淆。

实际上 ,实际发生的是,所有这些“分层的”架构组件,由于其所有关注点分离等,都非常容易屈服于数据和数据库的异想天开。 我们可以添加所需的所有CPU,所需的所有中间层和UI层,但是无论我们的网络,计算,内存等发展速度如何,此类系统的瓶颈通常是竞争性的领域模型,最终数据库。 这里的“域模型”压力很大……从事微服务的互联网公司可能没有复杂,模棱两可和相互矛盾的域模型,例如FSI或保险或零售商,可能……例如,twitter的域很简单……发布并显示推文……但是,这在如此大规模的情况下变得复杂了……企业开始同时遇到这两个问题。.领域模型及其复杂性与如何进行扩展一样重要(并且通常会阻碍扩展工作)。 因此,现在您只是想“我们将仅使用像MongoDB这样的NoSQL数据库,以便我们可以扩展后端”……现在您遇到了更多问题。

那我们的团队呢? 像这样设计系统的另一部分是,我们可以让专家团队以不同的速度,不同的位置,不同的工具等独立地在这些层上工作。他们只需要彼此共享一个接口,就可以自主工作。 这在某种程度上起到了法律作用:

设计系统……受约束的组织只能产生设计,这些设计是这些组织的通信结构的副本

不幸的是,我觉得事实恰恰相反。 并不是通过这种架构,我们可以为团队和效率的专业化创造机会。 因为我们的组织结构迫使我们降低了系统架构。 就像我们有独立的数据库团队,UI团队,安全性,操作,QA,构建和发布等一样。 这是我们组织数十年来的组织方式。 但是,如果您看看实践微服务的公司的成功之处,则它们的组织结构会有很大不同 。

让我们看看会发生什么。 以Ticket Monster应用程序为例,该业务要求我们更改网站管理的方式。 他们要求我们添加一些额外的字段,以跟踪与音乐会在网站上的添加和删除频率有关,因为他们希望针对时间,地点,地点,天气等。如果企业希望向管理用户显示此预测分析,则可能涉及UI团队。 当然,这将涉及更改应用程序的业务服务层。 这肯定会影响数据库的更改。 我们想在我们的应用程序中添加一些功能,以在所有层次上甚至在所有涉及的团队之间施加连锁反应。 现在,我们必须让项目经理与所有相关团队协调和跟踪会议。 我们需要创建票证,以使UI和数据库团队能够做的所有事情都不会涉及质量保证,安全性,操作等。 所有这些都在我们所有团队之间创建了复杂的同步点,现在我们必须协调各层的所有更改,构建和发布(并将所有内容一起部署!)。 这不是我们想要的自治类型。 我们不能彼此独立地进行更改,实际上,我们已经变得非常脆弱。

对于我们的Ticket Monster应用程序,让我们更喜欢将功能分为具有凝聚力的“垂直”,而不是通过技术或组织层面 。 每个行业都有其自己的“ UI”(或UI组件),“业务服务”和“数据库”,这些特定于网站的管理功能。 (但是,对于第一步,我们将UI保留为一个整体,将其分解成碎片。尽管有其自身的挑战,我们将继续拆分UI)。 Ticket Monster还允许用户查看和预订音乐会的订单。 让我们将其拆分为自己的垂直字段。 它还可能有忠诚度,推荐,搜索,广告,个性化等。我们将这些内容划分为各自的垂直领域,每个垂直领域都拥有自己的数据库,UI和集成点(REST服务,后端等)。 如果我们需要更改网站的“忠诚度”功能,则无需重新部署整个整体商务服务层或任何与“搜索”相关的内容。 我可以将忠诚度的一部分从UI部署到所需的数据库,而不会影响对其他服务的更改。 理想情况下,一个团队也将拥有并运营每项服务。

下一轮

这使我们在代码内具有更好的凝聚力,并在服务之间具有更大的自治权。 一旦您开始了解沿着业务功能垂直领域拆分意味着什么,我们就可以为每个垂直领域探索其有限的上下文 。 或者在有限的上下文中应用CQRS是否有意义。 还是根据其读/写模式(文档?关系图?),以及您是否赞成一致性还是可以容忍数据丢失/数据不一致,应使用哪种类型的数据库。 或交易,补偿,道歉等可能会是什么样子。 不断地..现在,我们可以根据最适合我们的单个服务的决策,而不是层或整体的最低公分母来做出这些决策。 这就是我们将在下一篇文章中继续探讨的内容! 敬请关注!

更新资料

Twitter上的某人(感谢@herrwieger!)向我指出了这一点: 自包含系统 (SCS)阐明了我在此处写过的这个概念。 这一点很准确,完全符合我的意思。 当我们在有限的上下文中探索每个“独立系统”时,更有趣的事情发生了,然后只有在必要时,它才分解为更精细的微服务。 在讨论整体时,边界是重要的考虑因素,这就是我在这里谈到的以及SCS定义的内容。

翻译自: https://www.javacodegeeks.com/2016/06/carving-java-ee-monolith-microservices.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【终结版】C#常用函数和方法集汇总

C#里面的常用的函数和方法非常重要,然而做题的时候会经常忘记这些封装好的方法,所以我总结一下 C#常用函数和方法集。 【1】C#操作字符串的常用使用方法 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是…

hadoop hdfs (java api)

简单介绍使用java控制hdfs文件系统 一、注意namenode端访问权限&#xff0c;修改hdfs-site.xml文件或修改文件目录权限 本次采用修改hdfs-site.xml用于测试&#xff0c;在configuration节点中添加如下内容 <property><name>dfs.permissions.enabled</name>&l…

glassfish_重写到边缘–充分利用它! 在GlassFish上!

glassfish现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来&#xff0c;您一直在努力使用漂亮&#xff0c;简单&#xff0c;可添加书签的URL。 PrettyFaces已有一段时间了&#xff0c;即使我可以说服它在3.3.3版本中被称…

BZOJ 4557 JLOI2016 侦查守卫 树形dp

题目链接&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4557 题意概述&#xff1a; 给出一棵树&#xff0c;每个点付出代价w[i]可以控制距离和它不超过d的点&#xff0c;现在给出一些点&#xff0c;问控制这些点的最小代价是多少。 分析: 观察一下数据范围发现…

Java6上开发WebService

Java6上开发WebService 2010-01-23 16:19:00 标签&#xff1a;Java6 WebService 休闲 职场 版权声明&#xff1a;原创作品&#xff0c;如需转载&#xff0c;请与作者联系。否则将追究法律责任。 近日朋友问起Java开发WebService的问题&#xff0c;于是为其写了一份简单说明&…

在spring中该如何使用DTO,以及DTO和Entity的关系

1. DTO是用于将后台的数据结构&#xff08;javaBean&#xff09;转换为对用户友好的表现方式的数据结构&#xff0c;同时也能防止后台数据直接传送到前台而存在的潜在危险。 2. 可以时候要哪个springbot框架提供的转换器接口&#xff1a; org.springframework.core.convert.con…

带有Kafka和ZeroMQ的分布式类星体演员

因此&#xff0c;您已经有了使用actor的精美设计&#xff0c;选择了JVM和Quasar在该主题上的强大而忠实的观点。 所有明智的决定&#xff0c;但是在集群上进行分配时您有什么选择呢&#xff1f; 星系 Galaxy是一个非常酷的选择&#xff1a;快速的内存中数据网格&#xff0c;针…

JAVA中断线程的方法

JAVA中断线程的方法 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃&#xff0c;使用它们是极端不安全的&#xff01; 现在&#xff0c;如果你要安全有效地终止一个线程&#xff0c;应该采用以下这些方法&a…

最常见的Java异常及其对Java开发人员的评价

我知道我说在完成视频之前我不会张贴帖子&#xff0c;但这一直困扰着我。 至于视频的更新&#xff0c;我有些懒散&#xff0c;有些忙碌&#xff0c;但是我已经准备好记录第一集&#xff0c;这是我第一次有机会&#xff0c;而且我不需要太多的编辑。 无论如何&#xff0c;还是今…

日志系统设计

日志系统设计 2009-12-11 00:46:58| 分类&#xff1a; 技术 | 标签&#xff1a; |字号大中小 订阅 一、重要性日志系统在整个系统架构中的重要性可以称得上基础的基础&#xff0c;但是这一点&#xff0c;都容易被大多数人所忽视。因为日志在很多人看来只是printf。在系…

bzoj 1124 [POI2008]枪战Maf 贪心

[POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 741 Solved: 295[Submit][Status][Discuss]Description 有n个人&#xff0c;每个人手里有一把手枪。一开始所有人都选定一个人瞄准&#xff08;有可能瞄准自己&#xff09;。然后他们按某个顺序开枪&#x…

核心API最佳实践——JDK日志分级

核心API最佳实践——JDK日志分级 时间:2005-10-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小]日志&#xff08;Log&#xff09;是什么&#xff1f;字典对其的解释是"对某种机器工作情况或某项任务进展情况的记载"。对于应用系统来说&#xff0c;日志就应该记录应…

20165234 《Java程序设计》第五周学习总结

第五周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类内部类&#xff1a;在一个类中定义另一个类。 外嵌类&#xff1a;包含内部类的类&#xff0c;称为内部类的外嵌类。 内部类的类体中不能声明类变量和类方法。外嵌类的类体中可以用内部类声明对象&#xff0c;作为…

Java日志操作总结

Java日志操作总结 (2008-04-21 17:39:06)标签&#xff1a; 杂谈 . 使用Jakarta Commons Logging(JCL) 1.1. 概述 Apache的开源日志组件Jakarta CommonsLogging(JCL)提供的是一个日志(Log)接口(Interface)&#xff0c;同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中…

4-2日装饰器,带参数的装饰器

1&#xff0c;函数的有用信息 from functools import wraps#引用模块 def wrapper(f): # f func1wraps(f)def inner(*args,**kwargs): #聚合#args &#xff08;1,2,3&#xff09;执行函数之前的相关操作ret f(*args,**kwargs) # 打散 1,2,3执行函数之后的相关操作return re…

Apache Storm:如何使用Flux配置KafkaBolt

微型框架中的助焊剂可以帮助我们定义和部署Storm拓扑。 Flux有各种包装器&#xff0c;可帮助您定义所需的流并初始化Bolts和Spouts&#xff08;使用带有或不带有参数的构造函数&#xff0c;并通过反射自动调用自定义配置方法&#xff09;。 您只需要使用Flux就是将其作为依赖…

java 获取当前函数名

import java.text.SimpleDateFormat; import java.util.Date; /** * Java实现类似C/C中的__FILE__、__FUNC__、__LINE__等,主要用于日志等功能中。 * * version 1.0 2011-07-13 * */ public abstract class CommonFunction { /** * 打印日志时获取当前的程序文件名、行号、方法…

美国华尔街拥抱区块链是最大的威胁

Overstock的首席执行官帕特里克伯恩宣布证券交易委员会已批准其计划在区块链上发行股票&#xff0c;该区块链是推动比特币数字货币的巨大在线分类账。 这是一个重要的时刻。至少在理论上&#xff0c;区块链可以更有效&#xff0c;准确和公开地跟踪股票&#xff0c;债券和其他金…

java枚举和枚举类_Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

java枚举和枚举类当Java 8即将面世时&#xff0c;您确定您对Java 5中引入的枚举很熟悉吗&#xff1f; Java枚举仍然被低估了&#xff0c;很可惜&#xff0c;因为它们比您想象的要有用&#xff0c;它们不仅仅用于通常的枚举常量&#xff01; Java枚举是多态的 Java枚举是可以包…

Java关键字final、static使用总结

Java关键字final、static使用总结 一、final 根据程序上下文环境&#xff0c;Java关键字final有“这是无法改变的”或者“终态的”含义&#xff0c;它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变&#xff1a;设计或效率。 final类不能被继承…