【教程】SpringCloud+Nacos+Feign+Gateway ( 五 ) Nacos-Gateway 网关搭建及配置(推荐)
转发功能,熔断功能,限流功能
统一入口
、鉴权校验
、动态路由
、降低耦合度
SpringCloud 是微服务中的翘楚,最佳的落地方案。
Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul。网关通常在项目中为了简化
前端的调用逻辑,同时也简化内部服务之间互相调用的复杂度;具体作用就是转发服务,接收并转发所有内外
部的客户端调用;其他常见的功能还有权限认证,限流控制等等。
(1)Filter(过滤器):
和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。
(2)Route(路由):
网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
(3)Predicate(断言):
这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
1 创建项目
2 启动类
package com.gw.module.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Title: Gateway服务
* @Description: 网关
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-03-02
* @Project SpringCloudGw
* @Package com.gw
*/
@EnableDiscoveryClient
@SpringBootApplication
public class ModuleGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ModuleGatewayApplication.class, args);
}
}
3 POM.xml
核心
<!-- spring-cloud网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
完整
<?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">
<!-- 引入父项目 -->
<parent>
<groupId>com.gw</groupId>
<artifactId>gwcloud-module</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.gw</groupId>
<artifactId>gwcloud-module-gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<name>gwcloud-module-gateway</name>
<dependencies>
<!-- gwcloud 微服务基础依赖-->
<dependency>
<groupId>com.gw</groupId>
<artifactId>gwcloud-starter-init</artifactId>
<exclusions>
<exclusion>
<groupId>com.gw</groupId>
<artifactId>gwcloud-base-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- spring-cloud网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
4. 配置文件 application.yml
server:
port: 9999
spring:
application:
name: gwcloud-module-gateway
cloud:
gateway:
discovery:
locator:
# 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务
enabled: true
# globalcors:
# cors-configurations:
# '[/**]':
# allowCredentials: true
# allowedOrigins: "*"
# allowedMethods: "*"
# allowedHeaders: "*"
#如果启用nacos或者数据库配置请删除以下配置
# 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。)
routes:
#路由标识(id:标识,具有唯一性) 简单尝试
- id: gwcloud-user-provide-service
# 目标服务地址(uri:地址,请求转发后的地址)
uri: http://localhost:8811
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 转发地址格式为 uri/archive
- Path=/nacos-config/**
5.路由配置方式
5.1基于yml配置文件的方式
spring:
cloud:
gateway:
# 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。)
routes:
#路由标识(id:标识,具有唯一性) 简单尝试
- id: gwcloud-user-provide-service
# 目标服务地址(uri:地址,请求转发后的地址)
uri: http://localhost:8811
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 转发地址格式为 uri/archive
- Path=/nacos-config/**
原本的访问地址为:http://localhost:8811/nacos-config/getUserConfig
Gateway访问地址为:http://localhost:9999/nacos-config/getUserConfig
5.2 基于yml配置文件的方式 通过服务名访问
在uri的schema协议部分为自定义的lb:类型,表示从微服务注册中心(如Nacos)订阅服务,并且进行服务的路由。
注册中心相结合的路由配置方式,与单个URI的路由配置,区别其实很小,仅仅在于URI的schema协议不同。单个URI的地址的schema协议,一般为http或者https协议。
需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
uri: lb://gwcloud-user-provide-service
# 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。)
routes:
#路由标识(id:标识,具有唯一性) 简单尝试
- id: gwcloud-user-provide-service
# 目标服务地址(uri:地址,请求转发后的地址) lb://服务名
uri: lb://gwcloud-user-provide-service
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 转发地址格式为 uri/archive
- Path=/nacos-config/**
5.3 通过代码配置的方式
package com.gw.module.gateway.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Title: Gateway配置类
* @Description: 描述
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-03-03
* @Project springcloud-gw-parent
* @Package com.gw.module.gateway.config
*/
@Configuration
public class GatewayRoutesConfig {
/**
* 通过代码配置路由
* @param builder
* @return
*/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
return builder.routes()
.route("gwcloud-user-provide-service-code", r -> r.path("/user/**")
.uri("lb://gwcloud-user-provide-service"))
.build();
}
}
predicates规则
通过请求参数过滤
routes:
#路由标识(id:标识,具有唯一性) 简单尝试
- id: gwcloud-user-provide-service
# 目标服务地址(uri:地址,请求转发后的地址) lb://服务名
uri: lb://gwcloud-user-provide-service
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 通过请求参数过滤
- Query=token
规则 | 实例 | 说明 |
Path | - Path=/gate/,/rule/ | ## 当请求的路径为gate、rule开头的时,转发到http://localhost:9023服务器上 |
Before | - Before=2017-01-20T17:42:47.789-07:00[America/Denver] | 在某个时间之前的请求才会被转发到 http://localhost:9023服务器上 |
After | - After=2017-01-20T17:42:47.789-07:00[America/Denver] | 在某个时间之后的请求才会被转发 |
Between | - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] | 在某个时间段之间的才会被转发 |
Cookie | - Cookie=chocolate, ch.p | 名为chocolate的表单或者满足正则ch.p的表单才会被匹配到进行请求转发 |
Header | - Header=X-Request-Id, \d+ | 携带参数X-Request-Id或者满足\d+的请求头才会匹配 |
Host | - Host=www.hd123.com | 当主机名为www.hd123.com的时候直接转发到http://localhost:9023服务器上 |
Method | - Method=GET | 只有GET方法才会匹配转发请求,还可以限定POST、PUT等请求方式 |
Predicate 断言条件(转发规则)介绍
filters
过滤规则 | 实例 | 说明 |
PrefixPath | - PrefixPath=/app | 在请求路径前加上app |
RewritePath | - RewritePath=/test, /app/test | 访问localhost:9022/test,请求会转发到localhost:8001/app/test |
SetPath | SetPath=/app/{path} | 通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径 |
RedirectTo | | 重定向 |
RemoveRequestHeader | | 去掉某个请求头信息 |