Spring Cloud Gateway是什么?用来解决什么问题?

Spring Cloud Gateway是Spring生态中的一个项目,称为网关。作用是将用户请求路由(Route)到相应的API接口;

在微服务项目中,网关也是一个微服务,网关也需要单独新建一个项目。

通过网关能够实现:

  • 提供统一的请求入口;
  • 对请求进行身份认证;
  • 路由,最基本的功能;
  • 负载均衡;
  • 请求限流,限制流量请求;

网关工作原理



springcloud gateway GlobalFilter使用 springcloud gateway作用_spring


  1. 客户端向网关发起请求
  2. 网关处理映射确定请求与某个路由相匹配,将请求发送给网关web处理程序
  3. 过滤器链能够在请求之前和之后起到相应的作用
  4. 网关web处理程序,通过过滤器链后请求到相应的服务

如何引入Spring Cloud Gateway

注意:不支持以servlet为容器和WAR包部署的传统项目

POM文件中引入依赖spring-cloud-starter-gateway

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>4.0.2</version>
</dependency>

网关配置文件bootstrap.yml

注意:
bootstrapstrap.yml是系统级的配置文件,优先级最高
application.yml是用户级的配置文件,优先级低于bootstrap.yml

spring:
  cloud:
    gateway:
      routes:
      - id: after_route #路由配置唯一标识,不可重复
        # uri的配置写法有三种
        # 1.http地址, 样例:http://www.baidu.com
        # 2.websocket 样例:ws://www.baidu.com
        # 3.微服务名称  样例:lb://baidu-service
        uri: lb://service-name #路由地址,lb负载均衡标识。service-name表示微服务名称。
        predicates: #断言 
        - path=/user/** #断言路由的匹配规则,请求是否符合规则。请求需要包含/user
        filter:

Predicate Factories 路由断言工厂

下表是一些常见配置,前端请求必须符合网关的约定条件。


名称

说明

示例

After

请求发生在某个时间之后

- After=2021-02-23T14:20:00.000+08:00[Asia/Shanghai]

Before

请求发生在某个时间之前

-Before=2021-02-23T14:20:00.000+08:00[Asia/Shanghai]

Between

请求发生在两个时间之间

-Between=2017-01-20T17:42:47.789-07:00[Asia/Shanghai], 2017-01-21T17:42:47.789-07:00[Asia/Shanghai]

Cookie

cookie名和值

-Cookie=

Header

请求头

- Header=X-Request-Id, \d+

Host

请求主机

- Host=**.,**.

Method

请求方法

- Method=GET,POST

RemoteAddr

远程地址

- RemoteAddr=192.168.1.1/24

Weight

权重

- Weight=group1, 2


GatewayFilter Factories过滤器工厂配置

路由过滤器能够控制请求和响应。


名称

说明

样例

AddRequestHeader

请求头



跨域配置、跨域资源共享、CORS Configuration

前后端分离,会存在跨域问题。

跨域问题产生的原因:浏览器为了保证用户信息安全,使用了“同源策略”这种方式。

什么是同源:两个请求需要同时满足:协议相同、域名相同、端口号相同。

以http://www.example.com/dir/page.html这个网址为例,协议是http://,域名是www.example.com,端口是80(默认端口可以省略):

http://www.example.com/dir2/other.html:同源 http://example.com/dir/other.html:不同源(域名不同) http:///dir/other.html:不同源(域名不同)
http://www.example.com:81/dir/other.html:不同源(端口不同)

跨域资源共享CORS:允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

后端应用服务配置了CORS,就能实现跨域资源共享,具体配置如下:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "https://docs.spring.io"
            allowedMethods:
            - GET