这是有关微服务体系结构基础的系列文章的第一部分。
在其中,您将熟悉微服务的概念,并学习如何使用Spring Boot和Spring Cloud创建微服务。
本指南将帮助您学习微服务架构的基础。 我们还将开始研究Spring Boot的基本微服务实现。
我们将创建一对微服务,并使它们使用Eureka(Eureka命名服务器)和Ribbon名称服务器相互通信,以平衡客户端的负载。
本文是Spring Boot Microservices系列的一部分:
你会学
- 什么是整体?
- 什么是微服务?
- 微服务有什么问题?
- Spring Boot和Spring Cloud如何使微服务更易于开发?
- 如何使用功能区实现客户端负载平衡?
- 如何实现名称服务器(Eureka命名服务器)?
- 如何将微服务与名称服务器和功能区连接?
资源总览
在本教程中,我们将为学生创建一个资源,该资源使用适当的URI和HTTP方法提供三种服务:
- 获取所有学生的列表- @GetMapping(“ /学生”)
- 获取有关特定学生的信息- @GetMapping(“ / students / {id}”)
- 删除学生信息- @DeleteMapping(“ /学生/ {id}”)
- 创建一个新的学生条目- @PostMapping(“ /学生”)
- 更新学生信息 - @PutMapping(“ /学生/ {id}”)
微服务概述-大图
在本系列文章中,我们将创建两个微服务:
如果您不清楚某些事情,请不要担心。 这个想法是在我们开始开发和逐步创建微服务之前给您一个大的图景。
外汇服务
外汇服务(FS,Forex Service)是服务提供商。 它提供各种货币的货币汇率。 让我们假设他与Forex Exchange通信并提供货币之间交换的当前值。 请求和响应的示例如下所示:
GET to http:
{ id: 10002, from: "EUR", to: "INR", conversionMultiple: 75, port: 8000, }
对以上请求的响应是欧元对印度卢比的汇率。 ConversionMultiple的答案是75。
稍后我们将讨论端口字段。
货币兑换服务
货币转换服务(CCS)可以将许多货币转换为另一种货币。 它使用外汇服务来获取当前货币兑换值。 CCS是服务的消费者。 请求和响应的示例如下所示:
GET to http:
{ id: 10002, from: "EUR", to: "INR", conversionMultiple: 75, quantity: 10000, totalCalculatedAmount: 750000, port: 8000, }
上面的请求使您可以确定10,000欧元的印度卢比价值。
TotalCalculatedAmount为750,000 INR。 下图显示了CCS和FS之间的关系。

Eureka命名服务器和功能区
根据负载量,我们可能会拥有货币兑换服务和外汇服务的多个副本。

每个服务的实例数量可以随时间变化。 下图显示了一个示例,其中创建了5个Forex服务实例。

在上述情况下应该发生的是,负载应在这5个实例之间平均分配。

在本系列文章中,我们将使用Ribbon进行负载平衡,并使用Eureka名称服务器来注册所有微服务。

什么是单片应用程序?
您是否曾经在项目中工作过...
- 每几个月一次生产(投入生产)的产品
- 具有广泛的特性和功能。
- 由50多人组成的团队在其中工作
- 调试问题很大的地方
- 在几乎不可能引入新技术和新工艺的地方
这些是整体应用的典型特征。
单片应用程序通常非常庞大-超过100,000行代码。 在某些情况下,甚至超过一百万行代码。
整体结构的特征如下:
典型的问题包括:
- 可伸缩性问题
- 采用新技术
- 新流程-敏捷?
- 难以自动化测试
- 很难适应当前的开发实践
- 难以适应项目的快速发展
微服务
微服务架构已经发展为解决单片架构的可扩展性和创新挑战。 对于微服务,建议了许多定义。
可以协同工作的小型独立服务-Sam Newman
以一组小型服务的形式开发一个单独的应用程序,每个服务都在自己的进程中工作并与轻量级机制(通常是HTTP资源API)交互。 这些服务建立在商机之上,可以使用全自动部署机制独立部署。 这些服务的最低级别的集中管理可以用不同的编程语言编写,也可以使用不同的存储技术-James Lewis和Martin Fowler
尽管对微服务没有统一的定义,但是有几个重要特征:
- REST-基于RESTful资源构建。 服务之间的通信可以基于事件或HTTP协议。
- 精心挑选的小型可部署块-有限的上下文
- 云功能-动态扩展
微服务架构是什么样的?
这就是整体外观。 一应俱全的应用程序。

使用微服务架构进行开发时,该应用程序看起来像是同一应用程序。

微服务体系结构包括几个精心设计的小型消息传递组件。

微服务的好处
优点:
- 使用新技术和适应过程变得更加容易。 您可以通过我们将创建的新微服务尝试新技术。
- 更快的发布周期
- 云扩展
微服务架构问题
尽管开发一些小的组件似乎很容易,但是与微服务体系结构相关的许多固有的困难。
让我们看一些问题:
- 需要快速设置 :您不能花一个月的时间来设置每个微服务。 您应该能够快速创建微服务。
- 自动化 :由于有许多较小的组件而不是整体组件,因此您需要使所有组件(组装,部署,监视等)自动化。
- 可见性 :您现在拥有几个用于部署和维护的小组件。 也许100或1000个组件。 您应该能够自动跟踪和发现问题。 您需要所有组件的出色可见性。
- 有限的上下文 :定义微服务的边界并非易事。 域设计的有限上下文是一个很好的起点。 您对域的了解会随着时间的推移而发展。 您需要确保微服务的边界在不断发展。
- 配置管理 :您需要维护不同环境中数百个组件的配置。 您将需要一个配置管理解决方案
- 动态增加和减少 :只有在您的应用程序可以轻松地在云中扩展的情况下,微服务的好处才会实现。
- 卡片组 :如果呼叫链底部的微服务失败,则可能会影响所有其他微服务。 微服务必须是容错的。
- 调试 :出现问题需要解决时,您可能需要检查不同组件中的多个服务。 需要集中的日志记录和仪表板来促进调试问题。
- 一致性 :您不能拥有解决相同问题的多种工具。 尽管推动创新很重要,但对用于实现/部署/监视微服务的语言,平台,技术和工具的分散管理也很重要。
微服务架构解决方案
春季靴
Spring Boot允许您快速创建现成的应用程序,并提供以下非功能性功能:
- 嵌入式服务器(易于使用容器进行部署)
- 指标监控
- 健康监测
- 外部配置
春云
Spring Cloud为您的微服务提供云激活解决方案。 它使用并基于Netflix(Netflix OSS)创建的一些云解决方案。
重要的Spring Cloud模块
-尤里卡名称服务器
-功能区(客户端上的负载平衡)
-Feign(简化了REST客户端的开发)
-分布式Zipkin跟踪
-Netflix API网关
- 使用Spring Cloud Config Server进行配置管理
- Hystrix的容错能力
在本系列文章中,我们将创建两个微服务:
注意事项 佩雷夫 作者进一步部分重复了所讲的内容。 保存的原始版本(不删除重放)
下图显示了CCS和FS之间的关系。 我们将在这两个组件之间建立连接。

我们希望能够动态增加和减少每个服务的实例数量。

每个服务的实例数量可以随时间变化。 下图显示了一个示例,其中创建了5个Forex服务实例。

实现用于动态放大和缩小的解决方案需要回答两个问题:
- 货币兑换服务(CCS)如何找出活跃的外汇服务(FS)实例数量?
- 货币转换服务(CCS)如何在活动实例之间分配负载?
由于我们希望它是动态的,因此我们无法将FS服务中的URL硬编码到CCS。 这就是为什么我们要引入名称服务器的原因。
所有组件实例(CCS和FS)都在Eureka名称服务器上注册。 当FS需要调用CCS时,它将向Eureka Naming Server请求有关活动实例的信息。 我们将使用功能区来平衡不同FS实例之间的客户端负载。
下面是从CCS向FS请求时将发生的情况的高级序列图。

本系列文章的进一步内容:
- 创建一个外汇微服务。 我们将基于Spring Boot Starter Web和Spring Boot Started JPA创建一个简单的REST服务。 我们将使用Hibernate来实现JPA并连接到H2数据库。
- 创建CCS货币转换服务。 我们将使用Feign创建一个简单的REST服务,以调用Forex微服务。
- 使用功能区进行负载平衡。
- 实施Eureka命名服务,并通过Eureka连接FS和CCS。