谷粒商城-Gateway的使用

1、 简介

网关作为流量的入口, 常用功能包括路由转发、权限校验、限流控制等。而 springcloud gateway
作为 SpringCloud 官方推出的第二代网关框架, 取代了 Zuul 网关。

网关提供 API 全托管服务, 丰富的 API 管理功能, 辅助企业管理大规模的 API, 以降低管理成本和安全风险, 包括协议适配、 协议转发、 安全策略、 防刷、 流量、 监控日志等功能。Spring Cloud Gateway 旨在提供一种简单而有效的方式来对 API 进行路由, 并为他们提供切面, 例如: 安全性, 监控/指标 和弹性等。
官方文档地址:官方文档地址

Spring Cloud Gateway 特点:

  • 基于 Spring5, 支持响应式编程和 SpringBoot2.
  • 支持使用任何请求属性进行路由匹配
  • 特定于路由的断言和过滤器
  • 集成 Hystrix 进行断路保护
  • 集成服务发现功能
  • 易于编写 Predicates 和 Filters
  • 支持请求速率限制
  • 支持路径重写

思考:
为什么使用 API 网关?
API 网关出现的原因是微服务架构的出现, 不同的微服务一般会有不同的网络地址, 而客户端可能需要调用多个服务的接口才能完成一个业务需求, 如果让客户端直接与各个微服务通信, 会有以下的问题:

  • 客户端会多次请求不同的微服务, 增加了客户端的复杂性。
  • 存在跨域请求, 在一定场景下处理相对复杂。
  • 认证复杂, 每个服务都需要独立认证。
  • 难以重构, 随着项目的迭代, 可能需要重新划分微服务。 例如, 可能将多个服务合并成一个或者将一个服务拆分成多个。 如果客户端直接与微服务通信, 那么重构将会很难实施。
  • 某些微服务可能使用了防火墙 / 浏览器不友好的协议, 直接访问会有一定的困难。

以上这些问题可以借助 API 网关解决。 API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。 也就是说, API 的实现方面更多的考虑业务逻辑, 而安全、 性能、 监控可以交由 API 网关来做, 这样既提高业务灵活性又不缺安全性。

使用 API 网关后的优点如下:

  • 易于监控。 可以在网关收集监控数据并将其推送到外部系统进行分析。
  • 易于认证。 可以在网关上进行认证, 然后再将请求转发到后端的微服务, 而无须在每个微服务中进行认证。
  • 减少了客户端与各个微服务之间的交互次数。

2、 核心概念

  1. 路由id。 路由是网关最基础的部分, 路由信息有一个 ID、 一个目的 URL、 一组断言和一组Filter 组成。 如果断言路由为真, 则说明请求的 URL 和配置匹配
  2. 断言predicates。 Java8 中的断言函数。 Spring Cloud Gateway 中的断言函数输入类型是Spring5.0 框架中的 ServerWebExchange。 Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息, 比如请求头和参数等。
  3. 过滤器filter。 一个标准的 Spring webFilter。 Spring cloud gateway 中的 filter 分为两种类型的
    Filter, 分别是 Gateway Filter 和 Global Filter。 过滤器 Filter 将会对请求和响应进行修改处理

在这里插入图片描述

客户端发送请求给网关, 弯管 HandlerMapping 判断是否请求满足某个路由, 满足就发给网
关的 WebHandler。 这个 WebHandler 将请求交给一个过滤器链, 请求到达目标服务之前, 会
执行所有过滤器的 pre 方法。 请求到达目标服务处理之后再依次执行所有过滤器的 post 方法。

3、 使用

1、 HelloWorld

<dependency>
    <groupId>com.wang.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>

2、 编写网关配置文件

  • application.yml配置
# 配置路由规则
spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
  • bootstrap.properties配置
# 服务的配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# nacos可视化界面中创建Gateway的命名空间
spring.cloud.nacos.config.namespace=3476abc9-e576-4525-b12f-63e779f0f7df
# 服务的名字
spring.application.name=gulimall-gateway
  • application.properties的配置
#服务的注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#服务的名字
spring.application.name=gulimall-gateway
# 服务的启动端口
server.port=88
  • 启动类
@EnableDiscoveryClient
//因为我们引入的common模块是包含Mybatis-Plus模块的,所以需要排除它的自动配置相关信息
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallGatewayApplication.class,args);
    }
}

3、 注意

  • 各种 Predicates 同时存在于同一个路由时, 请求必须同时满足所有的条件才被这个路由匹配。
  • 一个请求满足多个路由的谓词条件时, 请求只会被首个成功匹配的路由转发

4、 测试
可以使用 postman 进行测试网关的路由功能。
也可以根据我们的路由规则访问一下路径:http://localhost:88/?url=baidu。成功!
在这里插入图片描述

1、 断言(Predicates)

在这里插入图片描述

2、 过滤器(filters)

1、 GatewayFilter
在这里插入图片描述
2、 GlobalFilter
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值