使用Java构建微服务

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文讲的是使用Java构建微服务,【编者的话】本文翻译自Dzone Guide to the Java Ecosystem,Dzone是一个关于Java的优秀网站。文中介绍了几种用Java构建微服务的方法,包括Container-less、Self-contained以及In-container。
本文讲的是使用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程序运行。
container-less.png

$ java -jar myservice.jar

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

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

Self-contained

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

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

该方法涉及到像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容器能够部署一个微服务,似乎需要很大的开销,但是,需要记住的是:一些开发者主张微服务的“微”不意味着这个服务要微小或简单。
in-container.png

在这些案例中,将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(翻译:洪国安)

原文发布时间为:2015-11-09
本文作者:Arthur
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:使用Java构建微服务
目录
相关文章
|
3天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
5天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
4天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。
|
1天前
|
监控 API 持续交付
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第23天】 随着现代软件开发实践的不断演进,微服务架构已经成为企业追求敏捷、可扩展和弹性解决方案的首选。本文深入探讨了如何构建一个高效的微服务架构,涵盖了关键的设计原则、技术选型以及实践建议。通过分析微服务的独立性、分布式特性和容错机制,我们将揭示如何利用容器化、服务网格和API网关等技术手段,来优化后端系统的可维护性和性能。文章旨在为后端开发人员提供一套全面的指南,以应对不断变化的业务需求和技术挑战。
|
6天前
|
消息中间件 存储 安全
从零开始构建Java消息队列系统
【4月更文挑战第18天】构建一个简单的Java消息队列系统,包括`Message`类、遵循FIFO原则的`MessageQueue`(使用`LinkedList`实现)、`Producer`和`Consumer`类。在多线程环境下,`MessageQueue`的操作通过`synchronized`保证线程安全。测试代码中,生产者发送10条消息,消费者处理这些消息。实际应用中,可能需要考虑持久化、分布式队列和消息确认等高级特性,或者使用成熟的MQ系统如Kafka或RabbitMQ。
|
6天前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第18天】在数字化转型的浪潮中,微服务架构已成为企业提升系统灵活性、加速产品迭代的关键。此文深入探讨了构建高效微服务架构的实践方法,包括服务划分原则、容器化部署、持续集成/持续部署(CI/CD)流程以及监控与日志管理等关键技术点。通过分析具体案例,揭示了微服务在提高开发效率、降低维护成本及促进团队协作方面的显著优势。
|
7天前
|
消息中间件 存储 Java
深度探索:使用Apache Kafka构建高效Java消息队列处理系统
【4月更文挑战第17天】本文介绍了在Java环境下使用Apache Kafka进行消息队列处理的方法。Kafka是一个分布式流处理平台,采用发布/订阅模型,支持高效的消息生产和消费。文章详细讲解了Kafka的核心概念,包括主题、生产者和消费者,以及消息的存储和消费流程。此外,还展示了Java代码示例,说明如何创建生产者和消费者。最后,讨论了在高并发场景下的优化策略,如分区、消息压缩和批处理。通过理解和应用这些策略,可以构建高性能的消息系统。
|
7天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
8天前
|
监控 JavaScript 安全
构建微服务架构下的API网关
【4月更文挑战第15天】在微服务架构中,API网关扮演着至关重要的角色。它作为系统的唯一入口,不仅负责请求的路由、负载均衡和认证授权,还涉及到监控、日志记录和服务熔断等关键功能。本文将探讨如何构建一个高效且可靠的API网关,涵盖其设计原则、核心组件以及实现策略,旨在为后端开发人员提供一套实用的指导方案。
22 4
|
9天前
|
监控 负载均衡 API
构建高性能微服务架构:后端开发的最佳实践
【4月更文挑战第14天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了后端开发人员在设计和维护高性能微服务时需要遵循的一系列最佳实践。我们将从服务划分原则、容器化部署、API网关使用、负载均衡、服务监控与故障恢复等方面展开讨论,并结合实际案例分析如何优化微服务性能及可靠性。通过本文的阅读,读者将获得实施高效微服务架构的实用知识与策略。