将Java EE单体应用打造成微服务

本文讲的是将Java EE单体应用打造成微服务【编者的话】如何将单体应用拆分成微服务相信是很多人共同的疑问,本文作者就技术和组织结构等方面为我们提供了一个思路,一起来看看吧~

紧接着上篇为什么微服务应该是事件驱动的介绍博客,我还想再花一些文章和篇幅就这块为我即将参加的一些演讲做些准备(与你相约jBCNconf在旧金山的Red Hat峰会)。你可以通过在twitter上关注我@christianposta来跟进这个项目的最新进展。在本文里,我们将讨论第一部分,即如何拆分一个单体应用。

这些文章里我所深入探索的单体应用,教程案例取自Ticket Monster,它已经在很长一段时间内被当成是讲解如何使用Java EE和Red Hat技术来构建一个出色应用的经典例子。我们选用Ticket Monster是因为它是一个精心编写的应用,它在“作为教程不够详尽”和“作为例子来讲太过复杂”这两条线之间权衡的很好。它很适用于教学用途,而且我们可以具体以它为蓝本,就真实的样例代码来探讨某些方法的利弊。在进一步讨论之前,请先仔细看一下相关域和当前架构

观看上述的现有架构,我们可以看到各项事物事先都已经被很好的拆分开来。我们有UI组件,业务服务,以及从其他各块很好地分离和解耦并且被打包成一个单独可部署文件(在这里是一个WAR文件)的长期持久化存储。如果我们仔细看下源代码的话,我们会看到它也拥有类似的结构。倘若我们想要部署这个应用的话,任何组件有任何变动都意味着整个部署包的一次重新构建,测试和发布。推进微服务的其中一个先决条件便是组件的自治,这样一来他们便能够相对独立地进行开发,测试和部署,而无需中断系统的其他部分。因此,要是我们在这里就只是打造出不同层,然后将它们独立地部署下去会怎样?那样我们能否实现一些自治能力呢?

过去我们花了大量的时间论证这一类型的架构,而这些工作似乎是有意义的。我们希望能够按照各个组件自己的需求来进行扩展。如果我们需要处理更多的web请求那就向外扩展web层就好了。如果那些服务开始陷入瓶颈,那就扩展业务服务层。与数据库以及数据访问层打交道和管理维护对于整个应用/服务的其他部分而言是相对独立的。从中间层和数据访问中“解耦”出来UI逻辑是一个不错的指导原则,但是不要把它和必需的分层搞混淆了。

实践中的真实情况是所有这些“分层”的架构化组件,针对所有对它的单独关注来看很容易殒命于数据和数据库引发的怪问题。我们可以尽情地添加所需的CPU,中间件和UI,但是无论我们的网络、计算、内存等等变得如何快速,对于这类系统的瓶颈往往都在于域模型和最终的数据库的相互竞争。这里面的压力便是“域模型”———互联网公司所践行的微服务可能不会拥有像FSI或者保险、零售商那样复杂、模糊而又矛盾的域模型。比如,推特有一个简单的域:发布和展示推文。但是这一案例也会在大规模场景下变得复杂———一些企业正开始同时遭遇这两方面问题的困扰———域模型及其复杂性与如何扩展它同等重要(并且常常会
在努力扩展时有所妨碍)。所以如今你单纯想着“我们只要用一个像MongoDB这样的NoSQL数据库就能实现后端的扩展性”的话———你现在恐怕会遇到更多问题。

那说说我们的团队?像这样架构一个系统的另外一部分是因为这样我们就能在这些分层上分配各个专业的团队以不同的效率,在不同地方,用不同的工具等相对独立地进行工作。他们只需要和其他人共享一个接口,然后便能自主进行他们的工作。这里用到一点康威定律:

设计系统的组织,其产生的设计和架构等价于组织间的沟通结构。

不幸的是,我感觉它与事实恰好相反。这并不是说通过搭建这个架构,我们就可以创造这个机会来给团队专业化分工和提高效率。因为我们这样的组织结构反而会倒逼我们沿着这个系统架构演进。就像我们有很多独立的数据库团队,UI团队,安全,运维,QA,构建,以及发布等等。这正是我们过去十年来的组织结构。然而,如果你看下一些企业践行微服务的成功案例的话,你会发现他们所组织的结构有些不太不一样

让我们一起来看看到底发生了什么。以Ticket Monster为例,业务要求我们改变所处理网站的管理方式。他们要求我们添加一些相关的额外字段来追踪音乐会在网站上添加和删除的频繁程度,因为他们想据此添加一些预测分析,基于时间,位置,天气等决定在未来添加该活动是否是一个好主意。如果业务想要给管理用户展示这个预测分析的话,这可能还会涉及到UI团队。这也必将涉及改变应用的业务逻辑层,并且它肯定会导致数据库的变动。我们想给我们的应用添加一些功能特性,而这引发了所有分层的波动效应,而更为重要的是,涉及到了整个团队。如今我们不得不需要项目经理为所有相关团队协调和跟进会议。我们需要在创建票单的时候保证UI和团队做什么事情不会让QA,安全,运维等全部介入。所有这一切造就了我们各个团队之间的复杂同步处境,而如今我们不得不协调我们分层的全部变动,构建和发布(并且一切都同时部署!)。这不是我们想要的那种自治。我们无法相互独立地做出变动,事实上,我们已经变得相当脆弱。

针对我们的Ticket Monster应用,让我们改为将功能切分成可拼接的各个“垂直频道”而不是以技术或者组织层面。每一个垂直频道有它自己的“UI”(或者UI组件),“业务服务”和“数据库”,它们用于管理网站的特定功能。(然而,在第一步里,我们将把UI留作一个单体,然后将它背后的模块切分开来。我们会回过头来切分UI,尽管这有其自己的挑战。)Ticket Monster还允许用户查看和预订音乐会票。让我们将这块功能切分到它自己的垂直频道里。它可能也有忠诚度,推荐,搜索,广告,个性化等等。我们将这些都切分到它们自己的垂直频道里,每个都拥有它们自己的数据库,UI,和集成点(REST服务,后端,等等)。如果我们需要对网站忠诚度这块功能做出变动的话,我不需要去重新部署整个单体的业务服务层或是任何相关的服务,比如搜索。我可以从UI到DB部署忠诚度这块的功能而无需再被迫触发其他服务的变动。在理想情况下,一个团队拥有和运维的每个服务都将如此。

这给我们各服务之间的代码注入了更强的凝聚力,以及更多的自主权。而一旦你开始努力去理解切分业务功能到各个垂直频道的意义时,我们便可以探索一下针对每个垂直频道而言,什么才看起来像是它的上下文边界;比如它在一个上下文边界里是否适用CQRS。又或者基于它的读/写模型(文档?关系型?图)应该适用哪种类型的数据库以及你是否偏向于一致性或者能够容忍数据的丢失/数据的不一致。再者可能看上去像的什么事务啊,补偿啊,认错啊,等等,以及诸如此类的...现在我们可以就单个服务怎样才是最好的这一问题作出这些决策,它不是单个分层或者一个单体的共同分母最小化。这也是我们在下一篇文章里将继续探索的内容!敬请关注!

原文链接:Carving the Java EE Monolith Into Microservices(翻译:吴佳兴)

原文发布时间为:2016-07-31

本文作者:吴佳兴

原文标题:将Java EE单体应用打造成微服务

时间: 2024-07-31 08:18:36

将Java EE单体应用打造成微服务的相关文章

Java EE 6全新的功能和服务:上下文和依赖关系注入

在 Java 中,类可以拥有非原始类型的变量(字段).在复杂的应用程序中,这些字段的类型可以代表复杂的技术解决方案.例如,Record 类可以拥有类型为 javax.sql.DataSource 的字段,表示 Record 的一个实例将依赖关系型数据源才能正常工作.在 Java EE 中,您将通过 JNDI 查找一个实例,从而获取该数据源的一个实例.清单 1 中显示了一个示例. 清单 1. 使用 JNDI 获取对依赖关系的引用 Initialhttp://www.aliyun.com/zixun

Java微服务:这个画饼是个谎言,但你却不能忽视它

本文讲的是Java微服务:这个画饼是个谎言,但你却不能忽视它[编者的话]本文深入介绍了Java的微服务开发,包括其定义和一些可选方案,如Spring Boot.Dropwizard及其他开源项目. 微服务的趋势已经让人无法忽视.有些人可能会说它只不过是又一个故弄玄虚的流行词,而另一些人可能会列举出分解单体应用的优势,或者反其道而行,专注于其不足之处. 在本文中,我们将专注于Java生态系统,从务实角度看待我们所掌握的实际用于实现微服务的框架,来看看它们到底是什么.让我们开始吧. 这个画饼是个谎言

2016年会成为Java EE微服务年吗?

进入2016年时间还不是很长,让我们回顾下去年年底的一个预言.去年12月,来自C2B2的Steve Millidge预测,2016年将会成为Java EE微服务年.在一定程度上,这是基于Steve在JavaOne上的演讲,他在演讲中详细地讨论了这个主题.此外,Steve还是Payara的联合创始人,Payara的目标用户也是对微服务感兴趣的Java EE开发人员.Steve还认为,SOA和微服务之间的差别很小,这种观点我们以前听说并且报道过.他在视频中指出: "微服务与SOA没什么不同.它还是关

由 Eclipse 基金会接手的 Java EE 正在发生改变

Java EE 的新东家开始对 Java EE 的开发工作和支持进行更改. 自 Java EE 移交给 Eclipse 基金会以来,它的开发工作和管理方式正在开始改变. 一方面,Oracle 正在制作 Java EE 技术兼容性工具包(TCK - Technology Compatibility Kits),该工具是开源的,可以确定一个实现是否符合与 Java 兼容.Eclipse 执行总监 Milinkovich 称这是"对这个生态系统的驱动力的一个非常根本的变化". Milinko

使用Java构建微服务

本文讲的是使用Java构建微服务,[编者的话]本文翻译自Dzone Guide to the Java Ecosystem,Dzone是一个关于Java的优秀网站.文中介绍了几种用Java构建微服务的方法,包括Container-less.Self-contained以及In-container.翻译经验不足,如有错误,请慷慨指出. @Container容器技术大会将于2016年1月24日在北京举行,来自爱奇艺.微博.腾讯.去哪儿网.美团云.京东.蘑菇街.惠普.暴走漫画等知名公司的技术负责人将分

使用 Java 构建微服务

快速浏览 在Java生态中,构建微服务的策略包括Container-less,Self-contained,以及In-container等. Container-less微服务将应用及其依赖打包成一个单一的jar文件. Self-contained微服务也是打包成一个单一的Jar文件,但它还包括一个嵌入式框架,这个框架含有可选的第三方lib,当然这些lib是兼容的. In-container微服务打包成一个完整的Java EE容器,该服务在Docker镜像中实现. 基于微服务的架构给架构师和开发

甲骨文宣布因 '主要增强功能'延迟发布Java EE 8

甲骨文(Oracle)公开承认不得不再一次延迟Java  8企业版的发布.新版Java企业版(Java EE)将于2017 年底上架,比原定计划推迟了至少六个月.甲骨文上一次调整发布日期是今年6月,其时的计划发布日期是明年"上半年". 甲骨文Java EE 和应用程序服务器开发副总裁Anil Gaur在美国加州旧金山的召开的甲骨文JavaOne大会上公布了新日期. Gaur承诺Java EE 9 将于Java  EE 8发布后的一年后发布,即是说 2018年年底. Gaur 表示,Ja

Java微服务开发指南 -- 集群管理、失败转移和负载均衡的实践

集群管理.失败转移和负载均衡的实践     在前一章节中,我们快速的介绍了集群管理.Linux容器,接下来让我们使用这些技术来解决微服务的伸缩性问题.作为参考,我们使用的微服务工程来自于第二.第三和第四章节(Spring Boot.Dropwizard和WildFly Swarm)中的内容,接下来的步骤都适合上述三款框架. 开始     我们需要将微服务打包成为Docker镜像,最终将其部署到Kubernetes,首先进入到项目工程hola-springboot,然后启动jboss-forge,

业务逻辑的演进——从单体应用到微服务再到函数

本文讲的是业务逻辑的演进--从单体应用到微服务再到函数[译者的话]这篇文章介绍了业务逻辑从单体应用到微服务模式,再到事件驱动函数模型的进化过程.从原理上剖析了每一次进化的动机,为我们揭示了变化背后的深层次原因,非常具有启发性. [上海站|3天烧脑式Spring Cloud训练营]培训内容包括:DevOps.微服务.Spring Cloud.Eureka.Ribbon.Feign.Hystrix.Zuul.Spring Cloud Config.Spring Cloud Sleuth等. 基础技术