[java]-[cloud]基础篇-Spring Cloud Gateway网关

Spring Cloud Gateway网关

API 网关

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

​ 1、客户端会多次请求不同的微服务,增加了客户端的复杂性。
​ 2、存在跨域请求,在一定场景下处理相对复杂。
​ 3、认证复杂,每个服务都需要独立认证。
​ 4、难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
​ 5、某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性,

典型的架构图如图所示:

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

1、易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。

2、易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。 减少了客户端与各个微服务之间的交互次数。

API 网关选型

业界的情况

Spring Cloud Gateway 概念

路由

Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.

路由,网关基本构建块。由ID,目标URI,Predicates断言集合和filter过滤器集合定义。即转发规则

断言

Predicate: This is a Java 8 Function Predicate. The input type is a
Spring Framework ServerWebExchange. This lets you match on anything
from the HTTP request, such as headers or parameters.

断言, 指的是 Java 8 Function Predicate ,输入的类型是 Spring Framework ServerWebExchange,说的就是我们可以匹配来之HTTP请求的任何内容,比如头或参数。断言为真,才匹配路由

过滤器

Filter: These are instances of Spring Framework GatewayFilter that
have been constructed with a specific factory. Here, you can modify
requests and responses before or after sending the downstream request.

过滤器,指的是使用特定工厂构造的 Spring Framework GatewayFilter 实例。在这里,可以在发送downstream请求之前或之后修改requests和responses,可以实现鉴权、访问日志记录,接口耗时记录等功能

工作流程

Geteway Client请求 Spring Cloud Gateway,如果Gateway Handler Mapping确定请求与路由匹配,该请求被发送到Gateway Web Handler。此Handler运行时发送请求到具体的请求,其中通过过滤器链。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执行“post”过滤器逻辑。
Gateway Client:泛指外部请求,例如浏览器、app、小程序等 Proxied Service:指的是被网关代理的微服务

理解:即请求Gateway,先断言,断言为true才会往下走,经过过滤器链,到达具体的请求。断言的方式有很多详情查看官方文档

集成项目

引入依赖

1、创建gatway项目,引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

开启服务注册发现

2、开启服务注册发现(配置nacos的注册中心地址),先把getway注册到nacos,参考谷粒商城分布式基础篇二,然后启动getway项目,可能会报错

Failed to configure a DataSource: ‘url’ attribute is not specified andno embedded datasource could be configured.

异常信息

这是因为在 pom.xml 配置文件中,配置了数据连接技术 spring-boot-starter-jdbc 包 ,在启动配置文件时 ,Spring Boot 的自动装配机制就会去配置文件中找,相关的数据库的连接配置信息,如果找不到则抛出
异常信息。

解决方案:一:去除数据源依赖。这里选择第二种,在主启动类加上排除dataSource的自动注解

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

配置测试

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu

        - id: qq_eoute
          uri: https://www.qq.com
          predicates:
            - Query=url,qq

#  在application.yml中配置spring.cloud.gateway路由规则,这里配置的是Query Route Predicate Factory,查询路由
#  - yml文件数组格式,可以配置多个路由,id唯一,uri为匹配路由成功后转发地址
#  predicates断言,查询路由,Query为固定,也可以配置多个,两个参数:一个请求参数,可选的正则表达式

#bootstrap.properties配置

#服务名称
spring.application.name=项目名
#nacos config 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#nacos discovery 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#nacos config 命名空间ID
spring.cloud.nacos.config.namespace=ID
#nacos discovery 命名空间ID
spring.cloud.nacos.discovery.namespace=ID
#服务端口号
server.port=88

接下来则可以发送请求测试

例:http://localhost:88/hello?url=baidu
会转发到:https://www.baidu.com/hello
即断言为true,转发到之前所配置的uri加上?前输入的路径
posted on 2023-03-09 21:30  共感的艺术  阅读(101)  评论(0编辑  收藏  举报