monolith_将Java EE Monolith雕刻成微服务

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

对于我们的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

monolith

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

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

相关文章

spring内容协商管理_Spring框架中的内容协商

spring内容协商管理1.简介 使用BeanNameViewResolver完成的工作就是,我们刚刚在Spring上下文中创建了多个bean视图以生成预期的输出。 Spring很快引入了内容协商策略 ,该策略可以使用传统的RESTful ResponseBody方法和HTTP消息转换器,以JSON或…

二叉树专题

二叉树 (一)二叉树的三种遍历方式: 前序遍历 : 1 2 4 5 3 6 7 ; 中序遍历 : 4 2 5 1 6 3 7 ; 后序遍历 : 4 5 2 6 7 3 1 ; 本质是在递归序的基础上…

echart中拆线点的偏移_Real BIM | Rhino+Grasshopper在双曲异形玻璃幕墙中的应用

转载请联系并注明来源你好,我以自己所做的项目为例,介绍一下我的认知里,BIM技术对于真实项目的作用。案例是一个异形、双曲面的玻璃屋盖幕墙系统。如效果图所示,玻璃屋盖呈波浪状,塔楼装饰条与屋盖装饰条需要无缝连接。…

【安卓开发】Android初级开发(okhttp3发送带header与带参数的GET请求)

1.首先需要先加入相应依赖 dependencies{implementation com.squareup.okhttp3:okhttp:3.13.1 implementation com.squareup.okio:okio:2.2.2} 2.加入互联网权限 <!-- 互联网 --><uses-permission android:name"android.permission.INTERNET" /> <!…

sql 返回日期的年月部分_公示|2020年11月部分志愿活动名单公示

2020年11月部分志愿活动名单公示2020年11月18日人文与法学学院院楼协助分发教职工运动会服装志愿活动2020年11月19日人文与法学学院院楼“收彩旗”志愿活动2020年11月20日人文与法学学院组织观看2020年全国科学道德和学风建设宣讲教育报告会直播志愿活动(此活动不录入i志愿)202…

【安卓开发 】Android初级开发(三)动画

逐帧动画 方法一&#xff0c;在xml中设置 1.先将图片加入drawable 2.在drawable中新建xml,设置每一帧的图片和时间 <?xml version"1.0" encoding"utf-8"?> <animation-list xmlns:android"http://schemas.android.com/apk/res/android&…

javafx swing_Swing应用程序中的JavaFX 8 DatePicker

javafx swing1.概述 本文显示了一个使用JavaFX 8 DatePicker控件的Java SE 8 Swing应用程序的示例。 DatePicker控件允许用户以文本形式输入日期或从日历弹出窗口中选择日期。 本示例使用其中带有FX控件的Swing JFrame 。 为了将FX内容嵌入Swing应用程序中&#xff0c; javafx…

cup过高是什么意思_做青和焙火有什么关系?

武夷岩茶制作工艺复杂&#xff0c;环环相扣&#xff0c;每一步工艺对下一步工艺都有很大的影响&#xff0c;经过一系列的生化变化&#xff0c;最终呈现一杯好茶在我们面前&#xff0c;那我们最关心的做青和焙火两个问题&#xff0c;有什么影响呢&#xff1f;它们之间既有因果关…

【安卓开发 】Android初级开发(四)ListView

ListView的实现步骤 1.单独一行的布局可以如下 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"horizontal"android:layout_width&…

不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_【网络安全宣传周】网络安全小黑板 | 如何正确设置浏览器...

李夏是一个公司的职员&#xff0c;一天晚上加班赶制文档&#xff0c;由于要向客户汇报产品情况&#xff0c;需要获取大量网上信息&#xff0c;然而在制作中却发现浏览器的网页打不开了。第二天原计划向客户展示的材料未能完整汇总&#xff0c;客户见面对接效果也打了折扣。在当…

vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...

今天主要讲的是虚函数的override与overload的区别。首先我们来看一段代码&#xff1a;示例代码#include <stdio.h>#include <string>#include <iostream>#include <complex>using namespace std;class Father{public: Father(); ~Father(); virtual vo…

tampermonkey怎么不能用了_普洱茶发霉了怎么办?能不能用太阳晒

大家都知道普洱茶要储藏在通风干燥的地方&#xff0c;如果储存不恰当就可能变质发霉。而且普洱茶很容易吸味&#xff0c;需要存放到干净的环境并避免日晒。当发现茶叶发霉的现象比较严重时&#xff0c;需要直接扔掉。如果不严重&#xff0c;可以采用以下方法&#xff1a;千万不…

vue 动态变量名_【告别复制粘贴】动态模板生成小技巧

? 这是第 75篇不掺水的原创&#xff0c;想要了解更多&#xff0c;请戳上方蓝色字体&#xff1a;政采云前端团队关注我们吧&#xff5e;本文首发于政采云前端团队博客&#xff1a;告别复制粘贴&#xff1a;动态模板生成小技巧https://www.zoo.team/article/dynamic-template-ge…

jboss项目导入idea_如何导入任何JBoss BRMS示例项目

jboss项目导入idea在过去几周内&#xff0c;JBoss BRMS演示的用户反复询问我以下内容时&#xff0c;会给您这些提示和技巧&#xff1a; “如何将与各种JBoss BRMS演示项目相关的项目导入到我自己的现有安装中&#xff1f;” 这意味着用户希望在个人安装产品时有一个示例项目&…

amos看拟合度在哪里看_哪里可以看亲爱的热爱的电视剧全集

由杨紫、李现、胡一天、张格出演的暖心甜宠剧《亲爱的&#xff0c;热爱的》正在热播中。该剧根据墨宝非宝小说《蜜汁炖鱿鱼》改编&#xff0c;讲述了一场高智商与高情商的甜萌梦幻爱情故事。剧中李现饰演的高冷G神和杨紫饰演的萌妹学霸&#xff0c;从开头的一见钟情到后面的相处…

jaxb xml配置_JAXB和Log4j XML配置文件

jaxb xml配置Log4j 1.x和Log4j 2.x均支持使用XML文件来指定日志记录配置 。 这篇文章探讨了与使用JAXB通过Java类处理这些XML配置文件相关的一些细微差别。 本文中的示例基于Apache Log4j 1.2.17 &#xff0c; Apache Log4j 2.6.2和Java 1.8.0_73&#xff08;带有JAXB xjc 2.2.…

multiprocessing.queue取数据要加锁么_干货 | 小程序多页面接口数据缓存

小程序里面多个页面&#xff0c;有时候会需要用到同一个接口的数据。而这些数据全局来说只需要拉取一遍&#xff0c;如果要存到缓存&#xff0c;要怎么保证其他页面取缓存的时候&#xff0c;数据已经拉取回来了呢&#xff1f;答案是多页面接口数据缓存实现。思路设计其实这种场…

apache.camel_Apache Camel 2.18 –即将推出的功能的亮点

apache.camel骆驼骑士正在忙于即将发布的Apache Camel 2.18版本。 当我们动态更新发行说明时 &#xff0c;这是一种快速查看即将发生的情况的方法。 我只是想在夏天在这里进行快速更新&#xff0c;到目前为止&#xff0c;我们已经完成了简短的重点介绍。 随着发行版的临近和文档…

【安卓开发 】Android初级开发(八)WebView网页

1.网页的基本组成 2.WebView的常用方法 WebView webView findViewById(R.id.webvv);//加载线上网页webView.loadUrl("https://www.baidu.com");//加载SD卡上的html文件,Environment.getDownloadCacheDirectory().getPath()为获取SD卡根目录路径webView.loadUrl(&quo…

python整数加法计算器_Python应用实例赏析2.1简单计算

在日常应用中&#xff0c;我们会经常使用计算器进行计算&#xff0c;有些时候普通计算器的功能不能满足需要&#xff0c;例如使用计算机系统自带的计算器&#xff0c;计算不能超过32位数&#xff0c;手机自带计算器不能超过15位等(我的电脑和手机)&#xff0c;也可能计算需要的…