使用Java构建微服务

简介: 本文讲的是使用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构建微服务
目录
相关文章
|
2月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
294 3
|
3月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
1094 1
|
4月前
|
数据采集 搜索推荐 Java
Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
|
3月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
1868 58
|
2月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
367 41
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
308 8
|
2月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
230 10
|
2月前
|
人工智能 Java 物联网
Java与边缘AI:构建离线智能的物联网与移动应用
随着边缘计算和终端设备算力的飞速发展,AI推理正从云端向边缘端迁移。本文深入探讨如何在资源受限的边缘设备上使用Java构建离线智能应用,涵盖从模型优化、推理加速到资源管理的全流程。我们将完整展示在Android设备、嵌入式系统和IoT网关中部署轻量级AI模型的技术方案,为构建真正实时、隐私安全的边缘智能应用提供完整实践指南。
356 3
|
2月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
458 4

热门文章

最新文章