环境:IDEA 2022+/JDK8/Maven3.6+、提前装好 Nacos(单机启动备用)
一、第一步:创建顶层父工程 cloud-parent
1. 新建项目
1、IDEA 首页 → New Project
2、左侧选择 Maven,不要勾选 Archetype,直接 Next
3、填写坐标:
GroupId:com.cloud
ArtifactId:cloud-parent
Version:1.0-SNAPSHOT
4、项目名称:cloud-parent,选择本地存放路径 → Finish
2. 修改父工程 pom.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cloud</groupId>
<artifactId>cloud-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>cloud-parent</name>
<description>SpringCloud父工程统一依赖管理</description>
<!-- 子模块 -->
<modules>
<module>cloud-common</module>
<module>cloud-user-service</module>
<module>cloud-order-service</module>
<module>cloud-nacos-gateway</module>
</modules>
<!-- 版本锁定 -->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.boot.version>2.7.15</spring.boot.version>
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
<spring.cloud.version>2021.0.1</spring.cloud.version>
</properties>
<!-- 统一依赖管理,子模块无需写版本 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot统一父依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud 核心依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud 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>
<!-- 公共依赖所有子模块继承 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<!-- 仓库配置 -->
<repositories>
<repository>
<id>aliyunmaven</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
3. Maven 刷新
右侧 Maven 面板 → 刷新按钮,无报错继续。
二、第二步:创建公共模块 cloud-common(底层依赖包)
1. 在父工程下新建 Module
1、左侧右键 cloud-parent → New → Module
2、选择 Maven,无骨架 Next
3、ArtifactId:cloud-common,GroupId、Version 继承父工程,Next
4、模块名称 cloud-common,存放目录自动在 cloud-parent 内 → Finish
2. 配置 cloud-common pom.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-parent</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
3. 编写统一返回类 Result
1、打开 cloud-common/src/main/java
2、新建包 com.cloud.common.result
3、创建 Result.java
java
package com.cloud.common.result;
import lombok.Data;
@Data
public class Result<T> {
private Integer code;
private String msg;
private T data;
public static <T> Result<T> success(T data) {
Result<T> r = new Result<>();
r.setCode(200);
r.setMsg("操作成功");
r.setData(data);
return r;
}
public static <T> Result<T> fail(Integer code, String msg) {
Result<T> r = new Result<>();
r.setCode(code);
r.setMsg(msg);
return r;
}
}
三、第三步:创建生产者 cloud-user-service
1. 父工程右键新建 Module
右键 cloud-parent → New → Module → Maven
ArtifactId:cloud-user-service → Finish
2. 修改 pom.xml
- parent 自动继承 cloud-parent
- 添加依赖:web、nacos 发现、feign、cloud-common
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-parent</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-user-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 缺少这个就会报你当前的错! -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.cloud</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
刷新 Maven
3. 配置 yml 文件
-
user 模块 resources 右键 New → YAML Configuration File → application.yml
XMLserver: port: 8081 spring: application: name: user-service cloud: nacos: discovery: server-addr: 127.0.0.1:88484. 创建启动类 + Controller
-
包:com.cloud
新建 UserApplication 启动类,添加 @SpringBootApplication @EnableDiscoveryClient
java
package com.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
新建 controller 包,UserController,编写测试接口
*
java
package com.cloud.controller;
import com.cloud.common.result.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/get/{id}")
public Result<String> getUser(@PathVariable Long id) {
return Result.success("用户信息:" + id);
}
}
四、第四步:创建消费者 cloud-order-service
1. 父工程新建 Module cloud-order-service
流程同上 user-service
2. pom.xml 依赖和 user 完全一致
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-parent</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-order-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 缺少这个就会报你当前的错! -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.cloud</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3. application.yml
XML
server:
port: 8082
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
4. 启动类
java
package com.cloud.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
5. Feign 远程调用接口
- 新建包 com.cloud.order.feign → UserFeign
java
package com.cloud.order.feign;
import com.cloud.common.result.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("user-service")////对应生产者服务名
public interface UserFeign {
@GetMapping("/user/get/{id}")
Result<String> getUser(@PathVariable("id") Long id);
}
6. OrderController
- 注入 UserFeign,编写创建订单接口
java
package com.cloud.order.controller;
import com.cloud.common.result.Result;
import com.cloud.order.feign.UserFeign;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/order")
public class OrderController {
@Resource
private UserFeign userFeign;
@GetMapping("/create/{uid}")
public Result<String> createOrder(@PathVariable Long uid) {
Result<String> user = userFeign.getUser(uid);
return Result.success("创建订单成功,关联用户:" + user.getData());
}
}
五、第五步:创建网关 cloud-nacos-gateway
1. 父工程新建 Module cloud-nacos-gateway
2. pom.xml 依赖(注意:不能引入 web!冲突)
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-parent</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-nacos-gateway</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.cloud</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3. application.yml 路由配置
XML
server:
port: 80
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: user-route
uri: lb://user-service
predicates:
- Path=/user/**
- id: order-route
uri: lb://order-service
predicates:
- Path=/order/**
4. 网关启动类 GatewayApplication
java
package com.cloud.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
刷新 Maven,此时左侧完整工程结构全部出现。
*
六、IDEA 关键配置(必做,否则报错)
1. JDK 统一配置
- File → Project Structure
- Project:SDK 选 JDK8,language level 8
- Modules:所有模块 language level 统一 8
- File → Settings → Build,Execution,Deployment → Build Tools → Maven
- Maven home path:本地 maven
- Runner → JRE:选择 JDK8
2. Lombok 开启注解支持(否则找不到 get/set)
Settings → Build → Compiler → Annotation Processors
勾选:Enable annotation processing → Apply
3. Maven 阿里云镜像加速(避免依赖下载失败)
打开 maven 安装目录 conf/settings.xml,添加镜像
XML
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
七、启动与测试完整流程
前置:启动 Nacos
进入 nacos bin 目录,windows 执行 startup.cmd -m standalone
访问 http://localhost:8848/nacos 账号密码 nacos/nacos
IDEA 启动顺序
cloud-user-service(8081)
运行 UserApplication main 方法
cloud-order-service(8082)
运行 OrderApplication
cloud-nacos-gateway(80)
运行 GatewayApplication
测试地址(全部走网关 80 端口)
查询用户:http://localhost/user/get/1
创建订单:http://localhost/order/create/1
如果上面有报错,分开分步测试验证,方便问题
测试 1:绕过网关,直接访问生产者,验证生产者正常
访问:http://localhost:8081/user/get/1
返回正常数据 → user 服务没问题
404 / 报错 → user 服务本身异常,先修好
测试 2:绕过网关,直接访问消费者,验证 Feign 调用
访问:http://localhost:8082/order/create/1
503 → Feign 找不到 user 服务,聚焦 nacos 注册、loadbalancer 依赖
正常返回 → 问题只在网关路由配置
测试 3:走网关访问
http://localhost/order/create/1
只有前两步正常,网关才会正常转发
订单测试:
