自学内容网 自学内容网

【微服务】网关 - Gateway(day7)

概述

引入

在前几个系列中,使用Eureka、Consul、Nacos解决了服务注册、服务发现的问题;使用SpringCloudLoadBalancer解决了负载均衡的问题;使用OpenFeign解决了远程调用的问题。

但是现在所有的微服务接口都是直接对外暴露的,可以直接通过外部访问。为了保证对外服务的安全性,服务端实现的接口都带有一定的权限校验机制。由于使用了微服务,我们不得不实现多次校验逻辑,当需要修改时,我们需要修改多个应用,加重了开发人员的负担。

对于这个问题,SpringCloud开发了网关组件。网关组件是后端服务的唯一入口,所有的请求访问后端接口时,都需要先到网关,然后网关进行校验和分发。

最开始,SpringCloud整合的网关组件是Netflix公司的Zuul组件,由于该公司宣布进入维护状态,不再进行新特性的开发。所以SpringCloud就自研了一款网关组件来替换Zuul,新组件的名称就是SpringCloudGateway。官方出具的测试报告表明Gateway比Zuul要快许多。

功能

权限控制:作为微服务的入口,对用户进行权限校验,如果校验失败则进行拦截。

动态路由:一切请求先经过网关,网关根据某种规则,把请求转发到对应的微服务上。

负载均衡:当路由的服务实例有多个时,网关还要进行负载均衡的处理。

限流:请求流量过高时,网关还能按照配置进行限流处理,防止服务压力过大。

网关还有许多的功能,这里就不过多进行介绍。

三大核心

路由:路由是构建网关的基本模块(毕竟网关的关键作用就是将客户端发来的所有请求按照规则发送到对应的微服务模块上),路由是由ID、目标URI、一系列的断言和过滤器组成的,如果断言为真则匹配该路由。

断言:断言其实就是一系列的规则,如果请求满足规则,才会进行路由。

过滤:表示GatewayFilter的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改。

总的来说,网关的大致服务流程就是:客户端先向网关发出请求,其次网关会根据断言找到符合的请求,然后网关会去执行过滤器,最后才会发送到服务中进行访问。访问完成之后,会再次执行过滤器的操作,然后返回到客户端。

代码案例

在此案例中,我们使用上一文章中建立的商品模块和订单模块配合这篇文章中新的网关模块一起进行测试,从而验证网关的作用。

建模块

写pom依赖

网关服务也要注册到服务中心中,因此引入nacos依赖;网关服务肯定要引入自己的依赖;网关服务还能负载均衡,因此引入负载均衡的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.wbz</groupId>
        <artifactId>spring-cloud-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-gateway-9527</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!--注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

    </dependencies>

</project>

写yml文件

server:
  port: 9527

spring:
  application:
    name: cloud-gateway-9527

  cloud:
    
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${spring.application.name}

    gateway:
      routes:
        - id: cloud-consumer-order-open-feign-84
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/order/**

gateway中配置文件的简单介绍:

id,类似于MySQL的主键,没有固定的规则但是要求唯一,建议使用服务名。

uri,路由匹配之后要路由去的地址,可以使用IP+端口号的格式,如果想要负载均衡,那就使用lb://服务名的格式。

 predicates,断言,下面有一系列的规则,匹配之后才可以进行路由。

改主启动类

@SpringBootApplication
public class GatewayApplication9527 {

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

}

把下述三个模块启动之后,去Nacos中心观察状态:

在浏览器中输入URL:127.0.0.1:9527/order/query/1,只要出现如下画面,就表示网关模块搭建成功。大家还可以输入127.0.0.1:9527/product/query/1001,发现报错,原因就是因为在网关中只配置了对订单服务的配置文件,并没有配置对商品服务的配置文件。

断言

断言其实就是一系列的规则,请求在匹配规则成功之后才会去进行路由。在SpringCloudGateway中,存在RoutePredicateFactories,即路由断言工厂。我们配置文件中的规则,最终会被路由断言工厂读取并处理,转变为路由判断的条件。SpringCloudGateway提供了许多已经写好的路由断言工厂,这些断言会匹配HTTP请求的不同属性,并且多个断言可以通过and逻辑进行组合。当然也可以自定义一个自己想要的路由断言工厂。

配置语法

一共有两种配置语法,第一种是快捷配置方式,由过滤器名开头,后面跟等号,如果有参数的话使用逗号分隔;第二种是完全展开的配置方式,name表示过滤器名或参数名,args表示要配置的参数。

spring:

  cloud:

    gateway:
      routes:
        - id: cloud-consumer-order-open-feign-84
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/order/test1/**,/order/test2/{id}

        - id: cloud-provider-product-open-feign-8401
          uri: lb://cloud-provider-product-open-feign-8401
          predicates:
            - name: Path
              args:
                name[0]: /product/test1
                name[1]: /product/test2

常用断言

AfterRoutePredicate

表示设置一个时间,当真实时间超过该时间才可以进行访问。


原文地址:https://blog.csdn.net/weixin_73060900/article/details/142739896

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!