SpringCloud微服务示例

前言

本指南将帮助您学习微服务和微服务架构的基础知识。 我们也将开始着眼于使用Spring Cloud的微服务的基本实现。

我们将创建一些服务,并使用Eureka实现服务治理和Ribbon来实现客户端负载均衡。

在本系列文章中,我们将创建两个微服务:

  • Forex Service(外汇服务) - 简称为FS
  • Currency Conversion Service(货币转换服务) - 简称为CCS

外汇服务 Forex Service

外汇服务(Forex Service)是服务提供商。它提供各种货币的货币兑换值。我们假设它与外汇交易所通信并提供货币之间当前转换价值。

示例请求和响应如下所示:

GET to http://localhost:8000/currency-exchange/from/EUR/to/INR

1
2
3
4
5
6
7
{
id: 10002,
from: "EUR",
to: "INR",
conversionMultiple: 75,
port: 8000
}

上面的请求是EUR(欧元)兑换INR(印度卢比)的货币交换值。在响应中,转换倍数为75。

货币转换服务 Currency Conversion Service

货币兑换服务(Currency Conversion Service 简称CCS)可以将一种货币转换为另一种货币。它使用外汇服务获取当前货币兑换值。CCS是服务消费者。

示例请求和响应如下所示:

GET to http://localhost:8100/currency-converter/from/EUR/to/INR/quantity/10000

1
2
3
4
5
6
7
8
9
{
id: 10002,
from: "EUR",
to: "INR",
conversionMultiple: 75,
quantity: 10000,
totalCalculatedAmount: 750000,
port: 8000
}

上面的请求是计算10000 EUR(欧元)兑换INR(印度卢比)的货币的价值。兑换金额为750000 INR。

下图显示了CCS和FS之间的通信。

image

Eureka服务治理 和 Ribbon

基于负载,我们可以有多个货币转换(CCS)服务

image

和多个外汇服务(FS)

image

每个服务的实例数量可能会随时间而变化(动态扩展和缩减每个服务的实例数量)。下图显示了有5个外汇服务实例的特定实例。

image

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

image

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

实现服务的动态扩展和缩减有如下两个问题:

  • 货币转换服务(CCS)如何知道有多少个外汇服务(FS)处于活动状态?
  • 货币转换服务(CCS)如何在多个外汇服务(FS)活动实例之间分配负载?

因为我们希望这是动态的,所以我们不能在CSS中编码FS的URL。这就是我们为什么需要引入一个服务的注册和发现机制。

组件的所有实例(CCS和FS)都向Eureka命名服务器注册。当CSS需要调用FS时,它会向Eureka命名服务器询问活动实例。我们将使用Ribbon在FS不同实例之间进行客户端负载均衡。

下图显示了从CCS到FS请求时的序列图:

image

本Demo项目包括以下内容:

  • 创建一个外汇服务(FS) - 我们将基于Spring Boot Starter Web 和 Spring Boot Started JPA 创建一个简单的rest service。我们将使用JPA并连接到H2数据库。
  • 创建货币转换服务(CCS) - 我们将使用Feign创建一个简单的rest service来调用外汇服务(FS)
  • 使用Ribbon实现负载均衡
  • 使用Eureka实现服务注册和发现

测试

依次启动 Eureka 服务(spring-cloud-microservice-eureka)、两个外汇服务(springcloud-microservice-forex-servcie,端口分别是:8000,8001)以及货币转换服务:

image

从上图可以看到看到一个货币转换服务(CCS)实例和两个外汇服务(FS)微服务实例在Eureka命名服务器上注册。CCS的请求将通过Eureka由Ribbon分发给外汇服务(FS)的两个实例。

请求1:
Get to http://localhost:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000

image

请求2:
Get to http://localhost:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000

image

我们可以看到两个响应中的端口号是不同的。

代码已上传 GitHub