What is Spring Cloud Gateway
Spring Spring Cloud Gateway is the official gateway based on technology developed by Spring 5.0, Spring Boot 2.0 and Project Reactor, etc., Spring Cloud Gateway is designed to provide a simple and effective unified API services architecture for micro routing management. Spring Cloud Gateway as an ecosystem Spring Cloud gateway, the goal is to replace Netflix Zuul , which not only provides a unified routing, and provides the basic functions of gateway-based approach Filter chain, such as: security, monitoring / Buried, and limit streams.
# The Spring Cloud Gateway functional characteristics
- Based on Spring Framework 5, Project Reactor and Spring Boot 2.0
- Dynamic Routing
- Predicates and Filters act on a specific route
- Integrated circuit breaker Hystrix
- 集成 Spring Cloud DiscoveryClient
- Filters are easy to write and Predicates
- Limiting
- Path Rewrite
# The Spring Cloud Gateway engineering processes
The client makes a request to Spring Cloud Gateway. And then find the matches the request of the routing Gateway Handler Mapping, send it to the Gateway Web Handler. Handler then through the specified filter chain to send a request to the service we actually execute business logic and then returns.
Separated by a dashed line between the filter because the filter may (before sending a proxy request pre
) or after ( post
) execute business logic.
#POM
<?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>com.snake</groupId>
<artifactId>hello-spring-cloud-alibaba-dependencies</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../hello-spring-cloud-alibaba-dependencies/pom.xml</relativePath>
</parent>
<artifactId>hello-spring-cloud-gateway</artifactId>
<packaging>jar</packaging>
<name>hello-spring-cloud-gateway</name>
<url>http://www.snake.com</url>
<inceptionYear>2018-Now</inceptionYear>
<dependencies>
<!-- Spring Boot Begin -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Spring Cloud Begin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</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-gateway</artifactId>
</dependency>
<!-- Spring Cloud End -->
<!-- Commons Begin -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!-- Commons Begin -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.funtl.hello.spring.cloud.gateway.GatewayApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
The main increases org.springframework.cloud:spring-cloud-starter-gateway
dependence
# Special attention
- Spring Cloud Gateway is not used as a Web server, but use WebFlux as a server , Gateway project has relied
starter-webflux
, so here do not rely starter-web - Since the filter functions Servlet still need support, so there is also need to rely on
javax.servlet:javax.servlet-api
#Application
package com.snake.hello.spring.cloud.gateway;
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 GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
# application.yml
spring:
application:
# 应用名称
name: spring-gateway
cloud:
# 使用 Naoos 作为服务注册发现
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 使用 Sentinel 作为熔断器
sentinel:
transport:
port: 8721
dashboard: localhost:8080
# 路由网关配置
gateway:
# 设置与服务注册发现组件结合,这样可以采用服务名的路由策略
discovery:
locator:
enabled: true
# 配置路由规则
routes:
# 采用自定义路由 ID(有固定用法,不同的 id 有不同的功能,详见:https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters)
- id: NACOS-CONSUMER
# 采用 LoadBalanceClient 方式请求,以 lb:// 开头,后面的是注册在 Nacos 上的服务名
uri: lb://nacos-consumer
# Predicate 翻译过来是“谓词”的意思,必须,主要作用是匹配用户的请求,有很多种用法
predicates:
# Method 方法谓词,这里是匹配 GET 和 POST 请求
- Method=GET,POST
- id: NACOS-CONSUMER-FEIGN
uri: lb://nacos-consumer-feign
predicates:
- Method=GET,POST
server:
port: 9000
# 目前无效
feign:
sentinel:
enabled: true
# 目前无效
management:
endpoints:
web:
exposure:
include: "*"
# 配置日志级别,方别调试
logging:
level:
org.springframework.cloud.gateway: debug
Note: Please read the comments carefully
# Test Access
And then click Run Nacos NacosProviderApplication
service, NacosConsumerApplication
, NacosConsumerFeignApplication
, ,GatewayApplication
Open your browser and visit: http: // localhost: 9000 / nacos-consumer / echo / app / name browser displays
Hello Nacos Discovery nacos-consumer i am from port 8082
Open your browser and visit: http: // localhost: 9000 / nacos-consumer-feign / echo / hi browser displays
Hello Nacos Discovery Hi Feign i am from port 8082
Note: The request method is http: // gateway router IP: Routing Gateway Port / service name / * *
At this point Description Spring Cloud Gateway Routing functions are configured