## 一、配置依赖 #### 1、创建项目 创建一个Spring Boot Gradle 3.5.9 父项目,起步依赖无需选择,构建成功后删除`src`目录  #### 2、Cloud版本对照 截至目前SpringBoot版本,SpringCloud版本对照:[Spring Cloud](https://spring.io/projects/spring-cloud#overview)  SpringCouldAlibaba版本一般与SpringCloud版本号一致:[spring-cloud-alibaba/README-zh.md](https://github.com/alibaba/spring-cloud-alibaba/blob/2025.1.x/README-zh.md)  #### 3、依赖管理 在`build.gradle`中添加 ```groovy bootJar { enabled = false } jar { enabled = false } ext { set('springCloudVersion', "2025.0.0") set('springCloudAlibabaVersion', "2025.0.0.0") } repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } subprojects { apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = "cn.doooog" version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" } } } ``` 完整的示例 ```groovy plugins { id 'java' id 'org.springframework.boot' version '3.5.9' id 'io.spring.dependency-management' version '1.1.7' } group = 'cn.doooog' version = '0.0.1-SNAPSHOT' description = 'SpringCloudAlibaba' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } bootJar { enabled = false } jar { enabled = false } ext { set('springCloudVersion', "2025.0.0") set('springCloudAlibabaVersion', "2025.0.0.0") } repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } subprojects { apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = "cn.doooog" version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" } } } ``` ## 二、环境搭建 #### 1、下载Nacos 下载地址:[Releases · alibaba/nacos](https://github.com/alibaba/nacos/releases) #### 2、身份验证 ##### 开发环境 禁用身份验证,找到`nacos/config/application.properties`  将这三项赋值为`flase`否则会启动失败 ##### 生产环境 生成256位JWT密钥 ```bash # Winodws # 使用PowerShell生成64位Base64密钥 powershell -Command "[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((New-Guid).ToString() + (New-Guid).ToString()))" # Linux # 生成64位随机Base64密钥 openssl rand -base64 64 ``` 改成如下配置 ```properties # 服务器身份标识 nacos.core.auth.server.identity.key=serverIdentity nacos.core.auth.server.identity.value=securityServerIdentityKey # JWT令牌密钥(必须是Base64编码且长度≥32字节) nacos.core.auth.plugin.nacos.token.secret.key=上面生成的密钥 # 启用认证 nacos.core.auth.enabled=true nacos.core.auth.system.type=nacos nacos.core.auth.caching.enabled=true # 如果使用内置数据库,还需要配置 nacos.core.auth.enable.userAgentAuthWhite=false nacos.core.auth.server.identity.value=securityServerIdentityKey ``` #### 3、启动 设置完成后进入`nacos/bin`文件夹,执行启动命令: ```bash # Linux sh startup.sh -m standalone # Ubuntu bash startup.sh -m standalone # Windows ./startup.cmd -m standalone ```  #### 4、访问Nacos http://localhost:8080/  ## 三、测试数据 #### 1、建表 ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS order_db CHARACTER SET utf8mb4; USE order_db; -- 创建订单表 CREATE TABLE `order` ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', order_no VARCHAR(64) NOT NULL UNIQUE COMMENT '订单编号', user_id BIGINT NOT NULL COMMENT '用户ID', amount DECIMAL(10,2) NOT NULL COMMENT '订单金额', status TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态:1-待支付,2-已支付,3-已完成,4-已取消', product_name VARCHAR(100) NOT NULL COMMENT '商品名称', quantity INT NOT NULL COMMENT '商品数量', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', KEY idx_user_id (user_id), KEY idx_create_time (create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; ``` #### 2、插入数据 ```sql INSERT INTO `order` (order_no, user_id, amount, status, product_name, quantity) VALUES ('ORDER202501060001', 1001, 2999.00, 2, 'iPhone 15 Pro', 1), ('ORDER202501060002', 1002, 1599.00, 1, '小米14', 1), ('ORDER202501060003', 1001, 899.00, 3, 'AirPods Pro', 2), ('ORDER202501060004', 1003, 5999.00, 2, 'MacBook Air', 1), ('ORDER202501060005', 1002, 199.00, 4, '手机壳', 1), ('ORDER202501060006', 1003, 1299.00, 3, 'iPad Air', 1), ('ORDER202501060007', 1001, 399.00, 2, 'Apple Watch', 1), ('ORDER202501060008', 1004, 799.00, 1, '三星耳机', 1), ('ORDER202501060009', 1004, 4599.00, 3, '华为Mate 60', 1), ('ORDER202501060010', 1002, 299.00, 2, '充电宝', 3); ``` ## 四、创建Common模块 #### 1、创建模块  #### 2、配置依赖 修改`build.gradle`文件 ```groovy group = 'cn.doooog' version = '0.0.1-SNAPSHOT' // 不作为SpringBoot应用启动 bootJar { enabled = false } // 打包成Jar包以便其他模块引用 jar { enabled = true } dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // MyBatis-Plus 注解支持 compileOnly 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.9' // Lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' } test { useJUnitPlatform() } ``` #### 3、持久层对象 创建`cn.doooog.common.po.Order.java`类 ```java import com.baomidou.mybatisplus.annotation.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data @AllArgsConstructor @NoArgsConstructor @TableName("`order`") public class Order { @TableId(type = IdType.AUTO) private Long id; private String orderNo; private Long userId; private Double amount; private Integer status; private String productName; private Integer quantity; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } ``` #### 4、返回数据格式对象 创建`vo/Result.java` ```java import lombok.Data; import java.io.Serializable; @Data public class Result implements Serializable { private Integer code; private String message; private T data; public static Result success(T data) { Result result = new Result<>(); result.setCode(200); result.setMessage("success"); result.setData(data); return result; } public static Result error(String message) { Result result = new Result<>(); result.setCode(500); result.setMessage(message); return result; } } ``` ## 五、创建Service模块 #### 1、创建模块  #### 2、配置依赖 修改`build.gradle`文件 ```groovy group = 'cn.doooog' version = '0.0.1-SNAPSHOT' bootJar { enabled = true } jar { enabled = true } dependencies { implementation project(':order-common') // 上面创建的order-common模块 implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config' implementation 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.9' implementation 'com.mysql:mysql-connector-j:9.3.0' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() } ``` #### 3、配置模块 在`rescource`下创建配置文件`application.yml` ```yaml server: port: 9001 spring: application: name: order-service config: import: optional:nacos:order-service.yaml # 可选的Nacos动态配置 cloud: nacos: discovery: # 服务发现端口 server-addr: localhost:8848 config: # 服务配置端口 server-addr: localhost:8848 file-extension: yaml datasource: url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 ``` #### 4、创建启动类 创建`cn.doooog.service.OrderServiceApplication.java` ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient @MapperScan("cn.doooog.service.mapper") public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } } ``` #### 5、数据层 创建`mapper.OrderMapper.java`接口 ```java import cn.doooog.common.po.Order; // 上面创建的order-common模块 import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface OrderMapper extends BaseMapper { } ``` #### 6、服务层 创建`service.OrderService.java` ```java import cn.doooog.common.po.Order; import cn.doooog.common.vo.Result; import cn.doooog.service.mapper.OrderMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.stereotype.Service; import java.util.List; @Service public class OrderService { private final OrderMapper orderMapper; public OrderService(OrderMapper orderMapper) { this.orderMapper = orderMapper; } public Result getOrderByNo(String orderNo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("order_no", orderNo); Order order = orderMapper.selectOne(wrapper); return Result.success(order); } public Result> getOrdersByUserId(Long userId) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("user_id", userId); List orders = orderMapper.selectList(wrapper); return Result.success(orders); } public Result> getAllOrders() { List orders = orderMapper.selectList(null); return Result.success(orders); } } ``` #### 7、控制层 创建`controller.OrderController.java` ```java import cn.doooog.common.vo.Result; import cn.doooog.service.service.OrderService; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/orders") public class OrderController { private final OrderService orderService; public OrderController(OrderService orderService) { this.orderService = orderService; } @GetMapping("/{orderNo}") public Result> getOrderByNo(@PathVariable String orderNo) { return orderService.getOrderByNo(orderNo); } @GetMapping("/user/{userId}") public Result> getOrdersByUserId(@PathVariable Long userId) { return orderService.getOrdersByUserId(userId); } @GetMapping public Result> getAllOrders() { return orderService.getAllOrders(); } } ``` ## 六、创建Client模块 #### 1、创建模块  #### 2、配置依赖 修改`build.gradle`文件 ```groovy group = 'cn.doooog' version = '0.0.1-SNAPSHOT' bootJar { enabled = true } jar { enabled = true } dependencies { implementation project(':order-common') implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer' implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'io.projectreactor:reactor-core' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config' } test { useJUnitPlatform() } ``` #### 3、配置模块 在`rescource`下创建配置文件`application.yml` ```yaml server: port: 9002 spring: application: name: order-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml config: import: optional:nacos:order-client.yaml ``` #### 4、创建启动类 创建`cn.doooog.client.OrderClientApplication.java` ```java 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(basePackages = "cn.doooog.client.client") public class OrderClientApplication { public static void main(String[] args) { SpringApplication.run(OrderClientApplication.class, args); } } ``` #### 5、Feign接口 创建`client.OrderClient.java` ```java import cn.doooog.common.vo.Result; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name = "order-service", path = "/api/orders") public interface OrderClient { @GetMapping("/{orderNo}") Result getOrderByNo(@PathVariable String orderNo); @GetMapping("/user/{userId}") Result getOrdersByUserId(@PathVariable Long userId); } ``` #### 6、控制层 创建`controller.ClientController.java` ```java import cn.doooog.client.client.OrderClient; import cn.doooog.common.vo.Result; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.*; @RefreshScope @RestController @RequestMapping("/api/client") public class ClientController { private final OrderClient orderClient; public ClientController(OrderClient orderClient) { this.orderClient = orderClient; } @GetMapping("/order/{orderNo}") public Result getOrderByNo(@PathVariable String orderNo) { return orderClient.getOrderByNo(orderNo); } @GetMapping("/order/user/{userId}") public Result getOrdersByUserId(@PathVariable Long userId) { return orderClient.getOrdersByUserId(userId); } @GetMapping("/health") public Result health() { return Result.success("order-client service is running"); } } ``` ## 七、运行测试 #### 1、运行服务端和客户端  在Nacos后台也可以看到  #### 2、访问测试 直接通过服务端查询 [localhost:9001/api/orders/ORDER202501060001](http://localhost:9001/api/orders/ORDER202501060001)  通过客户端查询 [localhost:9002/api/client/order/ORDER202501060001](http://localhost:9002/api/client/order/ORDER202501060001)  只要是端口不同,多个相同名称的服务端会均衡负载,与SpringCloud相同。 Loading... ## 一、配置依赖 #### 1、创建项目 创建一个Spring Boot Gradle 3.5.9 父项目,起步依赖无需选择,构建成功后删除`src`目录  #### 2、Cloud版本对照 截至目前SpringBoot版本,SpringCloud版本对照:[Spring Cloud](https://spring.io/projects/spring-cloud#overview)  SpringCouldAlibaba版本一般与SpringCloud版本号一致:[spring-cloud-alibaba/README-zh.md](https://github.com/alibaba/spring-cloud-alibaba/blob/2025.1.x/README-zh.md)  #### 3、依赖管理 在`build.gradle`中添加 ```groovy bootJar { enabled = false } jar { enabled = false } ext { set('springCloudVersion', "2025.0.0") set('springCloudAlibabaVersion', "2025.0.0.0") } repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } subprojects { apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = "cn.doooog" version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" } } } ``` 完整的示例 ```groovy plugins { id 'java' id 'org.springframework.boot' version '3.5.9' id 'io.spring.dependency-management' version '1.1.7' } group = 'cn.doooog' version = '0.0.1-SNAPSHOT' description = 'SpringCloudAlibaba' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } bootJar { enabled = false } jar { enabled = false } ext { set('springCloudVersion', "2025.0.0") set('springCloudAlibabaVersion', "2025.0.0.0") } repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } subprojects { apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = "cn.doooog" version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/spring/' } mavenCentral() } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" } } } ``` ## 二、环境搭建 #### 1、下载Nacos 下载地址:[Releases · alibaba/nacos](https://github.com/alibaba/nacos/releases) #### 2、身份验证 ##### 开发环境 禁用身份验证,找到`nacos/config/application.properties`  将这三项赋值为`flase`否则会启动失败 ##### 生产环境 生成256位JWT密钥 ```bash # Winodws # 使用PowerShell生成64位Base64密钥 powershell -Command "[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes((New-Guid).ToString() + (New-Guid).ToString()))" # Linux # 生成64位随机Base64密钥 openssl rand -base64 64 ``` 改成如下配置 ```properties # 服务器身份标识 nacos.core.auth.server.identity.key=serverIdentity nacos.core.auth.server.identity.value=securityServerIdentityKey # JWT令牌密钥(必须是Base64编码且长度≥32字节) nacos.core.auth.plugin.nacos.token.secret.key=上面生成的密钥 # 启用认证 nacos.core.auth.enabled=true nacos.core.auth.system.type=nacos nacos.core.auth.caching.enabled=true # 如果使用内置数据库,还需要配置 nacos.core.auth.enable.userAgentAuthWhite=false nacos.core.auth.server.identity.value=securityServerIdentityKey ``` #### 3、启动 设置完成后进入`nacos/bin`文件夹,执行启动命令: ```bash # Linux sh startup.sh -m standalone # Ubuntu bash startup.sh -m standalone # Windows ./startup.cmd -m standalone ```  #### 4、访问Nacos http://localhost:8080/  ## 三、测试数据 #### 1、建表 ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS order_db CHARACTER SET utf8mb4; USE order_db; -- 创建订单表 CREATE TABLE `order` ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', order_no VARCHAR(64) NOT NULL UNIQUE COMMENT '订单编号', user_id BIGINT NOT NULL COMMENT '用户ID', amount DECIMAL(10,2) NOT NULL COMMENT '订单金额', status TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态:1-待支付,2-已支付,3-已完成,4-已取消', product_name VARCHAR(100) NOT NULL COMMENT '商品名称', quantity INT NOT NULL COMMENT '商品数量', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', KEY idx_user_id (user_id), KEY idx_create_time (create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; ``` #### 2、插入数据 ```sql INSERT INTO `order` (order_no, user_id, amount, status, product_name, quantity) VALUES ('ORDER202501060001', 1001, 2999.00, 2, 'iPhone 15 Pro', 1), ('ORDER202501060002', 1002, 1599.00, 1, '小米14', 1), ('ORDER202501060003', 1001, 899.00, 3, 'AirPods Pro', 2), ('ORDER202501060004', 1003, 5999.00, 2, 'MacBook Air', 1), ('ORDER202501060005', 1002, 199.00, 4, '手机壳', 1), ('ORDER202501060006', 1003, 1299.00, 3, 'iPad Air', 1), ('ORDER202501060007', 1001, 399.00, 2, 'Apple Watch', 1), ('ORDER202501060008', 1004, 799.00, 1, '三星耳机', 1), ('ORDER202501060009', 1004, 4599.00, 3, '华为Mate 60', 1), ('ORDER202501060010', 1002, 299.00, 2, '充电宝', 3); ``` ## 四、创建Common模块 #### 1、创建模块  #### 2、配置依赖 修改`build.gradle`文件 ```groovy group = 'cn.doooog' version = '0.0.1-SNAPSHOT' // 不作为SpringBoot应用启动 bootJar { enabled = false } // 打包成Jar包以便其他模块引用 jar { enabled = true } dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // MyBatis-Plus 注解支持 compileOnly 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.9' // Lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' } test { useJUnitPlatform() } ``` #### 3、持久层对象 创建`cn.doooog.common.po.Order.java`类 ```java import com.baomidou.mybatisplus.annotation.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data @AllArgsConstructor @NoArgsConstructor @TableName("`order`") public class Order { @TableId(type = IdType.AUTO) private Long id; private String orderNo; private Long userId; private Double amount; private Integer status; private String productName; private Integer quantity; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } ``` #### 4、返回数据格式对象 创建`vo/Result.java` ```java import lombok.Data; import java.io.Serializable; @Data public class Result<T> implements Serializable { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("success"); result.setData(data); return result; } public static <T> Result<T> error(String message) { Result<T> result = new Result<>(); result.setCode(500); result.setMessage(message); return result; } } ``` ## 五、创建Service模块 #### 1、创建模块  #### 2、配置依赖 修改`build.gradle`文件 ```groovy group = 'cn.doooog' version = '0.0.1-SNAPSHOT' bootJar { enabled = true } jar { enabled = true } dependencies { implementation project(':order-common') // 上面创建的order-common模块 implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config' implementation 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.9' implementation 'com.mysql:mysql-connector-j:9.3.0' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() } ``` #### 3、配置模块 在`rescource`下创建配置文件`application.yml` ```yaml server: port: 9001 spring: application: name: order-service config: import: optional:nacos:order-service.yaml # 可选的Nacos动态配置 cloud: nacos: discovery: # 服务发现端口 server-addr: localhost:8848 config: # 服务配置端口 server-addr: localhost:8848 file-extension: yaml datasource: url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 ``` #### 4、创建启动类 创建`cn.doooog.service.OrderServiceApplication.java` ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient @MapperScan("cn.doooog.service.mapper") public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } } ``` #### 5、数据层 创建`mapper.OrderMapper.java`接口 ```java import cn.doooog.common.po.Order; // 上面创建的order-common模块 import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface OrderMapper extends BaseMapper<Order> { } ``` #### 6、服务层 创建`service.OrderService.java` ```java import cn.doooog.common.po.Order; import cn.doooog.common.vo.Result; import cn.doooog.service.mapper.OrderMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.stereotype.Service; import java.util.List; @Service public class OrderService { private final OrderMapper orderMapper; public OrderService(OrderMapper orderMapper) { this.orderMapper = orderMapper; } public Result<Order> getOrderByNo(String orderNo) { QueryWrapper<Order> wrapper = new QueryWrapper<>(); wrapper.eq("order_no", orderNo); Order order = orderMapper.selectOne(wrapper); return Result.success(order); } public Result<List<Order>> getOrdersByUserId(Long userId) { QueryWrapper<Order> wrapper = new QueryWrapper<>(); wrapper.eq("user_id", userId); List<Order> orders = orderMapper.selectList(wrapper); return Result.success(orders); } public Result<List<Order>> getAllOrders() { List<Order> orders = orderMapper.selectList(null); return Result.success(orders); } } ``` #### 7、控制层 创建`controller.OrderController.java` ```java import cn.doooog.common.vo.Result; import cn.doooog.service.service.OrderService; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/orders") public class OrderController { private final OrderService orderService; public OrderController(OrderService orderService) { this.orderService = orderService; } @GetMapping("/{orderNo}") public Result<?> getOrderByNo(@PathVariable String orderNo) { return orderService.getOrderByNo(orderNo); } @GetMapping("/user/{userId}") public Result<?> getOrdersByUserId(@PathVariable Long userId) { return orderService.getOrdersByUserId(userId); } @GetMapping public Result<?> getAllOrders() { return orderService.getAllOrders(); } } ``` ## 六、创建Client模块 #### 1、创建模块  #### 2、配置依赖 修改`build.gradle`文件 ```groovy group = 'cn.doooog' version = '0.0.1-SNAPSHOT' bootJar { enabled = true } jar { enabled = true } dependencies { implementation project(':order-common') implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer' implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'io.projectreactor:reactor-core' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery' implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config' } test { useJUnitPlatform() } ``` #### 3、配置模块 在`rescource`下创建配置文件`application.yml` ```yaml server: port: 9002 spring: application: name: order-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml config: import: optional:nacos:order-client.yaml ``` #### 4、创建启动类 创建`cn.doooog.client.OrderClientApplication.java` ```java 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(basePackages = "cn.doooog.client.client") public class OrderClientApplication { public static void main(String[] args) { SpringApplication.run(OrderClientApplication.class, args); } } ``` #### 5、Feign接口 创建`client.OrderClient.java` ```java import cn.doooog.common.vo.Result; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name = "order-service", path = "/api/orders") public interface OrderClient { @GetMapping("/{orderNo}") Result<Object> getOrderByNo(@PathVariable String orderNo); @GetMapping("/user/{userId}") Result<Object> getOrdersByUserId(@PathVariable Long userId); } ``` #### 6、控制层 创建`controller.ClientController.java` ```java import cn.doooog.client.client.OrderClient; import cn.doooog.common.vo.Result; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.*; @RefreshScope @RestController @RequestMapping("/api/client") public class ClientController { private final OrderClient orderClient; public ClientController(OrderClient orderClient) { this.orderClient = orderClient; } @GetMapping("/order/{orderNo}") public Result<Object> getOrderByNo(@PathVariable String orderNo) { return orderClient.getOrderByNo(orderNo); } @GetMapping("/order/user/{userId}") public Result<Object> getOrdersByUserId(@PathVariable Long userId) { return orderClient.getOrdersByUserId(userId); } @GetMapping("/health") public Result<String> health() { return Result.success("order-client service is running"); } } ``` ## 七、运行测试 #### 1、运行服务端和客户端  在Nacos后台也可以看到  #### 2、访问测试 直接通过服务端查询 [localhost:9001/api/orders/ORDER202501060001](http://localhost:9001/api/orders/ORDER202501060001)  通过客户端查询 [localhost:9002/api/client/order/ORDER202501060001](http://localhost:9002/api/client/order/ORDER202501060001)  只要是端口不同,多个相同名称的服务端会均衡负载,与SpringCloud相同。 最后修改:2026 年 01 月 06 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。