本文目录导读:

- 方案一:经典 Netflix 版 (Eureka + OpenFeign + Gateway)
- 方案二:Spring Cloud Alibaba 版 (Nacos + OpenFeign + Gateway)
- 关键组件说明
- 注意事项
这是一个非常实用的技术问题,Spring Cloud 是一个用于构建分布式系统(微服务)的工具集,它基于 Spring Boot。
要在一个 Java 案例中实现 Spring Cloud,通常需要搭建一套包含服务注册与发现、配置中心、远程调用、网关等核心组件的环境。
下面是一个从零开始、最简化的案例实现步骤,使用目前企业中最主流的组件组合(Spring Cloud Alibaba 或 Netflix 的 Spring Cloud 标准版)。
经典 Netflix 版 (Eureka + OpenFeign + Gateway)
这个案例假设你使用 Spring Boot 2.x 和 Spring Cloud Hoxton.SR12 版本。
创建父 Maven 工程 (SpringCloudDemo)
pom.xml关键配置:声明依赖管理和版本。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<properties>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建服务注册中心 (Eureka Server)
- 模块名:
eureka-server pom.xml关键依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.yml:server: port: 8761 spring: application: name: eureka-server eureka: client: register-with-eureka: false # 自己是注册中心,不注册自己 fetch-registry: false # 不拉取服务列表
- 启动类 (Application.java):
@SpringBootApplication @EnableEurekaServer // 开启注册中心服务 public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } - 验证: 启动后访问
http://localhost:8761
创建一个生产者服务 (Provider)
- 模块名:
user-service pom.xml关键依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
application.yml:server: port: 8081 spring: application: name: user-service # 服务名称,注册中心根据这个名字识别 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # 注册到哪个Eureka- 控制器 (UserController.java):
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/info/{id}") public String getUser(@PathVariable Long id) { return "User info: ID = " + id + ", from port: " + 8081; } } - 启动类: 添加
@EnableEurekaClient或@EnableDiscoveryClient。
创建消费者服务 + 远程调用 + 网关 (Consumer & Gateway)
-
模块名:
order-service -
pom.xml关键依赖:<!-- 服务发现 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 远程调用: OpenFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- 网关: Spring Cloud Gateway (替代Zuul) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
application.yml:server: port: 8082 spring: application: name: order-service cloud: gateway: routes: - id: user_route uri: lb://user-service # 负载均衡到user-service predicates: - Path=/user/** eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ -
创建 Feign 客户端 (UserClient.java):
@FeignClient(name = "user-service") // 调用user-service服务 public interface UserClient { @GetMapping("/user/info/{id}") String getUser(@PathVariable("id") Long id); } -
控制器 (OrderController.java):
@RestController @RequestMapping("/order") public class OrderController { @Autowired private UserClient userClient; @GetMapping("/create/{userId}") public String createOrder(@PathVariable Long userId) { // 内部通过Feign调用user-service String userInfo = userClient.getUser(userId); return "Order created, user detail: " + userInfo; } } -
启动类: 添加
@EnableFeignClients和@EnableDiscoveryClient。
测试整个链路
- 启动
EurekaServer(端口8761)。 - 启动
UserService(端口8081)。 - 启动
OrderService(端口8082,它会充当网关)。 - 访问网关地址:
http://localhost:8082/user/info/1(网关路由到 user-service)。 - 访问:
http://localhost:8082/order/create/1(order-service通过Feign调用user-service)。
Spring Cloud Alibaba 版 (Nacos + OpenFeign + Gateway)
如果你的项目是在国内或追求更流行的方案,Nacos 是首选(同时做注册中心和配置中心)。
修改依赖 (替换第一步的父pom)
<properties>
<spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
修改配置 (以 user-service 为例)
-
pom.xml依赖替换:<!-- 将 eureka-client 替换为 Nacos discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
application.yml配置修改:spring: application: name: user-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # Nacos 服务地址 (默认启动在8848) server: port: 8081 -
启动 Nacos Server: 下载 Nacos,解压后运行
startup.cmd -m standalone(Windows) 或sh startup.sh -m standalone(Linux/Mac)。 -
其余步骤: 网关、Feign、Controller 等代码与方案一完全一致,无需改动。 启动后,在 Nacos 控制台 (
http://localhost:8848/nacos) 即可看到服务列表。
关键组件说明
| 组件 | 作用 | 旧版本/替代方案 |
|---|---|---|
| Eureka / Nacos | 服务注册与发现 | Eureka (已经停更维护) / Nacos (推荐) / Consul |
| OpenFeign | 声明式远程HTTP调用 | RestTemplate + LoadBalancer |
| Spring Cloud Gateway | API网关:路由、鉴权、限流 | Zuul 1.x (已淘汰,非阻塞IO差) |
| Spring Cloud Config / Nacos | 配置中心 (本案例未涉及) | Apollo (携程) / Nacos Config |
注意事项
- 版本兼容性:Spring Cloud 版本必须严格对应 Spring Boot 版本,官方文档有版本对应表(如:Hoxton.SR12 对应 2.3.x,2021.0.x 对应 2.6.x 或 2.7.x)。
- 启动顺序:先启动注册中心(Eureka/Nacos),再启动其他微服务。
- 依赖冲突:若同时引入
spring-cloud-starter-netflix-eureka-client和 Ribbon(默认已内置),要注意负载均衡策略。 - Gateway 与 Feign 的区别:Gateway 是入口网关(路由、过滤外部请求),Feign 是服务间内部调用(内部HTTP RPC)。
通过上述步骤,你就完成了一个最基础的 Spring Cloud 微服务案例,实际工作中还会加入 Sentinel (熔断限流)、Sleuth (链路追踪) 等组件,但核心架构逻辑一致。