java ee的小程序

您是否曾经想过将现有的Java EE单体应用程序重构为基于微服务的应用程序需要做什么?

该博客说明了一个简单的购物车示例如何转换为基于微服务的应用程序,以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于: github.com/arun-gupta/microservices 。

继续阅读以获取更多荣耀!

Java EE Monolith

Java EE整体应用程序通常定义为WAR或EAR档案。 该应用程序的全部功能都打包在一个单元中。 例如,在线购物车可能包含用户,目录和订单功能。 所有网页都在应用程序的根目录中,所有相应的Java类都在WEB-INF/classes目录中,资源在WEB-INF/classes/META-INF目录中。

让我们假设您的整体设计不是设计成一个分散的大泥巴 ,而应用程序是按照良好的软件体系结构构建的。 一些常见的规则是:

  • 分离关注点,可能使用Model-View-Controller
  • 使用定义明确的API的高内聚和低耦合
  • 不要重复自己(干)
  • 接口/ API和实现是分开的,并且遵循Demeter定律 。 类不会直接调用其他类,因为它们恰好位于同一存档中
  • 使用域驱动设计将与域/组件相关的对象保持在一起
  • YAGNI或您不需要它:不要构建您现在不需要的东西

这是一个简单的购物车整体WAR存档的样子:

此整体应用程序具有:

  • 网页,例如.xhtml文件,用于用户,目录和订单组件,打包在归档的根目录中。 这些网页还打包了在不同网页之间共享的所有CSS和JavaScript资源。
  • 这三个组件的类在WEB-INF/classes目录中的单独软件包中。 多个类使用的所有实用程序/公共类也都打包在这里。
  • 每个组件的配置文件打包在WEB-INF/classes/META-INF目录中。 该应用程序的任何配置文件(例如分别连接和填充数据存储的persistence.xmlload.sql也都打包在此处。

它具有众所周知的体系结构,IDE友好,易于共享,简化测试,易于部署等常见优点 。 但同时也具有诸如敏捷性受限,持续交付的障碍,技术堆栈“卡住”,技术债务增加等缺点 。

即使微服务如今已成为热门,但整体还是不错的。 即使那些对您不起作用的企业,也可能不会从迁移到微服务中获得很多或立即的收益。 其他方法(如更好的软件工程和体系结构)可能会有所帮助。 微服务既不是免费的午餐也不是灵丹妙药,它需要大量的投资才能成功,例如服务发现,服务复制,服务监视,容器,PaaS,弹性等等。

除非您的系统过于复杂而无法作为一个整体进行管理,否则甚至不要考虑使用微服务。

微服务高级版

Java EE的微服务架构

好了,我已经听说了所有这些内容,但是想知道之前/之后的内容,即整体代码库的外观以及重构后的微服务代码库的外观。

首先,让我们看一下整体架构:

此体系结构中的关键部分是:

  • 在将用户,订单和目录组件打包为单独的WAR文件的情况下,应在功能上分解应用程序。 每个WAR文件应具有该组件所需的相关网页( #15 ),类和配置文件。

    • Java EE用于实现每个组件,但是对堆栈没有长期承诺,因为不同的组件使用定义良好的API( #14 )相互通信。
  • 每个档案都有自己的数据库,即不共享数据存储。 这允许每个微服务发展和选择最合适的数据存储类型-关系,NoSQL,平面文件,内存中或其他。
  • 每个组件都将向服务注册中心注册。 这是必需的,因为每个服务的多个无状态实例可能在给定的时间运行,并且它们的确切端点位置仅在运行时才知道( #17 )。 Netflix Eureka , Etcd , Zookeeper是该领域的一些选项( 更多详细信息 )。
  • 如果组件需要相互通信(这很常见),则可以使用预定义的API进行通信。 实现同步的REST或实现异步通信的Pub / Sub是实现此目的的常用方法。在我们的案例中,Order组件发现用户和目录服务,并使用REST API与它们进行对话。
  • 该应用程序的客户端交互是在另一个应用程序(在本例中为Shopping Cart UI)中定义的。 该应用程序主要从服务注册表中发现服务并将它们组合在一起。 它应该主要是一个哑代理,在其中调用不同组件的UI页面以显示界面( #18 )。可以通过提供标准CSS / JavaScript资源来实现常见的外观。

该应用程序相当琐碎,但至少强调了一些基本的体系结构差异。

整体与微服务

下面比较了基于单体和基于微服务的应用程序的一些统计信息:

特性 整体式 微服务
档案数量 1个 5

  • 合同(JAR,〜4 KB)
  • 顺序(WAR,〜7 KB)
  • 用户(WAR,〜6 KB)
  • 目录(WAR,〜8 KB)
  • Web UI(WAR,27 KB)
网页 8 8(见下文)
配置文件 4

  • web.xml
  • template.xhtml
  • persistence.xml
  • load.sql
每个档案3个

  • persistence.xml
  • load.sql
  • web.xml
类文件 12 26

  • 每个档案的服务注册
  • 服务发现类
  • 每个档案的应用程式类别
档案总大小 24 KB 〜52 KB(总计)
  • 整体应用程序的代码库位于: github.com/arun-gupta/microservices/tree/master/monolith/everest
  • 支持微服务的应用程序的代码库位于: github.com/arun-gupta/microservices/tree/master/microservice

问题和待办事项

以下是将整体重构为基于微服务的应用程序时遇到的问题和TODO:

  • Java EE已经可以使用EAR封装对应用程序进行功能分解。 应用程序的每个组件都可以打包为WAR文件,并捆绑在EAR文件中。 他们甚至可以通过这种方式共享资源。 现在这不是真正的微服务方式,但这可能是使您入门的过渡步骤。 但是,请注意, @FlowScoped bean没有在EAR中正确激活( WFLY-4565 )。
  • 使用JSF资源库模板提取所有模板文件。
    • 目前,所有网页都在everest模块中,但它们应该位于每个组件中( #15 )。
  • 将整体数据库拆分为多个数据库需要为每个应用程序使用单独的persistence.xml和DDL / DML脚本。 同样,需要相应地创建迁移脚本,例如使用Flyway。
  • 必须为所有组件创建一个REST接口,该接口需要被另一个组件访问。
  • UI仍在单个Web应用程序中。 而是应将其包含在已分解的WAR( #15 )中,然后再次在哑代理中进行组合。 闻起来像portlet吗?
  • 在PaaS中部署多个WAR文件( #12 )
  • 每个微服务都应易于部署在容器中( #6 )

这是单片应用程序的类的完整列表:

./target/classes/org/javaee7/wildfly/samples/everest/cart/Cart.class
./target/classes/org/javaee7/wildfly/samples/everest/cart/CartItem.class
./target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItem.class
./target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItemBean.class
./target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItemType.class
./target/classes/org/javaee7/wildfly/samples/everest/checkout/Order.class
./target/classes/org/javaee7/wildfly/samples/everest/checkout/OrderBean.class
./target/classes/org/javaee7/wildfly/samples/everest/checkout/OrderItem.class
./target/classes/org/javaee7/wildfly/samples/everest/checkout/Shipping.class
./target/classes/org/javaee7/wildfly/samples/everest/uzer/Uzer.class
./target/classes/org/javaee7/wildfly/samples/everest/uzer/UzerBean.class
./target/classes/org/javaee7/wildfly/samples/everest/uzer/UzerItem.class

这是基于微服务的应用程序的类的完整列表:

./catalog/target/classes/org/javaee7/wildfly/samples/everest/catalog/ApplicationConfig.class
./catalog/target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItem.class
./catalog/target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItemREST.class
./catalog/target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItemType.class
./catalog/target/classes/org/javaee7/wildfly/samples/everest/catalog/ServiceRegistration.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/cart/Cart.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/cart/CartItem.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogBean.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/catalog/CatalogItem.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/checkout/Order.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/checkout/OrderBean.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/checkout/OrderItem.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/checkout/Shipping.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/ServiceDiscovery.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/ServiceDiscoveryStatic.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/ServiceDiscoveryURI.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/ServiceDiscoveryZooKeeper.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/uzer/UzerBean.class
./everest/target/classes/org/javaee7/wildfly/samples/everest/uzer/UzerItem.class
./order/target/classes/org/javaee7/wildfly/samples/everest/order/ApplicationConfig.class
./order/target/classes/org/javaee7/wildfly/samples/everest/order/Order.class
./order/target/classes/org/javaee7/wildfly/samples/everest/order/OrderItem.class
./order/target/classes/org/javaee7/wildfly/samples/everest/order/OrderREST.class
./user/target/classes/org/javaee7/wildfly/samples/everest/uzer/ApplicationConfig.class
./user/target/classes/org/javaee7/wildfly/samples/everest/uzer/UserREST.class
./user/target/classes/org/javaee7/wildfly/samples/everest/uzer/Uzer.class
  • 同样,完整的代码库位于github.com/arun-gupta/microservices 。

未来话题

本系列中的一些未来主题将是:

  • 微服务是否需要容器?
  • 如何使用容器部署多个微服务?
  • 如何轻松监控所有这些服务?
  • A / B测试
  • 使用微服务和容器进行连续部署

您还想看些什么?

请享用!

翻译自: https://www.javacodegeeks.com/2015/06/monolithic-to-microservices-refactoring-for-java-ee-applications.html

java ee的小程序

java ee的小程序_Java EE应用程序的单片到微服务重构相关推荐

  1. Java EE应用程序的单片到微服务重构

    您是否曾经想过将现有的Java EE整体应用程序重构为基于微服务的应用程序需要做什么? 该博客解释了一个简单的购物车示例如何转换为基于微服务的应用程序,以及围绕它的一些担忧. 整体和基于微服务的应用程 ...

  2. java ee的小程序_Java EE调度程序

    java ee的小程序 Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库. Java EE 6和7完整配置文件上提供的Jav ...

  3. java ee的小程序_Java EE 8 –为更多设备提供更多应用程序

    java ee的小程序 如果我不喜欢夏天的一件事,那就是事实是没有太多要分享或谈论的新闻. 谁决定将Java Day Tokyo置于今年的这个无聊的时间里,做得很好,并给了我一个写关于新的和即将到来的 ...

  4. java web初级面试题_Java Web应用程序初学者教程

    java web初级面试题 Java Web Application is used to create dynamic websites. Java provides support for web ...

  5. java微服务,微在哪_Java:ChronicleMap第3部分,快速微服务

    java微服务,微在哪 标准Java Maps需要在启动时进行初始化. 了解如何利用可从文件初始化的ChronicleMaps并显着减少微服务启动时间,以及如何在JVM之间共享Maps. 内置的Map ...

  6. 程序人家:你的老板逼你上微服务了吗??

    可均可可 读完需要 10 分钟 速读仅需 3 分钟 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能.高吞吐率.高稳定性.高扩展等特性提出了更高的要求. 可以说业务需求是软件架构能 ...

  7. Java分布式二手房项目尚好房第三课 利用Dubbo拆分微服务

    Java分布式二手房项目尚好房:Apache Dubbo介绍 一.分布式RPC框架Apache Dubbo 1.软件架构的演进过程 软件架构的发展经历了由单体架构.垂直架构.SOA架构到微服务架构的演 ...

  8. 分布式 java 应用:基础与实践_单集群数据超1000亿,微服务架构下分布式数据库应用实践...

    如今,大型企业的应用平台正在向微服务架构进行转型.在微服务架构下,应用程序和数据库等底层平台的关系将会被重构. 作为新一代分布式数据库,其架构与功能特性需要保证在与传统数据库全兼容的基础上,拥抱微服务 ...

  9. Java框架jboot_Jboot v3.0.3 正式版发布,基于 JFinal 的微服务框架

    Jboot是一个基于JFinal.JFinal-Undertow.Dubbo等开发的微服务框架,帮助开发者降低微服务开发门槛.同时完美支持在idea.eclipse下多maven模块,对java代码. ...

最新文章

  1. 图解GPT-2(完整版)!
  2. 算法学习:后缀自动机
  3. 安装Matlab出现Error 1935错误解决方法
  4. (三)数据结构之“栈”
  5. Rational Rose 2003 下载、破解及安装方法(图文)
  6. Win32中如何判断多个键同时按下
  7. linux管理防火墙开放端口
  8. Android Studio导入项目遇到的问题
  9. python ftp编程_【编程】Python FTP
  10. Thread 编程:简明(1) - 协作式取消 VS 线程终止
  11. 记账系统推荐金蝶精斗云_小编总结了金蝶精斗云财务软件的优劣势
  12. 自动发片q机器人_寻片机器人(微信群自动回复工具)V2.6.853 正式版
  13. C语言初学者如何制作一个完整的C语言程序——歌曲排行榜
  14. html+圆角梯形,用CSS圆角梯形
  15. 开机显示Reboot and select proper boot device or insert boot media in selected
  16. WSL / WSL2 问题大全 及 解决方案
  17. Android学习笔记(Android Studio)3-3(ProgressBar ProgressDialog)(加载进度条、转圈圈)UI组件之弹出组件
  18. 商米科技IPO被终止:曾拟募资10亿 蚂蚁集团与小米是股东
  19. 微信小程序界面设计小程序中的WXSS(css)选择器课程-::before伪元素
  20. delmia机器人模型调入

热门文章

  1. P5934-[清华集训2012]最小生成树【最小割】
  2. jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】
  3. 欢乐纪中A组周六赛【2019.6.1】
  4. ssl1072-砝码称重【dp练习】
  5. 【结论题(QAQ)】SSL新年欢乐赛暨BPM退役赛 A 送分题(luogu U102372)
  6. JavaFX UI控件教程(二十二)之Titled Pane和Accordion
  7. Java 8新特性——default方法(defender方法)介绍
  8. Java 线程同步总结
  9. (八)Spring与MyBatis整合
  10. java实现遍历树形菜单方法——OpenSessionView实现