随着微服务开发与使用越来越广泛,单组件服务也越来越多,导致服务的维护变得复杂,试想如果使用nginx作为负载均衡,当服务增加一个就需要重新配置nginx,这样就使得项目的维护成本与难度越来越高,于是网关在微服务开发中就成为了也不可或缺的存。

网关可以作为服务的统一入口,封装应用程序的内部结构,客户端提供统一服务,一些与也无无关的公共逻辑也可以放在网关实现,如认证、鉴权、监控、路由转发等。

本文就Spring Cloud Gateway记录一下我自己的学习笔记。

Spring Cloud Gateway 功能特征

  • 动态路由:能够匹配任何请求属性;
  • 支持路径重写;
  • 集成 Spring Cloud 服务发现功能(Nacos、Eruka);
  • 可集成流控降级功能(Sentinel、Hystrix);
  • 可以对路由指定易于编写的 Predicate(断言)和 Filter(过滤器);

核心概念

  • 路由(route)

路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。

  • 断言(predicates)

Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。

  • 过滤器(Filter)

SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。

执行流程

  1. Gateway Client向Gateway Server发送请求
  2. 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
  3. 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping
  4. RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可
  5. 如果过断言成功,由FilteringWebHandler创建过滤器链并调用
  6. 请求会一次经过PreFilter–微服务–PostFilter的方法,最终返回响应

Spring Cloud Gateway快速开始

环境搭建

1.引入依赖

1
2
3
4
5
<!-- gateway网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.简单使用

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8081
spring:
cloud:
gateway:
routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
- id: baidu # 当前路由的标识, 要求唯一
uri: https://www.baidu.com # 请求要转发到的地址
predicates: # 断言(就是路由转发要满足的条件)
#访问路径:localhost:8081?url=baidu 代表跳转到www.baidu.com
#url带有baidu的自动跳转到https://www.baidu.com
- Query=url,baidu

集成Nacos

引入依赖

1
2
3
4
5
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 8888

spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: product_route
uri: lb://service-product # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
predicates:
- Path=/product-serve/**
filters:
- StripPrefix=1

路由断言工厂(Route Predicate Factories)配置

作用: 当请求gateway的时候, 使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404

类型:内置,自定义

官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

SpringCloudGateWay包含有许多内置的断言工厂,这些断言都与HTTP请求的不同属性匹配。

  • 基于Datetime类型的断言工厂
  • 基于远程地址的断言工厂
  • 基于Cookie的断言工
  • 基于Header的断言工厂
  • 基于Host的断言工厂
  • 基于Method请求方法的断言工厂
  • 基于Path请求路径的断言工厂
  • 基于Query请求参数的断言工厂
  • 基于路由权重的断言工厂

自定义路由断言工厂