Skip to content

papermooth/my-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spring Cloud 微服务架构项目

项目概述

本项目基于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+

各服务说明

1. ms-eureka-server(Eureka注册中心)

功能:提供服务注册与发现功能,是整个微服务架构的核心组件。

配置

  • 端口:8761
  • 关闭了自我注册功能(registerWithEureka: false)
  • 关闭了从其他注册中心获取服务列表(fetchRegistry: false)
  • 禁用了自我保护机制(enableSelfPreservation: false)

主要类

  • EurekaServerApplication: 应用启动类,使用@EnableEurekaServer注解启用Eureka Server功能

2. ms-provider-user(用户服务提供者)

功能:提供用户相关的API服务,作为服务提供者注册到Eureka。

配置

  • 端口:8001
  • 服务名称:ms-provider-user
  • 注册到Eureka注册中心

主要类

  • UserApplication: 应用启动类,使用@EnableEurekaClient注解启用客户端功能
  • User: 用户实体类
  • UserController: REST控制器,提供用户查询接口 /user/{id}

提供的API

  • GET /user/{id}: 根据ID查询用户信息

3. ms-consumer-order-ribbon(订单服务消费者)

功能:作为服务消费者,通过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注册中心]

快速开始

1. 环境要求

  • JDK 1.8 或更高版本
  • Maven 3.6+(已在项目中配置)

2. 构建项目

cd /root/i
mvn clean package -DskipTests

3. 启动服务

注意:必须按照以下顺序启动服务

3.1 启动Eureka注册中心

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管理控制台。

3.2 启动用户服务

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.jar

3.3 启动订单服务

cd ../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.jar

4. 测试服务

4.1 测试用户服务

curl http://localhost:8001/user/1

预期输出:

{"id":1,"username":"account1","name":"张三","age":20,"balance":100.0}

4.2 测试订单服务

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的负载均衡功能:

  1. 先启动一个用户服务实例(端口8001)
  2. 修改配置文件,使用不同端口(如8002),再启动一个实例
  3. 多次调用订单服务,可以观察到请求被随机分发到不同的用户服务实例

项目扩展建议

  1. 添加配置中心:引入Spring Cloud Config管理配置
  2. 添加网关:引入Spring Cloud Gateway作为API网关
  3. 添加断路器:引入Hystrix实现服务熔断和降级
  4. 添加链路追踪:引入Sleuth和Zipkin实现分布式链路追踪
  5. 数据库集成:将模拟数据替换为真实数据库

注意事项

  1. 本项目使用的是模拟数据,实际生产环境需要连接真实数据库
  2. 所有服务都注册到同一个Eureka实例,实际生产环境建议使用Eureka集群
  3. 目前的Ribbon配置使用随机策略,可以根据需要调整为轮询、加权等其他策略
  4. 生产环境中建议启用Eureka的自我保护机制

故障排查

  1. 服务无法注册到Eureka:检查网络连通性和Eureka地址配置,确保配置的端口与实际运行端口一致
  2. 服务调用失败:检查目标服务是否正常运行,以及RestTemplate配置是否正确
  3. 负载均衡不生效:确保@LoadBalanced注解已正确添加到RestTemplate配置
  4. 启动时出现反射访问错误:添加必要的JVM参数 --add-opens 以解决Java模块系统限制
  5. 端口占用错误:使用 ss -tulpn | grep <端口号> 查看并释放被占用的端口

作者: bufferhh 版本: 1.0.0 日期: 2025-10-21

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages