SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty
项目结构:
- 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.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.youxiu326</groupId>
<artifactId>sb_gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sb_gateway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.53</version>
</dependency>
<!-- springcloud gateway网关依赖 start-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-webflux</artifactId>
</dependency>
<!-- springcloud gateway网关依赖 end-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
</plugin>
</plugins>
</build>
</project>
- yml
spring:
datasource:
password: zz123456.ZZ
url: jdbc:mysql://youxiu326.xin:3306/super_man?useUnicode=true&characterEncoding=utf8
username: youxiu326
redis:
host: youxiu326.xin
freemarker:
settings:
classic_compatible: true
datetime_format: yyyy-MM-dd HH:mm:ss
number_format: '#.##'
template_exception_handler: debug
suffix: .html
server:
port: 8080
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:/mapper/*.xml
- 定义gateway实体类
package com.youxiu326.gateway.model; import java.util.ArrayList; import java.util.List; /** * Gateway的路由定义模型 * */ public class GatewayRouteDefinition { /** * 路由的Id */ private String id; /** * 路由断言集合配置 */ private List<GatewayPredicateDefinition> predicates = new ArrayList<>(); /** * 路由过滤器集合配置 */ private List<GatewayFilterDefinition> filters = new ArrayList<>(); /** * 路由规则转发的目标uri */ private String uri; /** * 路由执行的顺序 */ private int order = 0; /** * 断言集合json字符串 */ private String predicatesJson; /** * 路由过滤器json字符串 */ private String filtersJson; public String getId() { return id; } public void setId(String id) { this.id = id; } public List<GatewayPredicateDefinition> getPredicates() { return predicates; } public void setPredicates(List<GatewayPredicateDefinition> predicates) { this.predicates = predicates; } public List<GatewayFilterDefinition> getFilters() { return filters; } public void setFilters(List<GatewayFilterDefinition> filters) { this.filters = filters; } public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public String getPredicatesJson() { return predicatesJson; } public void setPredicatesJson(String predicatesJson) { this.predicatesJson = predicatesJson == null ? null : predicatesJson.trim(); } public String getFiltersJson() { return filtersJson; } public void setFiltersJson(String filtersJson) { this.filtersJson = filtersJson == null ? null : filtersJson.trim(); } }