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

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

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

整体架构

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

  • 我们将应用程序打包为 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]删除
最新教程 更多>
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-07-01
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-07-01
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-07-01
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-07-01
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-07-01
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-01
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-07-01
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-07-01
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-01
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-07-01
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-07-01
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-07-01
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-01
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-07-01
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-07-01

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

Copyright© 2022 湘ICP备2022001581号-3