SpringCloud学习—— 网关GateWay

Posted Johnny*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud学习—— 网关GateWay相关的知识,希望对你有一定的参考价值。

网关在微服务中的位置

在这里插入图片描述

Zuul1.x模型

Spring Cloud所集成的zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型
在这里插入图片描述

在这里插入图片描述

SpringCloud Gateway

传统的Web框架,像struct2、springmv 等都是 基于Servlet API 和Servlet容器运行的。
但是在Servlet3.1之后增加了异步阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty、Undertow及支持Servlet3.1的容器上。
SpringCloud GateWay是基于WebFlux框架实现的,而WebFlux框架底层则使用高性能的Reactor模式通信框架Netty。
Spring Cloud GateWay 的目标是提供统一的路由方式且基于Filter链的方式提供网关基本的功能,例如: 安全、监控/指标和 限流。

SpringCloud Gateway的特性

Gateway 是基于异步非阻塞模型,性能方面表现较好。

  1. 动态路由:能够匹配任何请求的属性
  2. 可以对路由指定断言(predicate)和过滤器(Filter)
  3. 继承Hystrix的断路器功能
  4. 继承SpringCloud的服务发现功能
  5. 请求限流功能
  6. 支持路径重写

Spring Cloud Gateway和Zuul的区别

在这里插入图片描述

三大核心概念

Route 路由

路由是构建网关的基本模块,由ID、目标URI、一系列的断言和过滤器组成,如果断言为true则匹配该 路由。

Predicate 断言

开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

Filter 过滤器

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

Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.
springcloud gateway的内部是通过netty+webflux实现的,webflux实现和springmvc配置依赖冲突。

Gateway路由配置

引入依赖:

    <!--注意: 不需要spring web
         否则webflux(gateway的技术支持)实现会和springmvc(spring web)配置依赖冲突。
         -->
        <!-- gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

在这里插入图片描述
配置路由转发之后
访问http://localhost:9527/payment/get/35会通过路由转发到http://localhost:8001/payment/get/35

动态路由

在这里插入图片描述

在application.yaml处,将uri: http://localhost:8001修改为uri: lb://cloud-payment-service。即lb://服务名

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service    #lb 表示负载均衡 匹配后提供服务的路由地址
          predicates:
            - Path=/provider/payment/get/**         # 断言,路径相匹配的进行路由
        - id: payment_routh2
          uri: lb://cloud-payment-service
          predicates:
            - Path=/provider/payment/lb

在这里插入图片描述

在这里插入图片描述

自定义filter

定义filter类实现两个接口: Ordered和GlobalFilter

package com.johnny.springcloud.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * @author Johnny Lin
 * @date 2021/6/27 0:25
 */
@Component
@Slf4j
public class MyLogGatewayFilter implements Ordered, GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("************* com in MyLogGatewayFilter "+ new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if( uname == null){
            log.info("*****用户名为null, 非法用户 o(╥﹏╥)o");
            //设置响应状态码
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        //放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0; // 值越小 优先级越高
    }
}

以上是关于SpringCloud学习—— 网关GateWay的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud——Gateway(服务网关的学习和使用)

SpringCloud——Gateway(服务网关的学习和使用)

SpringCloud——Gateway(服务网关的学习和使用)

重学SpringCloud系列九微服务网关-GateWay

springcloud-Finchley学习笔记-gateway网关自定义过滤器

SpringCloud学习第八篇:gateway学习(Hoxton.SR4)