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

本文讲的是Java微服务:这个画饼是个谎言,但你却不能忽视它【编者的话】本文深入介绍了Java的微服务开发,包括其定义和一些可选方案,如Spring Boot、Dropwizard及其他开源项目。

微服务的趋势已经让人无法忽视。有些人可能会说它只不过是又一个故弄玄虚的流行词,而另一些人可能会列举出分解单体应用的优势,或者反其道而行,专注于其不足之处。

在本文中,我们将专注于Java生态系统,从务实角度看待我们所掌握的实际用于实现微服务的框架,来看看它们到底是什么。让我们开始吧。

这个画饼是个谎言

我们要问的第一个问题是,我们真的需要一个专门的框架用于构建微服务么?答案是否定的。你能用微服务框架构建一个单体应用么?是的。那么,如果真的由你来决定怎么做的话,微服务框架相比Java EE或Spring有什么好处?是什么让它值得采用?它们是否同时解决了内部架构和外部架构的问题

在接下来的几节中,我们将进一步了解Java EE及其新的微型化方案:Spring及Spring Boot、使用Lagom的Lightbend栈,以及其他的开源解决方案,例如Spotify的Apollo。

在我们继续之前,有必要说明一下,关于什么是微服务架构并没有一个清晰的定义。ThoughtWorks首席科学家Martin Fowler在他第一篇讲述微服务的文章中曾尝试这么定义它:

“微服务架构风格是将一个单一应用程序作为一系列小服务来开发的一种方式,每个服务都运行在自己的进程中,并使用轻量级的机制进行通信,通常是HTTP资源API。这些服务围绕业务能力进行构建,并可通过全自动部署装置进行独立部署”。

本文不讨论微服务的优势和劣势,并假定你只是简单地对支撑它的底层技术感兴趣。另外一篇涵盖调试微服务的主要挑战的问题文章值得一看,这是很多人在考虑微服务架构时没考虑的常见错误。

我们将对下列技术/平台/框架进行逐一分析。

1. Java Enterprise Edition

构建应用程序的传统Java EE方法是针对单体应用的,后者随着时间推移往往会变成……意式代码怪兽。传统上,一个企业应用程序将被打包成一个单一的EAR(Enterprise Archive)部署单元,这包括了WAR(Web Archive)文件和JAR(Java Archive)文件。

是的,“老态龙钟”的Java EE也可以用于微服务架构。想深入了解将Java EE单体应用重构为微服务框架的示例,可参考Arun Gupta的这篇文章,他通过一个购物车的示例应用程序讲解了这个过程所需的步骤。

虽然Java EE 8的开发有所放缓,其背后的“非官方”社区依然活力十足。来自Java EE Microprofile的成员针对微服务架构提出了优化企业Java的一个新方案。你可以在此加入讨论

在思考Java EE微服务时可以考虑的另一个有趣的项目是Kumuluz。这个框架利用你现有的Java EE知识,提供了一个无痛的方式供你手工挑选应用程序所需的组件,而无须在配置上浪费过多时间。

综述:Java EE及它周边的项目完全适合微服务,但未解决运维方面的问题,并且其使用与最佳实践留给你个人解读。

2. Lightbend:Play、Akka、ConductR及Lagom

Lightbend(此前为Typesafe)提供了更多选项。与Kumuluz相比普通Java EE的优势类似,Lagom用其引擎中的Play、Akka和ConductR包装了Lightbend栈,提供了构建微服务的一种更简单的方法。它的底层组件还包括了Cassandra、Guice、Jackson、slf4j、Logback及传统的Lightbend组件。

Lagom(瑞典语“恰到好处”的意思)还处在起步阶段,不过它看起来像是Lightbend栈的一个可靠方向。在一次与InfoQ的访谈中,Lightbend的CTO Jonas Boner说道:“市面上多数的微服务框架致力于简化单个微服务的构建——这是比较容易的部分。Lagom将其扩展到微服务的系统上,大型系统——这是比较困难的部分,因为我们面对的是分布式系统的复杂性。”

综述:Lagom将Lightbend的功能包裹在一个框架中,包括了ConductR提供的运维功能。它不仅关注单一的微服务,还关注作为一个整体的系统。

3. Spring、Spring Boot及Spring Cloud

虽然Spring及Spring Boot未称呼它们自己为微服务框架,Spring网站在其首页也未提及微服务,但这不代表它们被排除在外。似乎他们是有意不叫它为微服务以远离流行词炒作。

Spring Cloud中,Spring栈利用Netflix的Eureka和Ribbon来支持分布式系统(经常与“微服务”重叠的术语)的开发。这些功能包括配置管理、服务发现、智能路由、控制总线、领导者选举、分布式会话等等。

要深入了解如何使用Spring及几个额外的Netflix和其他开源项目来构建微服务,可阅读InfoQ的这篇文章

综述:Spring在微服务开发中处于有利位置,并且提供了解决运维角度问题的外部开源项目的方案。

4. Dropwizard

与Spring类似,Dropwizard也未过多地谈论微服务。它是一个Java框架,用于开发对运维友好的、高性能的、REST化的Web服务。它具有一套固有的Java库,能让构建适用生产环境的Java应用程序变得更简单。

Dropwizard Modules可以整合那些不在Dropwizard核心内的额外项目,其社区也开发了一些模块用以整合类似Netflix Eureka的项目,可与Spring Cloud媲美。

此前我们已经对Dropwizard和Spring Boot进行过一对一的比较,对彼此的功能进行考查。

综述:与Spring和Privotal、Java EE和Oracle、Lagom和Lightbend不同的是,由于Dropwizard是一个社区项目,没有大公司的支持,它的开发进度可能会比较慢,不过它背后具有一个强大的社区,不论是对大型公司或是小一点的项目来说,都是一个不错的框架。

5. Spotify Apollo、VertX及其他“微框架”

除了我们这里说的四个重量级选手,还有很多项目值得一提,也可用于编写微服务:

Vertx:用于在JVM上构建响应式应用程序的工具包。有人认为它应该在四巨头中占有一席之位。

Spotify Apollo:Spotify在编写Java微服务时使用的一组Java库。Apollo包括了类似HTTP服务器、URI路由系统的功能,可轻松实现REST化服务。

其他框架包括Spark、Ninja、Jodd、RestletBootique.io

综述:Java微服务的舞台如此巨大,那些轻量级选手也值得关注。

6. 微服务的必备条件

正如Martin Fowler在他的微服务的必备条件文章中所说,“当你的监控指出一个问题时,确保你能快速响应就显得至关重要。特别是需要开发团队和运维参与的故障管理,既要修复直接的问题,又要进行根源分析以确保修复底层的问题”。与此类似的,Hackernews上的这个主题和文章分享了更多在你还没为微服务构架做好准备时可能碰到的问题。

OverOps,我们正在构建一个工具来解决这个痛苦,它可显示生产环境中代码崩溃的时间、位置及原因。这是一个绝无仅有的工具,可展示完整的源代码,以及针对每个异常、记录的警告和错误跨越整个调用栈的变量状态。点这去瞧瞧

综述:微服务是有代价的,并不适合每个系统。如果你正在选择微服务架构,在深入之前你应该要了解其代价,并确定你需要改进的流程。

结语

你正在使用的是哪个框架或平台并不重要,构建微服务与它们的耦合并不紧密。它只是一种思维及一种架构手段,你应该选择那些对你而言生产力更高的方案。

除此之外,成功实现一个微服务框架并不止于应用程序本身。围绕它的多数成本来自于所谓的DevOps过程、监控、CI/CD、日志变更、服务器配备等等。我们将在未来的文章中对这些方面进行阐述,我们乐于听取你的想法,并在未来的文章对其进行讨论。欢迎通过@overopshq进行联系。

原文链接:Java Microservices: The Cake Is a Lie but You Can't Ignore It(翻译:梁晓勇

原文发布时间为:2016-12-10

本文作者:梁晓勇

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

时间: 2024-12-31 19:48:59

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

Java微服务开发指南 -- 下一步该了解什么?

下一步该了解什么?     我们在这本小册子里面介绍了非常多的知识,但是它远远不够涵盖一切!我们需要知道,这只是冰山一角,有非常多的微服务所涉及到的领域在本书中没有探讨.在最后这个章节,我们将会简要的介绍一些你必须了解的概念,并将这些联系留给读者进行深入研究. 配置     配置(Configuration)是分布式系统中非常重要的部分,而在微服务架构中变得愈发重要和困难.我们需要在配置和不可变递交(Immutable delivery)之间寻求平衡,因为我们不希望出现服务的碎片化.例如:我们需

Java微服务开发指南 -- Java环境下的微服务

Java环境下的微服务 本文涉及的内容,能让你学到什么?     本书适用于开发微服务的Java开发人员和架构师.我们在开始介绍微服务架构前,先讲述一些抽象的基本概念.不幸的是,使用新技术并不能神奇地解决分布式系统问题.但是我们通过一些做的很好的公司,它们是如何使用微服务来进行构建的,包括文化.组织结构和市场压力.然后我们深入了解几个Java微服务框架,附带的源代码反馈可以在GitHub上找到.我们会讨论有关部署.集群.故障转移以及Docker和Kubernetes在这些领域是如何解决这些问题.

Java微服务开发指南 -- 使用WildFly Swarm构建微服务

使用WildFly Swarm构建微服务     我们最后介绍一个新的微服务框架,它构建在支持分层且可靠的JavaEE技术栈上(使用JBoss WildFly 应用服务器),WildFly Swarm是一个完全兼容WildFly应用服务器,它基于可重用的组件,这里称为元件(fractions)来组成微服务应用.组装这些元件和你使用maven或者gradle去添加依赖一样简单,你只需要声明元件,WildFly Swarm将会帮助你完成后续的工作.     应用服务器和JavaEE在企业级Java应

Java微服务开发指南 -- 使用Dropwizard构建微服务

使用Dropwizard构建微服务     Dropwizard的历史要早于Spring Boot和WildFly Swarm,它最早是在2011.12发布的v0.1.0版本,在本文编写的过程中,它已经发布了v0.9.2版本,而v1.0.0版本也在准备中了.Dropwizard是Coda Hale在Yammer公司时创立的,它旨在提升公司分布式系统的架构(现在叫:微服务).虽然它最早被用来构建REST Web 服务,而现在它具备了越来越多的功能,但是它的目标始终是作为轻量化.为生产环境准备且容易

Java微服务开发指南 -- 使用Docker和Kubernetes构建可伸缩的微服务

使用Docker和Kubernetes构建可伸缩的微服务     从现在开始,我们将从更高的维度讨论微服务,涵盖了组织敏捷性.设计和依赖的思考.领域驱动设计以及Promise理论.当我们深入使用之前介绍的三个流行的微服务框架:Spring Boot.Dropwizard和WildFly Swarm,我们能够使用它们开箱即用的能力去构建一个暴露或者消费REST服务的应用,能够使用外部环境对应用进行配置,可以打包成一个可执行的jar,同时提供Metrics信息,但这些都是围绕着一个微服务实例.当我们

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

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

Java微服务开发指南 -- 前言

本系列是针对目前Java的微服务简要介绍,涉及到微服务的开发.容器部署.应用伸缩和可用性保障等多个方面. 主要内容是如何构建: 可伸缩 适应性 复杂性 的系统,并且用它来应对日益复杂的市场挑战.看看微服务如何解决这个难题: 原书使用了Red Hat Container Development Kit(CDK)来完成对k8s的使用,译者认为不应该依赖特定提供商的工具,因此后续章节的例子均使用k8s原生的工具完成,可以保证在ubuntu自有环境上的正常使用 k8s使用的是本机部署的minikube,

随手看的一本书《java微服务》,测试成功了其中的第一个样例

静态语言,JAVA应该多了解,结合微服务,DOCKER,再搞搞SPRING CLOUD,就能跟上时代了. 对了,链一个买书的地址: https://item.jd.com/12089180.html (我有时就不了解,一个程序员的收入,买一些书就那么小心呢?呵呵,收入都作什么去了??:)) pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven

Microserver —— AOL 的 Java 微服务框架

Microserver 是一个零配置.基于标准的身经百战的库,用来运行 Java REST 微服务,通过 Java 标准 main 类执行.从 2014 年开始就一直在 AOL 生产环境中使用. 框架结构: high level architecture main 类: public class AppRunnerTest { public static void main(String[] args) throws InterruptedException { new MicroserverA