SpringCloud之服务网关Gateway

一、微服务网关

1、什么是微服务网关

        在传统的单体架构中,我们只需要开放一个服务给客户端调用即可。

        但是微服务架构中是将一个系统拆分成多个微服务,不同的微服务一般会有不同的网络地址,客户端在访问这些微服务时必须记住几十甚至几百个地址,这对于客户端方来说太复杂也难以维护,而且一不小心就会出错,这在开发测试中深有体会。然而有了网关就不一样了:网关作为系统的唯一流量入口,所有请求都必须先经过网关,由网关将请求路由到合适的微服务。网关有以下几点好处:

  • 交互更简单:减少了客户端与各个微服务之间的交互次数
  • 授权认证:在网关上进行认证,再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
  • 安全 :只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护。

2、服务网关的基本功能

3、微服务架构中网关的位置

二、gateway概述

1、官网:spring-cloud-gateway

2、gateway是什么?(稍作了解)

        SpringCloud Gateway 是 Spring Cloud 的一个全新项目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,限流。

        SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

3、gateway能干什么?

        反向代理、鉴权、流量控制、熔断、日志监控......

4、为什么选择gateway作为网关?

        从商业方面来说,一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖。另一方面虽然Netflix早就发布了最新的 Zuul 2.x,但 Spring Cloud 貌似没有整合计划。而且Netflix相关组件都宣布进入维护期,不知前景如何?

        从技术层面来说,Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。而且很多功能Zuul都没有用起来,而gateway用起来非常的简单便捷。

        多方面综合考虑Gateway是很理想的网关选择。

三、Spring Cloud Gateway网关路由环境搭建

1、引入依赖

    <properties>
        <spring-boot.version>2.3.2.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
    </properties>
 
    <!-- 添加依赖 -->
    <dependencyManagement>
        <dependencies>
            <!-- 声明springBoot版本 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 声明springCloud版本 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 声明 springCloud Alibaba 版本 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 引入gateway网关,这里一定要排除spring-boot-starter-web依赖,否则启动会报错  -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

2、配置yml文件

server:
  port: 8090
spring:
  application:
    name: cloud-gateway

        到这里环境也就搭建完成了,其实就是在创建一个boot项目,然后在其中引入了一个gateway网关的依赖,注意在pom文件中需要排除spring-boot-starter-web依赖,否则启动会报错。

        接下来我们一起来看一下yml中如何具体进行gateway网关的配置:

四、gateway三大配置项

1、Route(路由)

        路由是构建网关的基本模块,它由ID,目标URI,断言集合和过滤器集合组成,如果断言为true,则转发到该路由。

  • id:路由标识,要求唯一,名称任意(建议配合服务名)
  • uri:请求最终被转发到的目标地址
  • order: 路由优先级,数字越小,优先级越高
  • predicates:断言数组(判断条件),路径相匹配的进行路由
  • filters:过滤器数组,可以在返回请求之前或之后时修改请求和响应的内容。

2、Predicate(断言)

        断言(Predicate)是基于Spring WebFlux的HandlerMapping实现的。Gateway包含了很多路由断言工厂(spring-cloud-gateway内置的断言),并且这些工厂对应着HTTP请求的很多属性进行了处理,当客户端发送HTTP请求时,HandlerMapping会获取请求参数,并与Gateway中配置的Predicates进行比对,若满足规则就按规则约定进行路由放行,否则拒绝访问或报404错误。

上述断言的种类有十一中,这里以其中几种为例介绍一下如何配置使用:

spring:
  cloud:
    gateway:
      routes:  # 路由数组,当请求满足什么样的断言时,转发到哪个微服务上
        - id: payment_route1     #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后被转发的路由地址
          # 设置断言
          predicates:    
            # Path Route Predicate Factory 断言,满足/payment/get/** 路径的请求都会被路由到 http://localhost:8001 这个uri中
            - Path=/payment/get/**

        - id: payment_route2     #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后被转发的路由地址
          # 设置断言
          predicates:
             - Path=/payment/lb/**         # 断言,路径相匹配的进行路由
             - After=2023-01-08T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由

3、Filter(过滤)

        指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星悦糖

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值