本项目是一个基于 Spring Cloud 的微服务学习项目,主要演示了如何使用 Spring Cloud Feign 实现服务间的声明式 REST 调用。项目包含三个模块:order-service(订单服务)、product-service(商品服务)和 product-api(商品服务接口)。
本项目通过模拟电商场景中的订单和商品两个核心服务,展示了微服务架构下服务之间如何进行高效、解耦的通信。order-service 在处理订单时,需要查询 product-service 获取商品信息。这个过程通过 Spring Cloud Feign 实现,避免了使用传统的 RestTemplate 硬编码服务地址,使代码更简洁、易于维护。
- 核心框架: Spring Boot 3.1.6
- 微服务框架: Spring Cloud 2022.0.3
- 服务治理: Spring Cloud Alibaba Nacos 2022.0.0.0-RC2 (用于服务注册、发现和配置管理)
- 声明式 REST 客户端: Spring Cloud OpenFeign
- ORM: MyBatis
- 数据库: MySQL
- 构建工具: Maven
- 开发环境: JDK 17
product-api 模块是商品服务的接口定义模块,它包含了 ProductInfo 模型和 ProductApi 接口。这个模块被 order-service 和 product-service 共同依赖,实现了服务接口与实现的分离,是 Feign 实现声明式调用的基础。
主要内容:
ProductInfo.java: 商品信息的数据模型。ProductApi.java: 定义了商品服务的相关接口,如根据商品 ID 获取商品信息。
product-service 是商品服务的提供者,它实现了 product-api 中定义的接口。该服务启动后会将自己注册到 Nacos 服务中心。
主要功能:
ProductController.java: 实现了ProductApi接口,提供了查询商品信息的 HTTP 端点。ProductService.java和ProductMapper.java: 负责处理业务逻辑和数据库操作。application.yml: 配置了服务名称product-service、端口号以及 Nacos 注册中心地址。
order-service 是订单服务,是服务消费者。它通过 Feign 客户端调用 product-service 提供的接口来获取商品信息。
主要功能:
OrderController.java: 提供查询订单信息的接口。在查询订单时,会调用OrderService获取完整的订单信息(包含商品信息)。OrderService.java: 核心业务逻辑。它通过注入的ProductApiFeign 客户端来远程调用product-service的接口。ProductApi.java(inorder-service): 这是一个继承了product-api模块中ProductApi接口的 Feign 客户端接口。通过@FeignClient注解指定了要调用的服务名称 (product-service)。OrderServiceApplication.java: 启动类上添加了@EnableFeignClients注解,以启用 Feign 功能。
- Nacos Discovery:
order-service和product-service都引入了spring-cloud-starter-alibaba-nacos-discovery依赖,并在配置文件中指定了 Nacos 服务器地址,从而实现了服务的自动注册和发现。
- OpenFeign:
order-service通过@FeignClient注解定义了一个ProductApi接口的实现,该接口的代理类由 Feign 自动创建。当调用这个接口的方法时,Feign 会自动构造 HTTP 请求,并发送到 Nacos 中注册的product-service实例。这种方式使得远程调用像调用本地方法一样简单。
- Spring Cloud LoadBalancer: Feign 内部集成了负载均衡器。当
product-service有多个实例时,order-service发出的请求会通过 Spring Cloud LoadBalancer 自动地以轮询等策略分发到不同的实例上,提高了系统的可用性和伸缩性。在配置文件中通过spring.cloud.loadbalancer.nacos.enabled: true开启对 Nacos 的负载均衡支持。
pom.xml:- 父
pom.xml文件中通过dependencyManagement统一管理了 Spring Cloud 和 Spring Cloud Alibaba 的版本,确保了版本兼容性。 order-service引入了spring-cloud-starter-openfeign和product-api的依赖。product-service也引入了product-api依赖。
- 父
application.yml:- 各个服务通过
spring.application.name来命名,这是服务注册到 Nacos 的唯一标识。 - 通过
spring.cloud.nacos.discovery.server-addr配置 Nacos 服务器地址。
- 各个服务通过
- 多环境配置:
- 项目使用了
dev和prod两种环境配置,通过 Maven Profiles (<profile.name>) 进行切换,实现了不同环境的数据库和 Nacos 地址的隔离。
- 项目使用了
- 环境准备:
- 启动 Nacos Server。
- 启动 MySQL 数据库,并创建相应的数据库和表 (
cloud_order和cloud_product)。
- 修改配置:
- 在
order-service和product-service的application-dev.yml(或prod) 文件中,修改数据库和 Nacos 的连接信息。
- 在
- 启动服务:
- 依次启动
product-service和order-service。
- 依次启动
- 接口测试:
- 访问
order-service提供的接口(如http://localhost:8080/order/{orderId}),即可看到订单信息以及通过 Feign 调用product-service获取到的商品信息。
- 访问