微服务与Java EE

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/01/microservices-and-java-ee

时至今日,基于微服务的架构已经随处可见了。我们见识到了Netflix与Amazon等创新者是如何通过微服务来取得业务上的成功。不过,对于那些使用Java EE服务器,编写传统系统的开发者来说应该何去何从呢?我们一直所做的都是错误的么?我们该如何让技术设计能够适应于未来?

单体架构

首先,我们来看一下这些传统系统,或者说是单体应用。虽然单体这个词现在看起来颇有一种坏味道之感,但这确实是我们长久以来构建软件的方式。基本上,它指的是这样一个事实,即我们构建一个个应用来实现某些功能。单体指的就是Java EE或是一开始的Java 2 Enterprise Edition设计的目标。集中式应用可以进行伸缩与集群,但其设计却不一定具有弹性。在大多数时候,其失败场景都要依赖于底层基础设施与运维。

传统上,Java EE应用遵循着一些核心模式,并且会分成3个主要的层次:展现、业务与集成。展现层会被打包到Web Application Archives(WARs)中,业务与集成逻辑则会被划分到单独的Java Archives(JARs)中。他们会被打包作为一个部署单元,即所谓的Enterprise Archive(EAR)。围绕着Java EE的技术与最佳实践足以构建出设计良好的单体应用。不过,大多数企业级项目都不太关注架构。这也说明了为何有时设计良好的意大利面条是项目依赖与内部结构可视化的最佳方式。当这发生时,我们很快就会体会到一些严重的缺陷。由于一切都是耦合并且集成到一起的,因此即便进行一些非常小的变更也需要大量的工作(有时还需要重构),然后才能将修改过的部分放到产品中;同时,我们还需要从始至终非常小心地对应用进行测试。整个应用不仅仅只是一些程序化的构件:它还包含了很多部署描述符以及服务端配置文件,此外还有第三方环境的属性等。开发这些企业项目需要多个团队联手,需要很多人从更高的视角来审查整个项目。业务组件与领域大多数都是由既有的数据库设计或是业务对象定义所驱动的。

变更的高风险与将新配置引入到生产中的复杂性会导致发布频率变得越来越低。新的发布可能一年才有那么几次。甚至团队结构都会受到单体软件架构的严重影响。长久的测试周期就是最直观的证据。

微服务

时代在不断发展,下一代系统架构与设计在几年前出现了。随着集中式集成组件日益增长的复杂性以及应用之间连接的成本越来越高,人们开始寻求更加轻量级、更加富有弹性的解决方案,逐步开始放弃大型、重量级基础设施与设计。与之相伴的是IT部门开始重新审视应用服务器以及冗长的协议和接口技术。

对于那些基于SOA与ESB的项目来说,其服务实现回归到了更加敏捷的构件与服务中来。相对于智能路由与转换来说,微服务使用了简单路由,并且将逻辑封装到了端点本身当中。微服务是围绕单业务目标而展开的。虽然企业系统的设置让人感到非常烦恼,但对于微服务来说,最有效的运行时却并不一定是功能完善的应用服务器。它可能只是个Servlet引擎,JVM已经足以作为一个执行环境了。运行时千变万化,编程语言的选择也是数量庞大的,因此这种开发模式很可能会成为另一种运维梦魇。甚至连开发者都可能会在定义微服务以及如何将这种设计应用到既有应用中迷失方向。微服务的设计目标是要形成小型、无状态、独立且自包含的应用。在理想情况下,可以将其部署到任何地方,因为部署本身已经包含了所有必要的组件。

微服务要足够小。不过,“小型”的定义是很主观的。可以使用一些估算方法如代码行数、功能点、用例等。不过一般来说,“小型”与尺寸之间并没有什么必然的联系。在Building Microservices一书中,作者Sam Newman就微服务尺寸的定义给出了一些技术:

  • 足够小,可以由一个小型的敏捷开发团队所拥有
  • 可以在一两个敏捷Sprint(一般来说是2到4周)中完成重写
  • 其复杂度不需要对服务做进一步拆分

无状态应用在处理每个请求时只会使用请求所包含的信息。微服务必须要是无状态的,在处理请求时无需记住与外部系统之前通信的信息。微服务必须要能独立处理请求,它可以与生态系统当中的其他微服务协作来进行处理。比如说,在与其他微服务交互后生成报表的微服务就是个相互依赖的系统。在这种场景中,只向报表微服务提供必要数据的微服务可能是个独立服务。全栈应用本身是可以部署的。它拥有自己的服务器、网络、托管环境。业务逻辑、数据模型与服务接口(API / UI)必须是整个系统的一部分。微服务必须是个全栈应用。

创新与持续不断的改进是企业与企业级项目背后的助推器。如果没有创新,那些过时与昂贵的基础设施组件可能要比在他们上面运行的软件的生命周期还要长。老旧的中间件可能会超期服役,结果是只有少数供应商才知道如何开发它。落后于最新标准的平台栈可能会引入临时应急的解决方案,最终则会产生技术债务。将项目快速迁移到微服务的就是那些开源项目了。Netflix OSS、Spring、Camel、Fabric8等都是很好的例子。借助于当下的PaaS,我们可以更加轻松地操纵多语言构成的全栈应用,而PasS一般来说也是由诸如Docker和Kubernetes等开源项目所维护的。在这个快节奏的时代中,从开发到上线以及修复Bug的时间被大大缩短了。几乎没有多少企业还能够容忍几个月的产品周期,他们需要软件为业务创造更多的价值。对于那些完全由软件驱动的公司如Uber、NetFlix、Amazon等来说更是如此。我们需要针对灵活性与弹性来构建系统,而不仅仅是效率和健壮性。Java EE并不会消亡,它会得到补充和完善。

如果对如何将Java EE应用演化为微服务感兴趣,那么请下载这本电子书。此外,还可以通过这里了解更多信息。

时间: 2024-12-25 01:38:00

微服务与Java EE的相关文章

微服务:Java EE的拯救者还是掘墓人?

有人认为,微服务的大行其道是在给Java EE下达死刑判决书.也有人认为,Java EE已死的论调可笑至极.InfoQ的读者朋友,你们怎么看? 引言 有人说,Java确实过于臃肿,经常"小题大做".但PHP.Node.js扩展方面短板太明显,做小应用可以,大型应用就玩不转了. 另外,Java EE领域有太多优秀框架可以解决开发效率的问题,事实上借用Spring等框架,开发的效率丝毫不亚于PHP. 互联网时代的Java开发者,很多都不是基于Servlet和EJB来开发Web应用,而且We

JAVA微服务架构视频教程

教程目录:┣━JAVA微服务架构视频教程┃ ┣━Java教程:第1章 微服务简介 4┃ ┃ ┣━Java教程:001构建单体应用┃ ┃ ┣━Java教程:002微服务解决复杂问题┃ ┃ ┣━Java教程:003微服务的优点┃ ┃ ┣━Java教程:004微服务的缺点┃ ┣━Java教程:第2章 Linux使用 19┃ ┃ ┣━Java教程:005Linux 简介┃ ┃ ┣━Java教程:006Linux 与 Windows 比较┃ ┃ ┣━Java教程:007安装 Linux┃ ┃ ┣━Java

Java EE的13种核心技术

一.内容简介 Java EE的13种核心技术:JDBC.JNDI.EJB.RMI.JSP.Java Servlet.XML.JMS.Java IDL.JTS.JTA.JavaMail和JAF. Java最初在浏览器和客户端机器中粉墨登场,当时很多人质疑它是否适合做服务器端的开发.现在随着对Java EE第三方支持的增多,Java被广泛接纳为开发企业级服务器端解决方案的首选平台之一. Java EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应

Java EE 7 教程 第一部分 简介 第1章 概述 第1.7节 Java EE 7 APIs

原文:http://docs.oracle.com/javaee/7/tutorial/doc/overview007.htm 翻译:石卓林 [email protected] 注意:此章是1.8章前移而来,不知为何oracle删除了原1.7开发角色章节 1.7 Java EE 7 APIs Figure 1-6 shows the relationships among the Java EE containers. Figure 1-6 Java EE Containers Descript

Micronaut 教程:如何使用基于 JVM 的框架构建微服务?

本文要点: Micronaut 是一种基于 jvm 的现代化全栈框架,用于构建模块化且易于测试的微服务应用程序.Micronaut 提供完全的编译时.反射无关的依赖注入和 AOP.该框架的开发团队和 Grails 框架的开发团队是同一个.Micronaut 框架集成了云技术,服务发现.分布式跟踪.断路器等微服务模式也内置到了框架中.在本教程中,你将使用不同的语言创建三个微服务:Java.Kotlin 和 Groovy.你还将了解使用 Micronaut HTTP 客户端消费其他微服务是多么容易,

K8s原生微服务管理工具helm-v3的使用初探实践(2)

目录:根据微服务的发版需求进行对应用进行调试,使用chart的模版发布微服务1.基于dubbo微服务发布一个基于生产环境用到的helm模版模版地址:git clone [email protected]:zhaocheng172/helm-dubbo.git拉取请把你的公钥给我,不然拉不下来 3.6 Chart模板Helm最核心的就是模板,即模板化的K8S manifests文件.它本质上就是一个Go的template模板.Helm在Go template模板的基础上,还会增加很多东西.如一些自

三、微服务的拆分与编写

[微服务的概念,使用场景,建模,架构通览,拆分微服务并且一步步分析,编写一些基础的微服务功能] 微服务的拆分与编写 (一).单体架构 什么是单体架构? 一个归档包(例如war格式或者Jar格式)包含了应用所有功能的应用程序,我们通常称之为单体应用.架构单体应用的方法论,我们称之为单体应用架构,这是一种比较传统的架构风格. 架构图  缺陷 1.复杂性高整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐,整个项目非常复杂.每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修

Apache发布支持Java EE微服务的Meecrowave服务器

Apache OpenWebBeans团队希望通过使服务器适应用户来消除复杂性.所以,该团队发布了Apache Meecrowave项目1.0版. Apache Meecrowave是一款小型服务器,非常适合微服务和独立服务.Apache OpenWebBeans表示, "Apache Meecrowave是一个基于Apache OpenWebBeans,Tomcat,CXF和Johnzon的微型服务器.换句话说,它包含了所有你需要从命令行运行基于JavaEE的微服务,而且只有9 MB.&quo

Java高并发高性能分布式框架从无到有微服务架构设计

微服务架构模式(Microservice Architect Pattern).近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API).每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境.类生产环境等.另外,应尽量避免统一的.集中式的服务管理