使用Java构建微服务

本文讲的是使用Java构建微服务,【编者的话】本文翻译自Dzone Guide to the Java Ecosystem,Dzone是一个关于Java的优秀网站。文中介绍了几种用Java构建微服务的方法,包括Container-less、Self-contained以及In-container。翻译经验不足,如有错误,请慷慨指出。

@Container容器技术大会将于2016年1月24日在北京举行,来自爱奇艺、微博、腾讯、去哪儿网、美团云、京东、蘑菇街、惠普、暴走漫画等知名公司的技术负责人将分享他们的容器应用案例。

快速浏览

  1. 在Java生态中,构建微服务的策略包括Container-less、Self-contained以及In-container等。
  2. Container-less微服务将应用及其依赖打包成一个单一的JAR文件。
  3. Self-contained微服务也是打包成一个单一的JAR文件,但它还包括一个嵌入式框架,这个框架含有可选的第三方lib,当然这些lib是兼容的。
  4. In-container微服务打包成一个完整的Java EE容器,该服务在Docker镜像中实现。

基于微服务的架构给架构师和开发者带来了新的挑战,然而,随着语言的升级和工具数量的增加,开发者和架构师完全有能力应对这样的挑战。Java也不例外,本文探讨了在Java生态系统内构建微服务的不同方法。

介绍

本文不会探讨微服务是好还是坏,也不会建议你应该事先使用微服务设计你的App,或者当他们在monolith应用出现时,就应该提取这些服务。

这里所描述的方法并不是唯一的,但它可以让你对这些可能性有一个良好的纵览。即使Java生态是本文所关注的领域,但这些理念也可传递到其他语言和技术中。

在文中,我将这几种方法分别称为Container-less,Self-contained,以及In-container。这些术语可能尚未被完全确立,但在这里,它们可以达到区分这几种方法的目的。我会在接下来的几个部分中阐述它们的意义。

Container-less

在Container-less方法中,开发者要将所有位于JVM顶层的一切事物作为应用的一部分。

Container-less方法使得所谓的单一JAR部署成为可能(也称作“fat JAR”部署),这意味着,应用及其依赖可以打包在一个单一的JAR文件,并作为一个独立的Java程序运行。

$ java -jar myservice.jar

这种方法的优点是:当应用在进行扩展和收缩时,服务的启动和停止是极其轻松的。另一个优点是部署简单,你只需传递一个JAR文件。

该方法的缺点是lib库的兼容性,你需要自己独立解决一些像事务处理之类的事情,或者需要引入第三方lib库为方案提供支持。随后,如果你需要像持久性之类的支持,你可能需要面对lib库兼容性的问题。

Self-contained

另一个单一JAR部署的变形是使用嵌入式框架构建微服务。在该方法中,框架提供了所需服务的实现,同时,开发者可以选择哪一些东西要包含在该服务中。

你可能认为这与Container-less的解决方案一样,但我在这里要区分一下它们,因为Self-cotained方法允许你使用第三方lib库,并且你知道这些lib库是兼容的。

该方法涉及到像Spring Boot和Wild Swarm之类的工具。

Spring Boot

Spring BootSpring Cloud Netflix 项目对使用Java构建微服务有着很好的支持。Spring Boot允许你挑选各种Spring生态系统中的工具,以及流行的第三方工具,并将这些工具和你的应用打包在一起。Spring Initializr使得你可以使用简单复选框列表的方式完全这一工作,这里有一个简单的Hello World服务的例子,Gist Sinppet

Wildfly Swarm

在Java EE中,与Spring Boot相对应的就是Wildfly Swarm。它允许你挑选所需的部分Java EE规范,并将其和应用以JAR文件的形式打包在一起。Hello World的例子,Gist Snippet

Self-contained方法的优点是你可以只挑选足以让服务运行的组件。

该方法的缺点是配置有点复杂,以及由此产生JAR文件有点大,因为它的构建是为了实际服务中所需的容器功能。

In-container

虽然要求一个完整的Java EE容器能够部署一个微服务,似乎需要很大的开销,但是,需要记住的是:一些开发者主张微服务的“微”不意味着这个服务要微小或简单。

在这些案例中,将Java EE容器视为所需平台似乎是合适的,因为你所需的唯一依赖是Java EE API。注意:由于其实现是由容器提供,因此该依赖项已经满足了。这意味着由此产生的WAR文件是极其精实的,该服务的实现和上述Wildfly Swarm的例子一样,参考这里,Gist Snippet

这种方法的优点是该容器通过标准APIs提供了测试和验证标准功能的实现,因此,作为一名开发者,你可以完全集中于业务功能,并且在应用代码之外维护底层代码。

该方法的另一个优点是实际应用程序代码并不依赖于部署该代码的Java EE应用服务器,无论是GlassFishWildFlyWeblogicWebSphere或其他Java EE兼容性实现。

该方法的缺点是你需要将该服务部署在容器中,这增加了部署的复杂性。

Docker

Docker从这里开始。通过将Java EE容器和服务实现打包进Docker镜像,你可以或多或少地取得和单一JAR开发同样效果。不同的是服务现在位于容器内,而不是JAR文件中。

Dockerfile
FROM jboss/wildfly:9.0.0.1.final
ADD myservice.war /opt/jboss/wildfly/standalone/deployments

通过启动Docker引擎中的Docker镜像,唤醒该服务。

docker run -it -p 8081:8080 myorganization/myservice

Snoop

细心的读者可能之前注意到Spring Boot代码段中的@EnableErekaClient注解,该注解在Eureka中进行服务注册,使得它可以被服务请求者所发现。Eureka是Spring Cloud Netflix包中的一部分,它是一种极其容易使用和配置的服务发现解决方案。

Java EE没有在外部提供这样的机能,但这里有几种开源方案。其中一种就是Snoop,其功能与Eureka类似。为了使一个Java EE微服务可以用于服务查找,唯一需要做的是使用@EnableSnoopClient注解,如本例所示:Gist Snippet

总结

在构建微服务时,Java是一个很好的选择。这里所描述的方法都可以很好地完成任务。至于你个人的特殊情况,最佳方法取决于其服务需求。对于简单的服务,一个Container-less或者Self-contained服务是最佳选择,但借助于In-container的实现,开发者可以更快,更简单地实现高级服务。总之,对于微服务的实现,Java是一种行之有效的生态系统。

更多关于微服务的见解,JVM语言,以及在Java中的趋势,可以在 DZone Guide to the Java Ecosystem!获取到。

原文链接: Building Microservices With Java(翻译:洪国安)

原文发布时间为:2015-11-09

本文作者:Arthur

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:使用Java构建微服务

时间: 2024-10-30 03:10:48

使用Java构建微服务的相关文章

使用 Java 构建微服务

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

《SpringBoot揭秘:快速构建微服务体系》—第1章1.1节了解微服务

第1章 了解微服务SpringBoot是一个可使用Java构建微服务的微框架,所以在了解SpringBoot之前,我们需要先了解什么是微服务.1.1 什么是微服务微服务(Microservice)虽然是当下刚兴起的比较流行的新名词,但本质上来说,微服务并非什么新的概念.实际上,很多SOA实施成熟度比较好的企业,已经在使用和实施微服务了.只不过,它们只是在闷声发大财,并不介意是否有一个比较时髦的名词来明确表述SOA的这个发展演化趋势罢了.微服务其实就是服务化思路的一种最佳实践方向,遵循SOA的思路

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 服务,而现在它具备了越来越多的功能,但是它的目标始终是作为轻量化.为生产环境准备且容易

使用Spring Cloud和Docker构建微服务

本文讲的是使用Spring Cloud和Docker构建微服务,[编者的话]这是系列博文中的第一篇,本文作者使用Spring Cloud和Docker构建微服务平台,文章的例子浅显易懂. 本系列博文主要向大家介绍如何使用Spring Cloud和Docker构建微服务平台. 什么是Spring Cloud? Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集.Spring Cloud引入了云平台连接器(Cloud Connector)和服务连接器(Service Co

Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构

本文讲的是Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第二篇,本篇我们将会利用工具进行设置,深入探讨如何使用Docker工作,然后搭建我们的第一个容器.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架

如何构建微服务架构

本文讲的是如何构建微服务架构[编者的话]"微服务"的概念兴起于四五年前,近几年尤其火热,各大厂都在进行微服务化改造和微服务建设.最近一年来我们也参与了微服务化的改造大军,这里写下一些做微服务系统设计和开发时的切身感受. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览:持续集成系统介绍:客户端与服务端的 CI/CD 实践:开发流程中引入 CI.CD:Gitlab 和 C

《SpringBoot揭秘:快速构建微服务体系》目录—导读

前 言为什么写这本书忘了是2015年的哪一天,只记得几个朋友跟友商的其他几个做技术的朋友吃饭,并简单做下技术交流.席间,友商的几位朋友对SpringBoot框架实施微服务很感兴趣,交谈甚欢之际,我无意间开玩笑说:"是不是该考虑写一本SpringBoot的书?"钟伦甫(原淘宝聚石)同学随口一句,"你倒是写啊!",得,以行践言吧,谁让你把话说出去了呢?当然,朋友的"热切期盼"只是其一,微服务盛行也是本书写作的一个契机, 希望本书成为国内第一本微服务相

硅谷Spring项目组专家教你利用Spring Cloud构建微服务

  在这一系列文章中,我将为您介绍利用Spring Cloud和Docker构建微服务平台的一些基本概念.   什么是Spring Cloud   Spring Cloud是一系列Pivotal云应用开放工具的合称,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式,为构建分布式系统的一些常见模式提供了解决方案.   如果您熟悉构建应用程序的Spring Framework,那么对Spri