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

紧接着上篇 为什么微服务应该是事件驱动的介绍博客 ,我还想再花一些文章和篇幅就这块为我即将参加的一些演讲做些准备(与你相约 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 (翻译:吴佳兴)


欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群

将Java EE单体应用打造成微服务相关推荐

  1. Java架构师-微服务:微服务架构【单体部署 --改造--> 微服务架构】【分布式:分散压力;微服务:分散能力】【RESTFul+Docker+K8S、SpringCloud】

    一.微服务概述 微服务架构是团队面对互联网产品爆发式增长的最优选择,要解决的是快速迭代.高可靠和高可用等问题,把复杂度很高的产品拆分成一些较小的模块,并遵循康威定律,每一个模块用5-9个小团队来维护, ...

  2. 从 Java 9 开始,Java 就华丽的转身为微服务了…

    继 2014 年 3 月 Java 8 发布之后,时隔 4 年,2018 年 9 月,Java 11 如期发布,其间间隔了 Java 9 和 Java 10 两个非LTS(Long Term Supp ...

  3. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

  4. 联发科heli p90_“如果您是Java开发人员并且正在编写微服务,那么Helidon是一个不错的选择”

    联发科heli p90 " Helidon仅设计用于微服务" 尽管Oracle最近开放了 Helidon(一组Java库)的开源资源 ,但是该项目本身并不新鲜,正如Helidon项 ...

  5. 单体、SOA、微服务的介绍

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 目录 单体架构 单体架构的拆分 SO ...

  6. 微服务系列(七):将单体应用改造为微服务

    编者的话|本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块 ...

  7. redis 什么是冷数据_阿里Java三面凉凉:微服务,Redis,JVM一个都搞不懂

    前言: 金九银十刚刚过去了,不知道很多小伙伴都拿到自己心仪的offer没有,我这边也收到了一个粉丝投来的消息,说看到阿里的面试真题之后人都是懵的,发现自己一窍不通,下面给大家分享我这个粉丝的经历,以及 ...

  8. “逃离”单体,GitHub的微服务架构实践

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 本文介绍 Git ...

  9. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

    Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一.写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这 ...

  10. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

最新文章

  1. 使用BCH提供的客户端将消息绑定到任何位置
  2. linux memcached 的安装
  3. 广域网优化产品的5大应用场景—Vecloud
  4. 每天学习一点,坚持学习!!
  5. SAP UI5 how the ui library theme parameter is loaded
  6. 一步一步学Ruby(二十一):文件操作2
  7. P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】
  8. codeforces 112A-C语言解题报告
  9. Oracle SGA优化
  10. 初一音乐计算机教学方案,人音版七年级音乐教案
  11. 【Android】自定义控件让TextView的drawableLeft与文本一起居中显示
  12. python中pyserial模块使用方法
  13. 2020年7月19日训练总结
  14. 微信自定义菜单java_java微信开发API第四步 微信自定义个性化菜单实现
  15. python 下载mp4视频 实例
  16. 加拿大银行为加密货币公司开设保险箱
  17. 教师资格证作文素材---------------背背背。。。
  18. Win10+Ubuntu18.04双系统安装配置教程(二)——磁盘分区
  19. 环境变量用来保存java虚拟机_____环境变量用来存储Java的编译和运行工具所在的路径,而____环境变量则用来保存保存Java虚拟机要运行的“.class”文件路径。(填英文)...
  20. foxtable2018商业版 v18.10.9

热门文章

  1. 二叉树遍历非递归写法
  2. 使用react-native做一个简单的应用-01项目介绍
  3. [转]Windows server 2008网络负载均衡集群
  4. 如何正确处理HTTP 404错误页面
  5. Ajax局部刷新例子
  6. 在 MacBook 中如何将外置屏幕设置为主屏幕?
  7. 苹果Mac重复文件清理工具:​​​​Tidy Up
  8. 剪切板记录管理工具:Paste Mac
  9. iCloud “文稿和数据”功能即将关闭,如何将数据迁移到 iCloud 云盘?
  10. 简单好用的Mac设置