”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Java Spring Boot 构建可扩展的微服务:最佳实践和技术第 -1 部分

使用 Java Spring Boot 构建可扩展的微服务:最佳实践和技术第 -1 部分

发布于2024-08-18
浏览:688

整体架构

  • 如果我们在单个项目中开发所有功能,那么它被称为基于整体架构的应用程序。

  • 我们将应用程序打包为 jar/war 以部署到服务器中。

  • 由于整体应用程序包含了所有功能,它将成为 fat jar/war。

优点
1) 易于开发和管理。
2) 一切都在一处可用。
3) 只需配置一次。

缺点
1)维护困难
2) 单点故障
3) 如果我们执行任何更改,则整个项目将重新部署和测试。
4) 开发人员可能不了解整个模块,因此更难开始修复问题。
5) 如果某个模块负载过大,我们需要创建完整应用程序的多个实例,这样会占用大量空间,因为每个模块彼此紧密耦合。

Building Scalable Microservices with Java Spring Boot: Best Practices and Techniques part -1

为了克服单体式的问题,微服务架构应运而生

微服务架构

  • 微服务不是一种编程语言、框架或 API。微服务是一种架构设计模式。

  • 微服务建议开发具有松散耦合的应用程序功能。

  • 在微服务架构中,我们不会在单个项目中开发所有功能。我们将项目功能划分为多个 REST API。

  • 微服务不仅仅与java相关。任何特定于编程语言的项目都可以使用微服务架构。

微服务是我们开发小型服务的一种方法,每个服务都在自己的容器/进程/服务器上运行,服务应该是轻量级的并且可独立部署。这可以实现更快的开发、部署和可扩展性。

正如您所看到的,单体应用程序的员工模块、客户模块、地址模块和课程模块现在转换为小型服务,因此这里它们就像员工服务、客户服务、地址服务和课程服务。在单体应用程序中,使用单个数据库,但在微服务应用程序中,每个服务都有自己的数据库。他们现在相互依赖。每个服务都在相互通信,其余的调用。

Building Scalable Microservices with Java Spring Boot: Best Practices and Techniques part -1

优点

  • 技术独立(我们可以使用Python、Go等多种技术开发后端API)
  • 数据库独立性。

  • 每个服务都是相互独立的(松散耦合),因此我们可以独立部署每个服务。

  • 如果在任何服务中执行任何更改,则无需部署所有服务,只需部署一个服务即可。

  • 开发一项服务不需要了解整个应用程序。

  • 单个微服务的故障不会影响整个应用程序,增强整体弹性。

  • 更小的代码库和关注点分离使维护和调试更易于管理。

  • 由于其较小且独立的性质,各个微服务可以根据需求独立扩展,而无需扩展整个应用程序。

  • 每个服务可以进行不同的测试。

缺点

  • 如果我们想要在一个服务配置中执行更改,那么我们需要对每个服务配置执行更改,例如,我所有项目中的每个 application.properties 文件中都存在一个公共属性。
company.name=tier3Hub

因此,如果我们想更改公司名称,那么我们需要更改所有服务的名称。

  • 由于服务之间的相互依赖和交互,测试基于微服务的应用程序可能会更加复杂。

  • 每个服务都会处理一定数量的请求,之后如果我们发送的请求多于服务就会关闭,因此我们需要该服务的多个实例,并在我们需要的服务的不同实例中路由请求负载均衡器平衡来自客户端的请求和不同实例中的路由。但是用 Java 编写负载均衡器很困难。

为什么选择 Java 来实现微服务

Java提供了名为Spring-Boot的框架来开发Rest API,Spring-Boot提供了很多功能,例如自动配置、嵌入式服务器,如果我们正在开发服务,那么需要在服务器上部署sech服务而spring-Boot提供了tomcat服务器,因此每个服务都运行在tomcat的不同端口上。例如,员工服务在端口 8080 上运行,课程服务在端口 8081 上运行,并且每个服务都有自己的服务器。

Building Scalable Microservices with Java Spring Boot: Best Practices and Techniques part -1

在 spring-Boot 的帮助下,提供了快速开发、更少配置、生产就绪应用程序和 stater 项目的功能

Spring框架下有一个项目叫Spring Cloud,它提供了现成的微服务支持,Spring Cloud提供了一些通用的工具和技术来快速开发通用的微服务模式。

Spring Cloud 专注于为典型用例提供良好的开箱即用体验,并提供可扩展性机制以覆盖其他用例

  • 分布式/版本化配置
  • 服务注册和发现
  • 路由
  • 服务到服务调用
  • 负载均衡
  • 断路器
  • 分布式消息传递
  • 短暂的微服务(任务)
  • 消费者驱动和生产者驱动的合同测试。

微服务架构

我们没有固定的微服务架构,开发人员根据项目需求定制微服务架构,大多数项目将使用微服务架构中的以下组件。

1) 服务注册中心(Eureka Server)

2) 服务(REST API)

3) 服务间通信(FeginClient)

4) API网关

5) 管理服务器

6) 拉链

结论

Java 中的微服务改变了我们软件开发的方式,将灵活性、可扩展性和弹性提升到了一个新的水平。 Java 丰富的生态系统与 Spring Boot、Micronaut 等框架相结合,使其成为构建能够满足现代应用程序需求的微服务的绝佳选择。

当我们探索这种架构时,很明显为什么微服务比传统的整体应用程序更受欢迎。它们提供模块化和独立性,允许团队单独开发、部署和扩展服务。在云原生功能日益成为标准的世界中,这一点尤其有价值。然而,这一过程也暴露了一些挑战,例如确保数据一致性、管理服务间通信以及维护跨服务的强大安全性。

及时了解工具和实践的最新进展对于使用微服务的 Java 开发人员至关重要。环境在不断发展,那些适应的人将最有能力充分利用这种架构的潜力。 Java 微服务的未来看起来充满希望,框架和工具不断改进,并得到越来越多渴望分享知识和经验的开发人员社区的支持。

在 Java 中采用微服务意味着为创建更具弹性、可扩展性和可维护性的应用程序打开了大门。通过遵循最佳实践并致力于持续学习,开发人员可以释放软件开发的新可能性,从而带来更具创新性和更高效的解决方案。

版本声明 本文转载于:https://dev.to/ayushstwt/building-scalable-microservices-with-java-spring-boot-best-practices-and-techniques-part-1-1da3?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 字符串常量池:为什么即使文字存在,“new”也会创建一个新的字符串对象?
    字符串常量池:为什么即使文字存在,“new”也会创建一个新的字符串对象?
    字符串常量池:深入检查Java 中的字符串常量池被池化以优化内存使用并提高性能。这意味着当遇到字符串文字时,编译器会检查字符串常量池中是否存在具有相同值的现有字符串对象。如果找到,引用将定向到现有对象,避免创建新对象。但是,当使用“new”运算符创建新的 String 对象时,会出现混乱,因为这似乎...
    编程 发布于2024-11-06
  • 如何在 PHP 中使用 array_push() 处理多维数组?
    如何在 PHP 中使用 array_push() 处理多维数组?
    使用 PHP 的 array_push 添加元素到多维数组使用多维数组可能会令人困惑,特别是在尝试添加新元素时。当任务是将存储在 $newdata 中的循环中的数据附加到给定 $md_array 内的子数组“recipe_type”和“cuisine”时,就会出现此问题。要实现此目的,您可以利用ar...
    编程 发布于2024-11-06
  • Python 第 00 天
    Python 第 00 天
    今天,我开始了我的个人挑战,#100DaysOfCode。为了这个挑战,我选择学习Python,因为我的目标是成为一名数据分析师。 第 2 章: 变量和字符串 我用来学习 Python 的材料是 Eric Matthes 写的一本名为《Python Crash Course》的书。它对学习非常有帮...
    编程 发布于2024-11-06
  • PDO、准备好的语句或 MySQLi:哪一个最适合您的 PHP 项目?
    PDO、准备好的语句或 MySQLi:哪一个最适合您的 PHP 项目?
    揭秘 PDO、Prepared statements 和 MySQLi在 PHP 数据库交互领域,初学者经常会遇到从遗留 mysql_ 过渡的建议* 函数适用于更现代的选项,如 PDO、准备好的语句或 MySQLi。虽然访问和操作数据库的基本目标仍然存在,但每种技术都提供了独特的优势和细微差别。PD...
    编程 发布于2024-11-06
  • WordPress 主题开发:终极文件夹结构指南
    WordPress 主题开发:终极文件夹结构指南
    WordPress 是构建网站时的灵活框架。您可以构建任何类型的网站,例如 CMS、电子商务、单一登陆页面等。这里我将讨论 WordPress 项目的结构,以便您可以制作自定义主题。当您为自己或客户制作网站时,流行的主题(例如 divi、Astra、Neve、oceanwp 等)是一些不错的选择。但...
    编程 发布于2024-11-06
  • 工具和资源 [实时文档]
    工具和资源 [实时文档]
    CSS https://unsplash.com = 示例图像 https://uifaces.co = 示例用户面部图像 https://extract.pics/ = 从网站提取所有图像 https://color.adobe.com/ = 上传渐变图像并获取十六进制颜色代码 ...
    编程 发布于2024-11-06
  • 如何在 JavaScript 中检查字符串是否包含数组中的任何子字符串?
    如何在 JavaScript 中检查字符串是否包含数组中的任何子字符串?
    使用 JavaScript 数组查找字符串中的子字符串为了确定字符串是否包含数组中的任何子字符串,JavaScript 提供了灵活的方法.Array Some Methodsome 方法迭代数组,提供回调函数来测试每个元素。要检查子字符串,请使用 indexOf() 方法搜索字符串中的每个数组元素:...
    编程 发布于2024-11-06
  • Laravel Livewire:它是什么以及如何在您的 Web 应用程序中使用它
    Laravel Livewire:它是什么以及如何在您的 Web 应用程序中使用它
    Livewire 是 Laravel 生态系统中最重要的项目之一,专门针对前端开发。 Livewire v3 最近发布了,让我们来探讨一下 Livewire 是什么,以及什么样的项目适合其架构。 Livewire 的独特之处在于它允许开发“现代”Web 应用程序,而无需使用专用的 JavaScrip...
    编程 发布于2024-11-06
  • C++中通过空指针调用方法可以不崩溃吗?
    C++中通过空指针调用方法可以不崩溃吗?
    C 中通过空指针调用方法的意外行为 在提供的代码片段中,通过空指针调用方法,但是令人惊讶的是,该方法调用似乎执行时没有崩溃。这种不寻常的行为提出了一个问题:这是 C 标准允许的还是仅仅是实现优化?解释在于 C 中方法调用的本质。当调用对象的方法时,编译器知道该对象的类型,因此知道要执行的方法的地址。...
    编程 发布于2024-11-06
  • 如何在Python中对列表进行减法?
    如何在Python中对列表进行减法?
    列表相减:计算差值Python 中的列表可以包含各种元素。为了对列表执行数学运算(例如减法),我们采用特定的方法或技术。让我们探讨如何从一个列表中减去另一个列表。使用列表理解进行逐元素减法一种方法是利用列表理解,它会迭代第一个列表并计算差异,同时保留原始顺序:[item for item in x ...
    编程 发布于2024-11-06
  • 如何在 Python 中检查生成器是否为空?
    如何在 Python 中检查生成器是否为空?
    检测空生成器初始化在Python中,生成器是一次产生一个值的迭代器。因此,从一开始就确定发电机是否为空可能是一个挑战。与列表或元组不同,生成器没有固有的长度或 isEmpty 方法。解决挑战为了解决这个问题,一种常见的方法是使用辅助函数查看生成器中的第一个值而不消耗它。如果 peek 函数返回 No...
    编程 发布于2024-11-06
  • ## 想从Python高效调用Java?探索 Py4J 作为 JPype 的替代品!
    ## 想从Python高效调用Java?探索 Py4J 作为 JPype 的替代品!
    从 Python 调用 Java:Py4J 作为 JPype 的替代品从 Python 调用 Java 代码有几个潜在的解决方案。其中一个选项 JPype 可能难以编译,并且由于缺乏最新版本而显得不活跃。然而,另一种解决方案是 Py4J,这是一个简单的库,提供了一个方便的接口,用于从 Python ...
    编程 发布于2024-11-06
  • 小Swoole数据库
    小Swoole数据库
    Small Swoole Db 2.3引入左连接: $selector = (new TableSelector('user')) ->leftJoin('post', 'messageOwner', 'message') ; $selector->where() -&g...
    编程 发布于2024-11-06
  • 如何使用汇编指令优化 __mm_add_epi32_inplace_purego 函数,以在位置总体计数操作中获得更好的性能?
    如何使用汇编指令优化 __mm_add_epi32_inplace_purego 函数,以在位置总体计数操作中获得更好的性能?
    使用程序集优化 __mm_add_epi32_inplace_purego此问题旨在优化 __mm_add_epi32_inplace_purego 函数的内部循环,该函数对字节数组执行位置填充计数。目标是通过利用汇编指令来提高性能。内部循环的原始 Go 实现: __mm_add_epi32_...
    编程 发布于2024-11-06
  • 使用 React Router 进行导航 React Js 第一部分 React 应用程序中的路由指南
    使用 React Router 进行导航 React Js 第一部分 React 应用程序中的路由指南
    欢迎回到我们的 React 系列!在之前的文章中,我们介绍了组件、状态、道具和事件处理等基本概念。现在,是时候使用 React Router 探索 React 应用程序中的路由了。路由允许您在应用程序内的不同视图或组件之间导航,从而创建无缝的用户体验?. 什么是 React 路由器?...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3