版本运用分析:
- JDK:17
- Mysql:8.0.4
- Maven:3.9.10
- SpringBoot:3.3.13
- mybatis-plus:3.5.7
- spring-data-redis:3.3.13
- spring-cache:3.3.13
- spring-cloud:2023.0.1
- nacos:3.0.2
安装Nacos

设置密钥

默认账号和密码

创建项目

其他包删掉

创建emp-service模块 员工


创建dept-service模块 部门


创建common-pojo模块(存放实体类)

创建common-untils模块


修改父工程pom文件
引入父工程依赖
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>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>emp-service</module>
<module>dept-service</module>
<module>common-pojo</module>
<module>common-untils</module>
</modules>
<!-- spring-boot-starter-parent父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.13</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

引入共同依赖
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>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>emp-service</module>
<module>dept-service</module>
<module>common-pojo</module>
<module>common-untils</module>
<module>feign-api</module>
</modules>
<!-- spring-boot-starter-parent父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.13</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot-starter-web.version>3.3.13</spring-boot-starter-web.version>
</properties>
<!-- 引入共有的依赖 -->
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter-web.version}</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>

管理版本依赖(并不会直接引入依赖)
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>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>emp-service</module>
<module>dept-service</module>
<module>common-pojo</module>
<module>common-untils</module>
<module>feign-api</module>
</modules>
<!-- spring-boot-starter-parent父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.13</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot-starter-web.version>3.3.13</spring-boot-starter-web.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
<mysql.version>8.0.33</mysql.version>
<lombok.version>1.18.22</lombok.version>
</properties>
<!-- 引入共有的依赖 -->
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter-web.version}</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
<!-- 管理依赖版本 -->
<dependencyManagement>
<dependencies>
<!--mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>

操作common-pojo模块
修改pom文件引入依赖
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>
<parent>
<groupId>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>common-pojo</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>


创建包引入实体类
java
package cn.jinzhu.Dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeptSimpleDto implements Serializable {
// 版本控制
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private LocalDateTime createTime;
}
java
package cn.jinzhu.Dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmpSimpleDto implements Serializable {
// 版本控制
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Short gender;
private LocalDate entryDate;
private Integer deptId;
}
java
package cn.jinzhu.Dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmpSearchDto {
private String name;
private Short gender;
private LocalDate begin;
private LocalDate end;
private Integer page;
private Integer pageSize;
}
pojo
java
package cn.jinzhu.pojo;
import cn.jinzhu.Dto.EmpSimpleDto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept implements Serializable {
// 版本控制
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private LocalDateTime createTime;
private LocalDateTime updateTime;
@TableField(exist = false)
private List<EmpSimpleDto> empsSimple;
}

kotlin
package cn.jinzhu.pojo;
import cn.jinzhu.Dto.DeptSimpleDto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("emp")
public class Emp implements Serializable {
// 版本控制
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String username;
private String password;
private String name;
private Short gender;
private String phone;
private Short job;
private Integer salary;
private String image;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate entryDate;
private Integer deptId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
@TableField(exist = false)
private DeptSimpleDto deptSimple;
}
java
package cn.jinzhu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean implements Serializable {
// 版本控制
private static final long serialVersionUID = 1L;
private Long total; // 总记录数
private List rows; // 当前页数据列表
}
typescript
package cn.jinzhu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
// 成员变量
private Integer code; // 响应码:1:成功,0:失败
private String msg; // success:成功,error:失败
private Object data; // 要封装的对象
// 成功:根据不同的情况返回相对应的结果 无数据返回
public static Result success(){
// 创建Result对象
Result result = new Result();
// 封装数据
result.code = 1;
result.msg = "success";
// 返回结果
return result;
}
// 成功:根据不同的情况返回相对应的结果 有数据返回
public static Result success(Object data){
// 创建Result对象
Result result = new Result();
// 封装数据
result.code = 1;
result.msg = "success";
result.data = data;
// 返回结果
return result;
}
// 失败:根据不同情况返回相对应的结果
public static Result error(){
// 创建Result对象
Result result = new Result();
// 封装数据
result.code = 0;
result.msg = "error";
return result;
}
// 失败:根据不同情况返回相对应的结果
public static Result error(String msg){
// 创建Result对象
Result result = new Result();
// 封装数据
result.code = 0;
result.msg = msg;
return result;
}
}

操作common-utils模块
创建包,创建MybatisPlusConfig配置类(分页插件)
kotlin
package cn.jinzhu;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

操作dept-service模块
修改pom文件引入依赖
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>
<parent>
<groupId>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>dept-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--common-pojo-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--common-utils-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-untils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

创建包,创建DeptMapper接口
java
@Mapper
public interface DeptMapper extends BaseMapper<Dept> {
}

创建包,创建DeptService接口
csharp
public interface DeptService extends IService<Dept> {
// 根据部门ID查询部门信息
Dept queryById(Integer id);
}

创建包,创建DeptServicelmpl类
scala
package cn.jinzhu.service.impl;
import cn.jinzhu.Mapper.DeptMapper;
import cn.jinzhu.pojo.Dept;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import cn.jinzhu.service.DeptService;
@Service
public class DeptServiczeImpl extends ServiceImpl<DeptMapper, Dept> implements DeptService {
@Autowired
DeptMapper deptMapper;
// 根据部门Id获取部门信息
@Override
@Cacheable(cacheNames = "depts",key = "id")
public Dept queryById(Integer id) {
Dept dept = deptMapper.selectById(id);
return dept;
}
}

创建包,创建DeptController类
kotlin
package cn.jinzhu.controller;
import cn.jinzhu.pojo.Dept;
import cn.jinzhu.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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 cn.jinzhu.service.DeptService;
@RestController
@RequestMapping("/depts")
@Slf4j
public class DeptController {
@Autowired
DeptService deptService;
// 根据部门ID获取部门信息
@GetMapping("/{id}")
public Result queryById(@PathVariable Integer id) {
log.info("根据部门ID:{}查询部门信息", id);
Dept dept = deptService.queryById(id);
return dept != null ? Result.success(dept): Result.error();
}
}

创建application.yml配置文件
yaml
server:
port: 8080
spring:
application:
name: deptservice
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring_school
username: root
password: 123456
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true # 开启驼峰命名
logging:
level:
com.he: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
创建DeptApplication启动类
typescript
package cn.jinzhu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DeptApplication {
public static void main(String[] args) {
SpringApplication.run(DeptApplication.class, args);
}
}

操作emp-service模块
修改pom文件引入依赖
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>
<parent>
<groupId>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>emp-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--common-pojo-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- common-untils -->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-untils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

创建包,创建EmpMapper接口
java
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}

创建包,创建EmpController类
kotlin
package cn.jinzhu.controller;
import cn.jinzhu.Dto.EmpSearchDto;
import cn.jinzhu.pojo.PageBean;
import cn.jinzhu.pojo.Result;
import cn.jinzhu.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
@Autowired
EmpService empService;
@GetMapping
public Result queryByInfo(@ModelAttribute EmpSearchDto empSearchDto){
log.info("查询员工信息,参数:empDto={}", empSearchDto);
PageBean pageBean = empService.queryByInfo(empSearchDto);
return pageBean!=null?Result.success(pageBean): Result.error("查询失败!");
}
}

创建包,创建EmpMapper接口
csharp
public interface EmpService extends IService<Emp> {
PageBean queryByInfo(EmpSearchDto empSearchDto);
}

创建包,创建EmpServiceimpl类
scala
package cn.jinzhu.service.impl;
import cn.jinzhu.Dto.EmpSearchDto;
import cn.jinzhu.mapper.EmpMapper;
import cn.jinzhu.pojo.Emp;
import cn.jinzhu.pojo.PageBean;
import cn.jinzhu.service.EmpService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@Service
public class EmpServiceimpl extends ServiceImpl<EmpMapper,Emp> implements EmpService {
@Autowired
EmpMapper empMapper;
// 根据信息分页查询
@Cacheable(cacheNames = "empsList",key = "#empSearchDto.hashCode()" )
public PageBean queryByInfo(EmpSearchDto empSearchDto) {
// 创建查询条件
LambdaQueryWrapper<Emp> queryWrapper = new LambdaQueryWrapper();
queryWrapper.like(StringUtils.hasLength(empSearchDto.getName()),Emp::getName, empSearchDto.getName())
.eq(empSearchDto.getGender()!=null,Emp::getGender, empSearchDto.getGender())
.ge(empSearchDto.getBegin()!=null,Emp::getEntryDate, empSearchDto.getBegin())
.le(empSearchDto.getEnd()!=null,Emp::getEntryDate, empSearchDto.getEnd());
// 创建分页条件
if (empSearchDto.getPage() == null) {
empSearchDto.setPage(1);
}
if (empSearchDto.getPageSize() == null) {
empSearchDto.setPageSize(5);
}
Page<Emp> pageInfo = new Page<>(empSearchDto.getPage(), empSearchDto.getPageSize());
// 执行查询
Page<Emp> empPage = empMapper.selectPage(pageInfo, queryWrapper);
// 封装数据
PageBean pageBean = new PageBean(empPage.getTotal(), empPage.getRecords());
// 返回数据
return pageBean;
}
}

创建EmpApplication启动类
typescript
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
public class EmpApplication {
public static void main(String[] args) {
SpringApplication.run(EmpApplication.class,args);
}
}

修改父工程pom文件
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>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>emp-service</module>
<module>dept-service</module>
<module>common-pojo</module>
<module>common-untils</module>
<module>feign-api</module>
</modules>
<!-- spring-boot-starter-parent父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.13</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot-starter-web.version>3.3.13</spring-boot-starter-web.version>
<mybatis-plus.version>3.5.7</mybatis-plus.version>
<mysql.version>8.0.33</mysql.version>
<lombok.version>1.18.22</lombok.version>
<spring-cloud.version>2023.0.1</spring-cloud.version>
<spring-cloud-alibaba-version>2023.0.1.0</spring-cloud-alibaba-version>
</properties>
<!-- 引入共有的依赖 -->
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter-web.version}</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
<!-- 管理依赖版本 -->
<dependencyManagement>
<dependencies>
<!--mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</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>
<!--nacos-->
<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>
</project>

问题:只引入SpringCloudAlibaba不引入SpringCloud就无法引入Feign依赖
Spring Cloud Alibaba是对Spring Cloud生态的扩展,并非独立替代品;它需与Spring Cloud基础组件协同工作,Feign的注解解析、HTTP请求模板化等核心能力需通过spring-cloud-starter-openfeign
提供,如果仅引入Spring Cloud Alibaba而不添加Spring Cloud相关依赖,会导致Feign无法被正确加载或调用
创建feign-api模块


修改pom文件引入依赖
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>
<parent>
<groupId>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>feign-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--feign-->
<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>
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<!--common-pojo-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 模块内部使用,不会传递给其他依赖 -->
<scope>provided</scope>
</dependency>
</dependencies>
</project>

问题:只引入spring-cloud-starter-openfeign,不引入spring-cloud-starter-loadbalancer,测试时控制台报错
在Spring Cloud项目中仅引入spring-cloud-starter-openfeign
而未添加spring-cloud-starter-loadbalancer
时,控制台会报错No Feign Client for loadBalancing defined
,这是因为自Spring Cloud Hoxton.M2版本后,Feign默认移除了Ribbon依赖,转而使用spring-cloud-loadbalancer
实现客户端负载均衡
创建包,创建DeptClient接口
kotlin
package cn.jinzhu.client;
import cn.jinzhu.pojo.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("deptservice")
public interface DeptClient {
@GetMapping("/depts/{id}")
Result queryDeptSimpleById(@PathVariable Integer id);
}

操作dept-service模块
修改pom文件引入依赖
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>
<parent>
<groupId>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>dept-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--common-pojo-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--common-utils-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-untils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--feign-api-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>feign-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

修改application.yml配置文件
yaml
server:
port: 8080
spring:
application:
name: deptservice
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring_school
username: root
password: 123456
cloud:
nacos:
server-addr: localhost:8848
# Nacos 服务器启用了认证
username: nacos # 默认用户名
password: nacos # 默认密码
discovery:
cluster-name: SZ # 集群名称
ephemeral: true # 配置是否注册为临时服务,默认是true即临时服务
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true # 开启驼峰命名
logging:
level:
com.he: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS

操作emp-service模块
修改pom文件引入依赖
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>
<parent>
<groupId>cn.jinzhu</groupId>
<artifactId>System-cold</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>emp-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--common-pojo-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- common-untils -->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>common-untils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--feign-api-->
<dependency>
<groupId>cn.jinzhu</groupId>
<artifactId>feign-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

修改application.yml配置文件
yaml
server:
port: 8081
spring:
application:
name: empservice
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring_school
username: root
password: 123456
cloud:
nacos:
server-addr: localhost:8848
# Nacos 服务器启用了认证
username: nacos # 默认用户名
password: nacos # 默认密码
discovery:
cluster-name: SZ # 集群名称
ephemeral: true # 配置是否注册为临时服务,默认是true即临时服务
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true # 开启驼峰命名
logging:
level:
com.he: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
deptservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
ribbon:
eager-load:
enabled: true # 开启饥饿加载,默认是false即懒加载
clients: deptservice

修改EmpApplication启动类
java
package cn.jinzhu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients(clients = {Deprecated.class})
public class EmpApplication {
public static void main(String[] args) {
SpringApplication.run(EmpApplication.class,args);
}
}

修改EmpServiczeImpl类
scss
@Service
public class EmpServiczeImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {
@Autowired
ObjectMapper objectMapper;
@Autowired
EmpMapper empMapper;
@Autowired
private DeptClient deptClient;
// 根据信息分页查询
@Cacheable(cacheNames = "empsList",key = "#empSearchDto.hashCode()" )
public PageBean queryByInfo(EmpSearchDto empSearchDto) {
// 创建查询条件
LambdaQueryWrapper<Emp> queryWrapper = new LambdaQueryWrapper();
queryWrapper.like(StringUtils.hasLength(empSearchDto.getName()),Emp::getName, empSearchDto.getName())
.eq(empSearchDto.getGender()!=null,Emp::getGender, empSearchDto.getGender())
.ge(empSearchDto.getBegin()!=null,Emp::getEntryDate, empSearchDto.getBegin())
.le(empSearchDto.getEnd()!=null,Emp::getEntryDate, empSearchDto.getEnd());
// 创建分页条件
if (empSearchDto.getPage() == null) {
empSearchDto.setPage(1);
}
if (empSearchDto.getPageSize() == null) {
empSearchDto.setPageSize(5);
}
Page<Emp> pageInfo = new Page<>(empSearchDto.getPage(), empSearchDto.getPageSize());
// 执行查询
Page<Emp> empPage = empMapper.selectPage(pageInfo, queryWrapper);
// 为每个员工获取对应的部门信息
List<Emp> empList = empPage.getRecords().stream().map(emp -> {
// 调用Feign客户端获取部门信息
Result deptResult = deptClient.queryDeptSimpleById(emp.getDeptId());
if (deptResult.getCode() == 1) {
// 假设员工实体中有部门名称字段 手动转换为部门实体
Object data = deptResult.getData();
DeptSimpleDto dept = objectMapper.convertValue(data, DeptSimpleDto.class);
emp.setDeptSimple(dept);
}
return emp;
}).collect(Collectors.toList());
// 封装数据
PageBean pageBean = new PageBean(empPage.getTotal(), empList);
// 返回数据
return pageBean;
}
}

启动测试
启动nacos

startup.cmd -m standalone



启动EmptApplication



启动DeptApplication




sql
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID,主键',
`username` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户名',
`password` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '123456' COMMENT '密码',
`name` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '姓名',
`gender` tinyint UNSIGNED NOT NULL COMMENT '性别, 1:男, 2:女',
`phone` char(11) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '手机号',
`job` tinyint UNSIGNED NULL DEFAULT NULL COMMENT '职位, 1 班主任, 2 讲师 , 3 学工主管, 4 教研主管, 5 咨询师',
`salary` int UNSIGNED NULL DEFAULT NULL COMMENT '薪资',
`image` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '头像',
`entry_date` date NULL DEFAULT NULL COMMENT '入职日期',
`dept_id` int UNSIGNED NULL DEFAULT NULL COMMENT '部门ID',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username` ASC) USING BTREE,
UNIQUE INDEX `phone`(`phone` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 57 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '员工表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (2, 'songjiang', '123456', '宋江', 1, '13309090002', 2, 19000, '01.png', '2015-01-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:35:37');
INSERT INTO `emp` VALUES (3, 'yucengdong', '123456', '余承东', 1, '13309090003', 1, 28900, '01.png', '2008-05-01', 1, '2025-08-02 16:09:25', '2025-08-02 16:09:25');
INSERT INTO `emp` VALUES (8, 'likui', '123456', '李逵', 1, '13309090008', 1, 15800, '01.png', '2014-11-09', 1, '2023-10-20 16:35:33', '2023-10-20 16:35:49');
INSERT INTO `emp` VALUES (10, 'linchong', '123456', '林冲', 1, '13309090010', 1, 5000, '01.png', '2013-09-05', 1, '2023-10-20 16:35:33', '2023-10-20 16:35:53');
INSERT INTO `emp` VALUES (11, 'huyanzhuo', '123456', '呼延灼', 1, '13309090011', 2, 11700, '01.png', '2007-02-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:35:55');
INSERT INTO `emp` VALUES (12, 'xiaoliguang', '123456', '小李广', 1, '13309090012', 2, 12000, '01.png', '2008-08-18', 2, '2023-10-20 16:35:33', '2023-10-20 16:35:57');
INSERT INTO `emp` VALUES (13, 'yangzhi', '123456', '杨志', 1, '13309090013', 1, 17300, '01.png', '2012-11-01', 1, '2023-10-20 16:35:33', '2023-10-20 16:35:59');
INSERT INTO `emp` VALUES (14, 'shijin', '123456', '史进', 1, '13309090014', 2, 12600, '01.png', '2002-08-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:36:01');
INSERT INTO `emp` VALUES (15, 'sunerniang', '123456', '孙二娘', 2, '13309090015', 2, 12900, '01.png', '2011-05-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:36:03');
INSERT INTO `emp` VALUES (16, 'luzhishen', '123456', '鲁智深', 1, '13309090016', 2, 11600, '01.png', '2010-01-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:36:05');
INSERT INTO `emp` VALUES (17, 'liying', '12345678', '李应', 1, '13309090017', 1, 15800, '01.png', '2015-03-21', 1, '2023-10-20 16:35:33', '2023-10-20 16:36:07');
INSERT INTO `emp` VALUES (18, 'shiqian', '123456', '时迁', 1, '13309090018', 2, 10200, '01.png', '2015-01-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:36:09');
INSERT INTO `emp` VALUES (19, 'gudasao', '123456', '顾大嫂', 2, '13309090019', 2, 10500, '01.png', '2008-01-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:36:11');
INSERT INTO `emp` VALUES (20, 'ruanxiaoer', '123456', '阮小二', 1, '13309090020', 2, 10800, '01.png', '2018-01-01', 2, '2023-10-20 16:35:33', '2023-10-20 16:36:13');
INSERT INTO `emp` VALUES (21, 'ruanxiaowu', '123456', '阮小五', 1, '13309090021', 5, 5200, '01.png', '2015-01-01', 3, '2023-10-20 16:35:33', '2023-10-20 16:36:15');
INSERT INTO `emp` VALUES (22, 'ruanxiaoqi', '123456', '阮小七', 1, '13309090022', 5, 5500, '01.png', '2016-01-01', 3, '2023-10-20 16:35:33', '2023-10-20 16:36:17');
INSERT INTO `emp` VALUES (23, 'ruanji', '123456', '阮籍', 1, '13309090023', 5, 5800, '01.png', '2012-01-01', 3, '2023-10-20 16:35:33', '2023-10-20 16:36:19');
INSERT INTO `emp` VALUES (24, 'tongwei', '123456', '童威', 1, '13309090024', 5, 5000, '01.png', '2006-01-01', 3, '2023-10-20 16:35:33', '2023-10-20 16:36:21');
INSERT INTO `emp` VALUES (25, 'tongmeng', '123456', '童猛', 1, '13309090025', 5, 4800, '01.png', '2002-01-01', 3, '2023-10-20 16:35:33', '2023-10-20 16:36:23');
INSERT INTO `emp` VALUES (26, 'yanshun', '123456', '燕顺', 1, '13309090026', 5, 5400, '01.png', '2011-01-01', 3, '2023-10-20 16:35:33', '2023-11-08 22:12:46');
INSERT INTO `emp` VALUES (27, 'lijun', '123456', '李俊', 1, '13309090027', 2, 6600, '8.png', '2004-01-01', 2, '2023-10-20 16:35:33', '2023-11-16 17:56:59');
INSERT INTO `emp` VALUES (28, 'lizhong', '123456', '李忠', 1, '13309090028', 5, 5000, '6.png', '2007-01-01', 3, '2023-10-20 16:35:33', '2023-11-17 16:34:22');
INSERT INTO `emp` VALUES (30, 'liyun', '123456', '李云', 1, '13309090030', NULL, NULL, '01.png', '2020-03-01', NULL, '2023-10-20 16:35:33', '2023-10-20 16:36:31');
INSERT INTO `emp` VALUES (36, 'linghuchong', '123456', '令狐冲', 1, '18809091212', 2, 6800, '1.png', '2023-10-19', 2, '2023-10-20 20:44:54', '2023-11-09 09:41:04');
INSERT INTO `emp` VALUES (38, 'mahuateng', '123456', '马化腾', 2, '22222', 5, 295000, '5.png', NULL, NULL, '2025-07-21 20:28:18', '2025-07-21 20:28:18');
INSERT INTO `emp` VALUES (47, 'leijun', '123456', '雷军', 1, '1330901', 4, 25000, NULL, NULL, NULL, '2025-07-21 20:33:23', '2025-07-21 20:33:23');
INSERT INTO `emp` VALUES (48, 'xuezhiqian', '1236', '薛之谦', 2, '13309001', 6, 200, '1.png', '2000-01-01', 2, NULL, '2025-07-21 20:45:38');
INSERT INTO `emp` VALUES (49, 'linjunjie', '123456', '林俊杰', 1, '133090', 3, 180, '02.png', '2015-01-01', 4, NULL, '2025-07-21 21:36:34');
INSERT INTO `emp` VALUES (56, 'caocao', '1234', '曹操', 1, '1330909', 1, NULL, '01.png', '2015-01-01', 3, '2025-08-02 16:06:41', '2025-08-02 16:06:41');
SET FOREIGN_KEY_CHECKS = 1;
sql
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID, 主键',
`name` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '部门名称',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `name`(`name` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (6, '大部', '2025-07-21 10:18:52', '2025-07-21 14:58:03');
INSERT INTO `dept` VALUES (15, '行政部', '2023-11-30 20:56:37', '2023-11-30 20:56:37');
INSERT INTO `dept` VALUES (17, '武装部', '2025-07-18 23:08:08', '2025-07-18 23:08:08');
INSERT INTO `dept` VALUES (18, '部门', '2025-07-21 14:55:24', '2025-07-21 14:55:24');
INSERT INTO `dept` VALUES (20, '后勤部', '2025-07-21 22:14:41', '2025-07-21 22:14:41');
INSERT INTO `dept` VALUES (21, '员工部', '2025-07-21 22:15:09', '2025-07-21 22:15:09');
INSERT INTO `dept` VALUES (32, '教师部', '2023-09-25 09:47:40', '2023-11-30 21:26:24');
INSERT INTO `dept` VALUES (33, '师长', '2023-09-25 09:47:40', '2023-11-30 21:26:24');
INSERT INTO `dept` VALUES (35, '装甲部', '2025-08-02 13:35:41', '2025-08-02 13:35:41');
SET FOREIGN_KEY_CHECKS = 1;