阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用 Java 构建微服务

162次阅读
没有评论

共计 2999 个字符,预计需要花费 8 分钟才能阅读完成。

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

快速浏览

  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 构建微服务

 

$ java -jar myservice.jar

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

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

Self-contained

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

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

使用 Java 构建微服务

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

Spring Boot

Spring Boot 和 Spring 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 构建微服务

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

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

该方法的另一个优点是实际应用程序代码并不依赖于部署该代码的 Java EE 应用服务器,无论是 GlassFish,WildFly,Weblogic,WebSphere,或其他 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(翻译:洪国安)

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-11/124997.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计2999字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中