如何使用 Java 构建微服务?

【编者按】微服务背后的大理念是将大型、复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化。本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊。

 

快速预览

  1. 在 Java 生态系统中构建微服务的策略主要有:container-less, self-contained 和 in-container;
  2. Container-less 微服务把应用程序及其所有依赖打包成单一的 jar 文件;
  3. Self-contained 微服务也会将应用及其依赖打包成单一的Jar文件,但它还包含可能含有第三方库的嵌入式框架;
  4. 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。

 

总结

在构建微服务时, Java 是一个非常好的选择。本文中介绍的任何一种方法都可以实现微服务。当然,最好的方法还是根据服务需求而定。对于简单的服务, container-less 或者 self-contained 服务就是不错的选择。不过,借助 in-container ,开发者可以更快更简单地实现更高级的服务。无论针对哪种服务,Java 生态系统都能提供行之有效的实现方法。

(编译自:https://dzone.com/articles/building-microservices-with-java )

OneAPM 为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。

本文转自 OneAPM 官方博客

如何使用AuraDB构建Java微服务 虽然我们可以使用Spring Data的一些默认方法,以开箱即用的方式实现(请参见代码示例文档-- https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.core-concepts),不过,我们在此进行了自定义。毕竟,考虑到提取所有35,342条评论,可能会使得客户端在呈现结果的过程中出现过载,因此我们并没有使用默认的.findAll()方法,而是只提取其中的前1,000个结果。 阅读详情

相关推荐

使用 Java 构建微服务服务器

Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架,它简化了配置和部署过程,并提供了许多开箱即用的功能。Java是一种广泛使用的编程语言,它提供了丰富的工具和库来构建可扩展的微服务。通过使用Java和Spring Boot,你可以轻松地构建可扩展和可维护的微服务服务器,以满足现代应用程序开发的需求。希望本文对你有所帮助!至此,我们已经成功地使用Java和Spring Boot构建了一个简单的微服务服务器。这将创建一个名为"myservice"的新项目,用于构建我们的微服务服务器。

OUDKE的博客 187

适用于Java开发人员的微服务:实现微服务(同步,异步,反应式,非阻塞)

1.简介 本教程的先前部分主要关注与微服务架构有关的或多或少的高级主题,例如多语言世界中的不同框架,通信风格和互操作性。 尽管它非常有用,但是从这一部分开始,我们将逐步扎根,将注意力集中在实际的方面,如开发人员所说,离代码更近。 目录 1.简介 2.同步 3.异步的 4.封锁 5.非阻塞 6.反应性 7.未来是光明的 8.结论 9.接下来 我...

danpu0978的博客 694

Hi3559AV100制作ext4文件系统和烧录emmc

1、首先生成所需文件系统,见本博客<Hi3559AV100文件系统制作cramfs>。 2、使用工具生成EXT4文件系统 ./make_ext4fs -s -l 96M rootfs_hi3559av100.ext4 ./rootfs 3、烧录文件系统 mw.b 0x82000000 ff 0x12C00000;tftp 0x82000000 STM_...

阿Sir问道 7033

六种微服务架构的设计模式

在这种方法中,客户端向聚合器微服务发送请求,然后根据系统的要求,聚合器微服务异步地向一些微服务发送请求,同步地向其他微服务发送请求。当客户端请求需要跨多个微服务分布的数据或功能时,此模式是合适的。总之数据共享微服务设计模式是一种解决微服务架构中数据共享问题的设计模式,通过将数据共享的责任委托给专门的微服务,可以提高系统的灵活性、可扩展性、数据一致性和性能。聚合器设计模式是一种设计模式,用于通过聚合多个独立的微服务的响应来组成一个复杂的服务, 它可以是一个简单的Web页面,将检索到的数据进行处理展示。

yeq2014的专栏 3090

Starlink第三代终端和第二代终端的差异性有哪些?

starlink第三代终端和第二代终端的额差异

chen2jiang3的博客 2925

从零开始:手把手教你检查并更新英伟达GPU驱动和CUDA版本(Windows/Linux双平台)

本文详细指导如何在Windows和Linux系统上检查并更新英伟达GPU驱动和CUDA版本,解决版本不匹配导致的常见问题。涵盖驱动更新、CUDA Toolkit安装、版本冲突排解及性能优化技巧,帮助开发者高效管理GPU计算环境。

weixin_29237635的博客 701

JAVA开发(保姆级微服务搭建过程)

现在的java后端基本都是通过微服务的方式进行搭建。当我们对需求进行分割时,可以通过横向或者纵向对服务进行划分。或者当某一块的业务我们希望通过一个单独的服务进行开发时,就需要新增新的服务,本文通过springtool suite工具介绍,微服务搭建过程。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 6971

大白话系列:什么是微服务

用大白话和实际例子来通俗易懂地告诉你什么是微服务~

2401_87403086的博客 1242

Java微服务

在这里插入图片描述 架构演进: 一、开发环境&生成环境 1. 开发环境 平时在写代码时,大多都在是win10/win7/Mac,这些系统都可以称呼开发环境,我们会为了更高效的开发应用程序,安装很多的软件,会导致操作系统不安全,稳定性降低。 2. 生成环境 在生产环境中,操作系统不会采用win10/Mac,这种操作系统相对不安全,生成环境要面向全体用户的,生产环境是要面向用户的,一般会采用专业操作系统。 大多市面上使用的都是基于Linux版本的服务器操作系统Windows 2003 service 二

weixin_43999182的博客 1万+

相机通用类之海康相机,软触发硬触发(飞拍),并输出halcon格式对象

如何显示图像:可以访问我文章开头的博客,通过编写相机通用类即可,程序中是有继承通用类,通过访问相机通用的获取图像数据,从而传输图像数据。具体可以查看相机通用类。整体过程其实比较简单,由于海康相机没有像一些品牌相机一样可以直接使用序列号开启相机,所以我们需要通过对相机信息进行索引,根据索引到的相机序列号来开启相机。

m0_51559565的博客 7620

曲线最小二乘拟合基础

介绍曲线拟合的最小二乘原理,介绍了常规最小二乘和正交最小二乘算法,最后介绍了MathNet矩阵运算库的基本操作。

yh523的博客 1303

使用Java构建高性能微服务架构

Java生态系统为构建高性能微服务架构提供了强大的支持。从框架选择到架构设计,再到性能优化和部署策略,Java开发者可以通过丰富的工具和最佳实践高效地实现微服务的构建。希望本文能为您的微服务开发提供指导,欢迎分享您的心得或提出问题!

桂月二二博客 1327

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

使用Java构建微服务

Building Microservices With Java 使用Java构建微服务 【编者按】微服务背后大的理念将大型、复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化。本文作者主要介绍了利用Java生态来构建微服务,并且分析了每种方法的利弊。 Quick View Strategies for building microservices in the

mengyidan的专栏 2333

汽车UDS诊断之诊断会话控制服务(0x10)深度剖析

DiagnosticSessionControl就是诊断会话控制。 请求消息定义 A_Data类型 参数名称 Cvt 字节值 助记符 #1 诊断会话控制请求SID M 0x10 DSC #2 子功能=[诊断会话类型] M 0x00-0xFF LEV_DS_ ...

心骗小白话的博客 7419

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

WeiPeng2K的博客 662

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

使用Spring Cloud构建Java微服务架构

通过使用Spring Cloud的各种组件和工具,Java开发者可以快速构建高可用、高弹性、可伸缩的微服务架构,实现应用程序的快速开发和部署。随着云计算和微服务架构的兴起,越来越多的企业开始采用微服务架构来构建他们的应用系统。Spring Cloud是一个基于Spring Boot的开源微服务框架,提供了一整套解决方案来简化微服务架构的开发、部署和管理。微服务架构是一种将应用程序拆分成多个小型服务的架构模式,每个服务都独立部署和管理,通过轻量级的通信机制来实现服务之间的协作和调用。

聚娃科技开发者博客 808

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java微服务实战:使用Spring Boot构建高效服务

构建微服务应用虽然挑战重重,但利用Spring Boot等现代框架可以大大简化开发和部署过程。希望本文能帮助你了解如何使用Java和Spring Boot构建微服务架构。这篇博客可以根据需要进一步扩展或细化,如深入探讨每个组件的配置细节,或添加更多关于服务间通信、安全性、监控等方面的内容。

youmashengyue的博客 1285

Java 微服务架构:使用 Spring Cloud 构建分布式系统

微服务架构是一种将单个应用程序拆分为多个小型、独立、可部署服务的架构风格。这些服务围绕业务能力进行组织,每个服务都有自己独立的数据库、业务逻辑和用户界面,并且可以独立地进行开发、测试、部署和扩展。独立性:每个微服务都是一个独立的单元,可以独立开发、部署和扩展,服务之间的耦合度较低。可扩展性:可以根据业务需求对单个微服务进行水平扩展,而无需对整个系统进行大规模改造。i技术多样性:不同的微服务可以根据业务需求选择最适合的技术栈,提高开发效率。容错性。

数字魔方操控师的博客 1222

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

    Spring Boot是一个广泛用来构建Java微服务的框架,它基于Spring依赖注入框架来进行工作。Spring Boot允许开发人员使用更少的配置来构建微服务,同时框架本身能够尽可能的减少开发人员的冲突,它和我们后面要介绍的两个框架类似,它通过以下几个方面帮助开发人员: 自动化配置,一般情况下都有默认配置 提供一组流行的starter依赖,方便开发人员使用 简化应用打包 提升应用运行时的内省性(例如:Metrics与环境信息) 简化的配置 &nbsp

WeiPeng2K的博客 764

使用Java构建可扩展的微服务架构

选择合适的技术栈和框架,如Spring Boot和Spring Cloud,能够显著简化微服务的开发、部署和管理,从而提升系统的稳定性和可维护性。在传统的单体应用程序中,随着业务复杂性和用户数量的增加,单一代码库的维护和扩展变得越来越困难。微服务架构通过将应用程序拆分成小型、自治的服务来解决这些问题,每个服务都专注于特定的业务功能,具有独立的部署和扩展能力。微服务架构中,服务注册中心(如Eureka、Consul)负责管理和维护服务的注册信息,客户端通过服务发现来动态定位和调用服务。

微赚淘客开发者博客 431

IBM resilient-java-microservices-with-istio 常见问题解决方案

IBM resilient-java-microservices-with-istio 常见问题解决方案 1. 项目基础介绍及主要编程语言 resilient-java-microservices-with-istio 是一个开源项目,由 IBM 开发,旨在展示如何构建、部署和连接具有弹性的 Java 微服务,利用 Istio 服务网格来实现高级别的弹性和可靠性。该项目通过配置和使用 Istio ...

gitblog_00615的博客 458
上一篇: IntelliJ IDEA 内存优化最佳实践
下一篇: JSON和XML:不可同日而语
OneAPMOfficial
博客等级 码龄11年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值