SpringCloud Gateway 简介

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul。为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,如:安全,监控/指标,和限流。

工作原理

下图从总体上概述了Spring Cloud Gateway的工作方式:
Spring Cloud Gateway的工作方式
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

配置路由

gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分:路由,断言,过滤器

Route(路由)路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发
Predicate(断言)路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式
Filter(过滤器)过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容

断言(predicates)

规则实例描述
Path- Path=/red/{segment},/blue/{segment}如果请求路径为,则此路由匹配,例如:/red/1或/blue/1。
Before- Before=2017-01-20T17:42:47.789-07:00[America/Denver]在2017年1月20日17:42之前的请求才会被转发
After- After=2017-01-20T17:42:47.789-07:00[America/Denver]在2017年1月20日17:42之后的请求才会被转发
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正则表达式匹配的cookie的请求
Header- Header=X-Request-Id, \d+匹配名为X-Request-Id其值与\d+正则表达式匹配的请求头(即,其值为一个或多个数字)
Host- Host=www.gulimall.com匹配主机名为www.gulimall.com的请求
Method- Method=GET只有GET方法才会匹配转发请求,还可以限定POST、PUT等请求方式
Query- Query=color, gree.匹配请求参数名为color, 值符合正则表达式gree. ,如green和greet
RemoteAddr- RemoteAddr=192.168.1.1/24如果请求的远程地址是192.168.1.10,则此路由将匹配。
Weight配置如下将80%的流量转发到weighthigh.org,将20%的流量转发到weightlow.org

application.yml

#断言Weight例子
spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

过滤器(filters)

列出部分:更多可参考官网

规则实例描述
AddRequestHeader- AddRequestHeader=X-Request-Foo, Bar添加请求头X-Request-Foo:Bar
AddResponseHeader- AddResponseHeader=X-Response-Red, Blue添加响应头X-Response-Red:Blue
AddRequestParameter- AddRequestParameter=foo, bar请求添加foo=bar的查询字符串
PrefixPath- PrefixPath=/mypath为所有匹配请求的路径加上/mypath前缀
RedirectTo- RedirectTo=302, https://acme.org重定向
SetPathSetPath=/app/{path}通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径

application.yml

#对于的请求路径/red/blue,这会将路径设置为/blue
spring:
 cloud:
   gateway:
     routes:
     - id: setpath_route
       uri: https://example.org
       predicates:
       - Path=/red/{segment}
       filters:
       - SetPath=/{segment}

新建工程:gulimall-gateway

在这里插入图片描述
引入gateway

在这里插入图片描述

统一配置跨域请求

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowed-origins: "*"
            allowed-headers: "*"
            allow-credentials: true
            allowed-methods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION

整合Nacos

映入创建好的common工程

 <dependencies>
        <dependency>
            <groupId>com.atguigu.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
 </dependencies>

启动类

@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) //排除数据源的包
public class GulimallGatewayApplication {

   public static void main(String[] args) {
       SpringApplication.run(GulimallGatewayApplication.class, args);
   }

}

Nacos注册中心application.properties

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

Nacos配置中心bootstrap.properties

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
Logo

鸿蒙生态一站式服务平台。

更多推荐