一、项目相关技术
1.Maven:项目管理工具
2.SpringCloud
3.SpringBoot 2.4.13
4.MybatisPlus
5.Eureka:服务/配置中心
6.OpenFegin:服务调用
7.Gateway:网关
二、项目展示
父工程-maven项目
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sunyard</groupId>
<artifactId>springcloud-eureka-gateway</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>eureka-server-5001</module>
<module>stu-common</module>
<module>stu-customer-8001</module>
<module>stu-provider-6001</module>
<module>stu-gateway-7001</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.5</spring-cloud.version>
<mysql.version>5.1.49</mysql.version>
<mybatis-plus.version>3.4.3.4</mybatis-plus.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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:版本依赖关系(版本对应关系可以查看官网)
本项目版本对应关系如下:
Spring Cloud Version | Spring Boot Version |
2020.0.5 | 2.4.13 |
1. 公共模块-SpringBoot项目
1.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sunyard</groupId>
<artifactId>springcloud-eureka-gateway</artifactId>
<version>1.0</version>
</parent>
<artifactId>stu-common</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
1.2 po实体类(Student.java)
/**
* @author lucky
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("stu")
public class Student {
@TableId(type= IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String gender;
private String address;
private Date birth;
}
1.3 vo响应结果集(AjaxResult.java)
public class AjaxResult extends HashMap {
public AjaxResult(boolean success, int status,String msg, Object data){
this.put("success",success);
this.put("status",status);
this.put("msg",msg);
this.put("data",data);
}
public static AjaxResult success(){
return new AjaxResult(true,200,"操作成功",null);
}
public static AjaxResult success(String msg){
return new AjaxResult(true,200,msg,null);
}
public static AjaxResult success(Object data){
return new AjaxResult(true,200,"操作成功",data);
}
public static AjaxResult success(String msg, Object data){
return new AjaxResult(true,200,msg,data);
}
public static AjaxResult success(int status, String msg) {
return new AjaxResult(true, status, msg,null);
}
public static AjaxResult success(int status, String msg, Object data){
return new AjaxResult(true,status,msg,data);
}
public static AjaxResult fail(){
return new AjaxResult(false,500,"操作失败",null);
}
public static AjaxResult fail(String msg){
return new AjaxResult(false,500,msg,null);
}
public static AjaxResult fail(int status, String msg){
return new AjaxResult(false,status,msg,null);
}
public static AjaxResult fail(int status, String msg, Object data){
return new AjaxResult(false,status,msg,data);
}
public static AjaxResult fail(boolean success, int status, String msg){
return new AjaxResult(success,status,msg,null);
}
}
2. Eureka服务中心(eureka-server-5001)
2.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sunyard</groupId>
<artifactId>springcloud-eureka-gateway</artifactId>
<version>1.0</version>
</parent>
<artifactId>eureka-server-5001</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 application.yml
server:
port: 5001
spring:
application:
name: sunsca-eureka-server
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:5001/eureka/
server:
enable-self-preservation: false #关闭保护模式
2.3 EurekaServer5001Application.java(启动类添加注解@EnableEurekaServer服务端)
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer5001Application {
public static void main(String[] args) {
SpringApplication.run(EurekaServer5001Application.class, args);
}
}
3. 网关模块(stu-gateway-7001)
3.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sunyard</groupId>
<artifactId>springcloud-eureka-gateway</artifactId>
<version>1.0</version>
</parent>
<artifactId>stu-gateway</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.2 application.yml
server:
port: 7001
eureka:
client:
service-url:
defaultZone: http://localhost:5001/eureka/
# instance:
# hostname: stu-gateway
# instance:
# prefer-ip-address: true
# instance-id: stu-gateway
spring:
application:
name: stu-gateway
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: stu-provider
uri: lb://stu-provider
predicates:
- Path=/stu/**
- Method=GET,POST
- id: stu-customer
uri: lb://stu-customer
predicates:
- Path=/www/customer/**
- Method=GET,POST
filters:
- StripPrefix=1
3.3 StuGatewayApplication.java(启动类加注解@EnableEurekaClient客户端)
@SpringBootApplication
@EnableEurekaClient
public class StuGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(StuGatewayApplication.class, args);
}
}
4. 提供者模块(stu-provider-6001)
4.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sunyard</groupId>
<artifactId>springcloud-eureka-gateway</artifactId>
<version>1.0</version>
</parent>
<artifactId>stu-provider</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sunyard</groupId>
<artifactId>stu-common</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.2 application.yml
server:
port: 6001
spring:
application:
name: stu-provider
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/studb?useUnicode=true&characterEncoding=UTF8
username: root
password: xxx
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:5001/eureka/
4.3 MybatisPlusConfig.java(mybatisplus配置)
@Configuration
@MapperScan("com.sunyard.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
4.4 StuMapper.java(mapper接口)
public interface StuMapper extends BaseMapper<Student> {
}
4.5 StuServiceI.java(业务层接口)
public interface StuServiceI extends IService<Student> {
}
4.6 StuServiceImpl.java(业务层接口实现类)
@Service
public class StuServiceImpl extends ServiceImpl<StuMapper, Student> implements StuServiceI {
}
4.7 StuController.java(控制层)
@RestController
@RequestMapping("/stu")
public class StuController {
@Resource
private StuServiceI stuService;
@GetMapping("/list")
public AjaxResult list(){
List<Student> studentList = stuService.list();
return AjaxResult.success(studentList);
}
@GetMapping("/{id}")
public AjaxResult findById(@PathVariable Long id){
Student student = stuService.getById(id);
return AjaxResult.success(student);
}
}
5. 消费者模块(stu-customer-8001)
5.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sunyard</groupId>
<artifactId>springcloud-eureka-gateway</artifactId>
<version>1.0</version>
</parent>
<groupId>com.sunyard</groupId>
<artifactId>stu-customer</artifactId>
<version>1.0</version>
<name>stu-customer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<!-- spring-cloud-starter-netflix-hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sunyard</groupId>
<artifactId>stu-common</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.2 application.yml
server:
port: 8001
spring:
application:
name: stu-customer
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/studb?useUnicode=true&characterEncoding=UTF8
username: root
password: xxx
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:5001/eureka/
# instance:
# prefer-ip-address: true
# instance-id: stu-customer
feign:
circuitbreaker:
enabled: true
5.3 ProvideClient.java
@FeignClient("stu-gateway")//提供者的名字
@LoadBalancerClient(name = "stu-gateway")
public interface ProviderClien {
@GetMapping("/stu/list")
public AjaxResult list();
@GetMapping("/stu/{id}")
public AjaxResult findById(@PathVariable Long id);
}
5.4 CustomerController.java
@RestController
@RequestMapping("/customer")
public class CustomerController {
@Resource
private ProviderClien providerClien;
@GetMapping("/list")
public AjaxResult list(){
return providerClien.list();
}
@GetMapping("/{id}")
public AjaxResult findById(@PathVariable Long id){
return providerClien.findById(id);
}
}
6. 测试
通过网关访问消费者接口