前言
本指南将帮助您学习微服务和微服务架构的基础知识。 我们也将开始着眼于使用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 | { |
上面的请求是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 | { |
上面的请求是计算10000 EUR(欧元)兑换INR(印度卢比)的货币的价值。兑换金额为750000 INR。
下图显示了CCS和FS之间的通信。
Eureka服务治理 和 Ribbon
基于负载,我们可以有多个货币转换(CCS)服务
和多个外汇服务(FS)
每个服务的实例数量可能会随时间而变化(动态扩展和缩减每个服务的实例数量)。下图显示了有5个外汇服务实例的特定实例。
在上述情况下需要发生的是负载应该在这5个实例之间均匀分配。
在本系列文章中,我们将使用Ribbon进行负载均衡,并且使用Eureka来注册所有的微服务。
实现服务的动态扩展和缩减有如下两个问题:
- 货币转换服务(CCS)如何知道有多少个外汇服务(FS)处于活动状态?
- 货币转换服务(CCS)如何在多个外汇服务(FS)活动实例之间分配负载?
因为我们希望这是动态的,所以我们不能在CSS中编码FS的URL。这就是我们为什么需要引入一个服务的注册和发现机制。
组件的所有实例(CCS和FS)都向Eureka命名服务器注册。当CSS需要调用FS时,它会向Eureka命名服务器询问活动实例。我们将使用Ribbon在FS不同实例之间进行客户端负载均衡。
下图显示了从CCS到FS请求时的序列图:
本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)以及货币转换服务:
从上图可以看到看到一个货币转换服务(CCS)实例和两个外汇服务(FS)微服务实例在Eureka命名服务器上注册。CCS的请求将通过Eureka由Ribbon分发给外汇服务(FS)的两个实例。
请求1:
Get to http://localhost:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000
请求2:
Get to http://localhost:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000
我们可以看到两个响应中的端口号是不同的。
代码已上传 GitHub