本项目基于Spring Cloud框架构建了一个简单而完整的微服务架构,包含服务注册与发现、服务提供者、服务消费者等核心组件。通过该项目可以了解微服务架构的基本工作原理和实现方式。
i/
├── ms-eureka-server/       # Eureka注册中心服务
├── ms-provider-user/       # 用户服务提供者
├── ms-consumer-order-ribbon/ # 订单服务消费者(使用Ribbon负载均衡)
└── pom.xml                 # 父级Maven配置文件
- Spring Boot: 2.3.2.RELEASE
- Spring Cloud: Hoxton.SR7
- Netflix Eureka: 服务注册与发现
- Netflix Ribbon: 客户端负载均衡
- Maven: 项目构建与依赖管理
- Java: 1.8+
功能:提供服务注册与发现功能,是整个微服务架构的核心组件。
配置:
- 端口:8761
- 关闭了自我注册功能(registerWithEureka: false)
- 关闭了从其他注册中心获取服务列表(fetchRegistry: false)
- 禁用了自我保护机制(enableSelfPreservation: false)
主要类:
- EurekaServerApplication: 应用启动类,使用- @EnableEurekaServer注解启用Eureka Server功能
功能:提供用户相关的API服务,作为服务提供者注册到Eureka。
配置:
- 端口:8001
- 服务名称:ms-provider-user
- 注册到Eureka注册中心
主要类:
- UserApplication: 应用启动类,使用- @EnableEurekaClient注解启用客户端功能
- User: 用户实体类
- UserController: REST控制器,提供用户查询接口- /user/{id}
提供的API:
- GET /user/{id}: 根据ID查询用户信息
功能:作为服务消费者,通过Ribbon负载均衡调用用户服务,并提供订单相关功能。
配置:
- 端口:8010
- 服务名称:ms-consumer-order-ribbon
- 配置了Ribbon的随机负载均衡策略(RandomRule)
主要类:
- OrderApplication: 应用启动类
- Order: 订单实体类
- User: 用户实体类(与服务提供者保持一致)
- RestTemplateConfig: 配置RestTemplate,使用- @LoadBalanced启用负载均衡
- OrderService: 业务逻辑层,调用用户服务
- OrderController: REST控制器,提供订单查询接口- /order/{id}
提供的API:
- GET /order/{id}: 查询订单信息(包含用户信息)
[订单服务] ───(Ribbon负载均衡)───> [用户服务]
      ↓              ↓
      └──────────────┴───────> [Eureka注册中心]
- JDK 1.8 或更高版本
- Maven 3.6+(已在项目中配置)
cd /root/i
mvn clean package -DskipTests注意:必须按照以下顺序启动服务
cd ms-eureka-server
注意:由于Java模块系统限制,启动时需要添加JVM参数以避免反射访问限制:
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED -jar target/ms-eureka-server-1.0-SNAPSHOT.jar启动成功后,可以访问 http://localhost:8761 查看Eureka管理控制台。
cd ../ms-provider-user
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED -jar target/ms-provider-user-1.0-SNAPSHOT.jarcd ../ms-consumer-order-ribbon
java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED -jar target/ms-consumer-order-ribbon-1.0-SNAPSHOT.jarcurl http://localhost:8001/user/1预期输出:
{"id":1,"username":"account1","name":"张三","age":20,"balance":100.0}curl http://localhost:8010/order/1预期输出:
{"id":1,"userId":1,"commodityCode":"P001","count":1,"money":100.0,"user":{"id":1,"username":"account1","name":"张三","age":20,"balance":100.0}}可以启动多个用户服务实例来演示Ribbon的负载均衡功能:
- 先启动一个用户服务实例(端口8001)
- 修改配置文件,使用不同端口(如8002),再启动一个实例
- 多次调用订单服务,可以观察到请求被随机分发到不同的用户服务实例
- 添加配置中心:引入Spring Cloud Config管理配置
- 添加网关:引入Spring Cloud Gateway作为API网关
- 添加断路器:引入Hystrix实现服务熔断和降级
- 添加链路追踪:引入Sleuth和Zipkin实现分布式链路追踪
- 数据库集成:将模拟数据替换为真实数据库
- 本项目使用的是模拟数据,实际生产环境需要连接真实数据库
- 所有服务都注册到同一个Eureka实例,实际生产环境建议使用Eureka集群
- 目前的Ribbon配置使用随机策略,可以根据需要调整为轮询、加权等其他策略
- 生产环境中建议启用Eureka的自我保护机制
- 服务无法注册到Eureka:检查网络连通性和Eureka地址配置,确保配置的端口与实际运行端口一致
- 服务调用失败:检查目标服务是否正常运行,以及RestTemplate配置是否正确
- 负载均衡不生效:确保@LoadBalanced注解已正确添加到RestTemplate配置
- 启动时出现反射访问错误:添加必要的JVM参数 --add-opens以解决Java模块系统限制
- 端口占用错误:使用 ss -tulpn | grep <端口号>查看并释放被占用的端口
作者: bufferhh 版本: 1.0.0 日期: 2025-10-21