【编者按】微服务背后的大理念是将大型、复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化。本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊。
快速预览
- 在 Java 生态系统中构建微服务的策略主要有:container-less, self-contained 和 in-container;
- Container-less 微服务把应用程序及其所有依赖打包成单一的 jar 文件;
- Self-contained 微服务也会将应用及其依赖打包成单一的Jar文件,但它还包含可能含有第三方库的嵌入式框架;
- In-container 微服务会打包一个完整的 Java EE 容器,并且它的服务是在 Docker image 中实现。
基于微服务的架构设计是架构师和程序员们面临的一项新挑战。然而,随着语言及工具的不断更新,架构师们完全有能力征服这样的挑战。 Java 也不例外,本文探讨了使用Java生态系统来构建微服务的几种不同方式。
介绍
本文不会讨论微服务的好与坏,也不会建议你提前为微服务设计应用程序,或当它们出现在你庞大的应用中时,是否应该剥离这些微服务。
本文介绍的方法并不是唯一的,但应该可以达到抛砖引玉的效果。尽管本文的重点是使用 Java 生态系统来构建微服务,但这些概念同样可以转移到其它语言和技术中。
笔者把本文用到的方法命名为 container-less、self-contained 和 in-containe。这些名称或许不是非常正式,但足以区分相互间的差别。接下来,笔者会详细描述每种方法。
Container-less
在此方法中,开发者会将 JVM 之上的任何事物视为应用程序的一部分。
container-less 方法会启用所谓的单 jar 部署(也可称作“fat jar部署”),这也就意味着,应用程序及其所有依赖都会被打包成单一的jar文件,并且作为独立的Java进程运行。
$ java -jar myservice.jar
该方法的第一个优点就是当对应用的规模进行伸缩时,服务很容易按需求快速启动和停止;另一优点是方便部署,你只需要传递一个 jar 文件即可。
该方法的缺点就是库的兼容性。对于事务支持这类问题,你需要自己来实现,或必须引入第三方库才能实现。而后,如果你需要更多支持,例如持续性问题的支持,你就需要解决第三方库之间的兼容性问题。
Self-contained
另一种单 jar 部署就是使用一个嵌入式框架来构建服务。在此方法中,框架提供了所需服务的实现方法,开发者可以选择在项目中包括哪些服务。
你可能会认为这个方法与 container-less 完全一样,但笔者认为,两者的区别在于,self-contained 方法会提供一套相互兼容的第三方库。所以,该方法不存在库兼容性问题。
该方法可能涉及 Spring Boot、Wildfly Swarm 之类的工具。
Spring Boot
在Java中,Spring Boot 和 Spring Cloud Netflix 项目对构建微服务提供了很好的支持。 Spring Boot 允许你选择各种 Spring 工具和其它流行的工具,然后把它们和你的应用打包成一个 jar 文件。Spring Initializr 提供了一个简单的复选框列表来完成上面这些事。一个简单的Hello World服务示例如下: Gist Snippet
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。
该方法的优点是,容器通过标准 API 提供了经过测试和验证的标准功能的实现。因此,开发者可以完全聚焦于业务功能,并在应用代码之外维护底层代码。
另一个优点是,应用程序代码不依赖 Java EE 应用服务器,无论该应用部署到GlassFish、WildFly、WebLogic、WebSphere 还是任何与 Java EE 兼容的其他实现系统。
该方法的缺点是你需要把服务部署到容器中,这样就增加了部署的复杂性。
Docker
现在来谈谈 Docker 。通过把 Java EE 容器和服务实现打包到 Docker 镜像,你可以得到与单一 jar 部署相似的结果。唯一的不同是服务打包在 Docker 镜像中,而不是在 jar 文件中。
Dockerfile
FROM jboss/wildfly:9.0.1.Final
ADD myservice.war /opt/jboss/wildfly/standalone/deployments
在 Docker 引擎中启动 Docker 镜像可以唤醒服务:
$ docker run -it -p 8081:8080 myorganization/myservice
Snoop
细心的读者可能已经在先前的 Spring Boot 代码段中注意到了 @EnableEurekaClient 注解。该注解在 Eureka 中注册服务,使其能够被服务消费者发现。 Eureka 是 Spring Cloud Netflix 包的一部分,并且是一个极易使用和配置服务发现的解决方案。
Java EE 在外部并没有提供这样的功能,但是有一些开源解决方案可以使用,其中一个就是 Snoop,它的功能与Eureka相似。要使 Java EE 微服务支持任务查找,唯一要做的是使用 @EnableSnoopClient 注解,如本例所示:Gist Snippet。
总结
相关推荐
Dubbo作为Java微服务的重要框架,提供了服务治理、远程调用、负载均衡等功能,帮助开发者实现微服务的构建。 本书的Dubbo篇详细阐述了如何使用Dubbo构建和管理微服务,包括服务的注册与发现、服务调用、服务治理...
【Java微服务实践-Spring Boot WebSocket】讲解 在现代互联网应用中,实时通信的需求日益增长,这催生了WebSocket协议的诞生。WebSocket协议是一种在客户端和服务器之间建立持久连接的协议,实现了全双工通信,使得...
这个框架特别强调了Java微服务架构、API网关以及前后端分离的设计模式,旨在提升开发效率,保证系统的可扩展性和稳定性。下面我们将深入探讨这些核心知识点。 1. **Java微服务**: Java微服务架构是一种将大型应用...
全套微服务架构,视频学习java微服务架构,包括如下 第1章 微服务简介 001构建单体应用 002微服务解决复杂问题 003微服务的优点 004微服务的缺点 第2章 Linux使用 005Linux 简介 006Linux 与 Windows ...
《Java微服务》帮助你用Java构建供企业使用的微服务架构,内容包括微服务核心概念和框架、大型软件项目的高层次设计、开发环境设置和前期配置、对微服务架构持续集成的部署、实现微服务的安全性、有效地执行测试、...
章节1-什么是微服务\千锋java教程:001-构建单体应用模型.mp4章节1-什么是微服务\千锋java教程:002-走向单体地狱.mp4章节1-什么是微服务\千锋java教程:003-微服务解决复杂问题.mp4章节1-什么是微服务\千锋java教程...
本文将详细介绍如何在Java微服务架构中使用Spring Cloud Config实现配置中心。 通过使用Spring Cloud Config,Java微服务架构可以实现配置的集中管理和动态更新,大大提高了配置管理的效率和灵活性。配置中心不仅...
目前业界最流行的微服务架构正在或者已被各种规模的互联网公司广泛接受和认可,业已成为互联网开发人员必备技术。无论是互联网、云计算还是大数据Java平台已成为全栈的生态体系,其重要性几乎不可替代。Spring Boot...
Java微服务架构在邮政移动互联网应用研发设计中的实践与思考是一个深入探讨现代软件开发趋势的主题。随着技术的不断发展,微服务架构已经成为构建大型、复杂、分布式系统的一种主流方式,尤其在处理高并发、高可用性...
在分析“Java微服务架构在邮政移动互联网应用研发设计中的思考与实践”这一主题时,我们首先需要了解微服务架构的概念以及其相较于传统单体式架构的优势。单体式架构,也就是传统应用架构模式,是在一个应用程序中...
在本Java微服务实战项目中,我们探讨了如何利用现代Java技术栈构建高效、可扩展的应用程序。这个项目不仅提供了完整的源码,还为初学者和有经验的开发者提供了宝贵的实践经验。以下是该项目涵盖的一些关键知识点: ...
该项目为基于Spring Cloud架构的Java微服务设计源码,名为spring-cloud-fast,包含121个文件,其中包含73个Java源文件、10个属性文件、9个PNG图片文件、6个XML配置文件、5个Markdown文件、4个Git忽略文件、3个JAR包...
【云计算时代,如何快速搭建微服务?】 在云计算迅速发展的今天,微服务架构成为现代企业构建可伸缩、高可用应用的重要方式。Spring框架凭借其强大的依赖注入特性,长期以来深受Java开发者喜爱,使得系统设计更加...
在金融行业中,高效管理和处理图片...通过以上步骤,我们可以构建一套完整的Java微服务图片处理系统,既能满足金融场景对数据安全的要求,又能有效优化系统性能。在实际项目中,应根据具体需求和资源限制灵活调整方案。
本文将详细介绍如何在Java微服务中实现API文档的自动化部署,并探讨如何与Vue.js前端集成。 通过自动化部署API文档,可以确保文档的准确性和及时更新,同时提高团队的协作效率。结合Vue.js前端,可以构建一个用户...
Java微服务实践-Spring Boot 消息 Java微服务实践是指在Java语言中实现微服务架构的实践,Spring Boot 是一个流行的Java框架,消息服务是微服务架构中的重要组件。本文将介绍Java微服务实践中消息服务的相关知识点...
该项目是一款基于Java微服务框架构建的程序员面试先锋交流社区设计源码,总计包含616个文件。文件类型涵盖Java源代码、XML配置、Markdown文档、YAML配置、Git忽略规则、Idea项目文件、许可证、SQL数据库脚本等。主要...
该源码是一个综合性二手交易平台,采用Java微服务架构设计,包含998个文件,涵盖307个XML配置、244个Java源代码、240个Class文件、68个JPG图片、39个Vue组件、31个PNG图片、22个YAML配置文件、17个IDE项目配置文件、...
Java微服务电商系统是一种基于Java技术栈构建的分布式应用程序,旨在提供高效、可扩展和可靠的电子商务解决方案。在"Java微服务电商系统源码.zip"这个压缩包中,包含了一个名为"beastmail-master"的子项目,这可能是...