【SpringCloud-5】gateway网关

news2024/10/6 10:31:34

网关是干啥用的就不用再说了。 sringcloud中的网关,第一代是zuul,但是性能比较差(1.x是阻塞式的,2.x是基于Netty的),然后有了第二代GateWay,基于Reactor模型 异步非阻塞。

 springcloud网关就是一系列的filter,在请求到达真实服务的前后,进行拦截处理。

 

GateWay核⼼逻辑:路由转发+执⾏过滤器链

客户端向GateWay发出请求,然后在GateWay Handler Mapping中 找到与请求相匹配的路由,将其发送到GateWay Web Handler;Web Handler再通过指定的过滤器链来将请求发送到我们实际的服务执⾏业务逻辑,然后返回。

Filter “pre” 类型过滤器中可以做参数校验、权限校验、流量监控、⽇志输出、协议转换等,在“post” 类型的过滤器中可以做响应内容、响应头的修改、⽇志的输出、流量监控等。

 

GateWay搭建使用:

引入依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--GateWay 网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--引入webflux-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!--日志依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok工具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>

        <!-- Actuator可以帮助你监控和管理Spring Boot应用-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

yml配置:

server:
  port: 9002
eureka:
  client:
    serviceUrl: # eureka server的路径
      defaultZone: http://lagoucloudeurekaservera:8761/eureka/,http://lagoucloudeurekaserverb:8762/eureka/ #把 eureka 集群中的所有 url 都填写了进来,也可以只写一台,因为各个 eureka server 可以同步注册表
  instance:
    #使用ip注册,否则会使用主机名注册了(此处考虑到对老版本的兼容,新版本经过实验都是ip)
    prefer-ip-address: true
    #自定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
spring:
  application:
  name: lagou-cloud-gateway
  cloud:
    gateway:
      routes: # 路由可以有多个
        - id: service-autodeliver-router # 我们自定义的路由 ID,保持唯一
          #uri: http://127.0.0.1:8096  # 目标服务地址  自动投递微服务(部署多实例)  动态路由:uri配置的应该是一个服务名称,而不应该是一个具体的服务实例的地址
#uri以 lb: //开头(lb代表从注册中⼼获取服务)
          uri: lb://lagou-service-autodeliver                                                                    # gateway网关从服务注册中心获取实例信息然后负载后路由
          predicates:                                         # 断言:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默 认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
            - Path=/autodeliver/**
        - id: service-resume-router      # 我们自定义的路由 ID,保持唯一
          #uri: http://127.0.0.1:8081       # 目标服务地址
          #http://localhost:9002/resume/openstate/1545132

          #http://127.0.0.1:8081/openstate/1545132
          uri: lb://lagou-service-resume
          predicates:                                         # 断言:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默 认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
            - Path=/resume/**
          filters:
            - StripPrefix=1

注意:上面yml中有个配置:- StripPrefix=1,就是指定了一个StripPrefix过滤器,它的作用是除去url中的第1个前缀。 假如url为 /resume/test/xxx,真实访问到服务的url就没有/resume了。    另外,还有一个过滤器PrefixPath作用相反,如果配置: -  PrefixPath=/user,那么真实访问的url会在最前面加上/user。

GateWay路由规则:

置了很多 Predicates功能,实现了各种路由匹配规则(通过 Header、请求参数等作为条件)匹配到对应的路由。

 下面来具体看看每一种如何配置:

  • 时间点后匹配(请求时间在该时间点后的):
    • spring:
        cloud:
          gateway:
            routes:
              - id: after_route
                uri: https://example.org
                predicates: 
                  - After=2017-01-20T17:42:47.789-07:00[America/Denver]
  • 时间点前匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: before_route
                uri: https://example.org
                predicates: 
                  - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
  • 时间区间匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: between_route
                uri: https://example.org
                predicates: 
                  - Between=2017-01-20T17:42:47.789-07:00[America/Denver],
      2018-01-20T17:42:47.789-07:00[America/Denver]
  • 指定cookie匹配(cookie中有authToken的):
    • spring:
        cloud:
          gateway:
            routes:
              - id: cookie_route
                uri: https://example.org
                predicates: 
                  - Cookie=authToken
  • 指定header匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: header_route
                uri: https://example.org
                predicates: 
                  - Header=X-Request-Id
  • 指定host匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: host_route
                uri: https://example.org
                predicates: 
                  - Host=Host=**.somehost.org,**.anotherhost.org
  • 指定method匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: method_route
                uri: https://example.org
                predicates: 
                  - Method=GET,POST
  • 请求路径匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: path_route
                uri: https://example.org
                predicates: 
                  - Path=/red/{segment},/blue/{segment}
  • 请求包含某参数匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: query_route
                uri: https://example.org
                predicates: 
                  - Query=green
  • 远程地址匹配:
    • spring:
        cloud:
          gateway:
            routes:
              - id: remoteaddr_route
                uri: https://example.org
                predicates: 
                  - RemoteAddr=192.168.1.1/24
  • 动态路由-就是除了gateway自带的,我们可以自己定义,就像上面yml文件中那样

GateWay 过滤器:
 
作用时机划分:
pre:
前置过滤器,请求到达服务之前作用。我们可利⽤这种过滤器实现身份验证、在集群中选择 请求的微服务、记录调试信息等。
post:
后置过滤器,请求从服务返回之后作用。这种过滤器可⽤来为响应添加标准的 HTTP Header 、收集统计信息和指标、将响应从微服务发送给客户端等。
作用范围划分:
GateWayFilter:应用到单个路由。
GlobalFilter:应用到所有路由。
GlobalFilter用的最多,下面自定义一个全局过滤器(实现GlobalFilter即可):
当请求过来时,判断发送请求的客户端的 ip ,如果在⿊名单中,拒绝访问。
package com.lagou.edu.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.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;

/**
 * 定义全局过滤器,会对所有路由生效
 */
@Slf4j
@Component  // 让容器扫描到,等同于注册了
public class BlackListFilter implements GlobalFilter, Ordered {

    // 模拟黑名单(实际可以去数据库或者redis中查询)
    private static List<String> blackList = new ArrayList<>();

    static {
        blackList.add("0:0:0:0:0:0:0:1");  // 模拟本机地址
    }

    /**
     * 过滤器核心方法
     * @param exchange 封装了request和response对象的上下文
     * @param chain 网关过滤器链(包含全局过滤器和单路由过滤器)
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 思路:获取客户端ip,判断是否在黑名单中,在的话就拒绝访问,不在的话就放行
        // 从上下文中取出request和response对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();

        // 从request对象中获取客户端ip
        String clientIp = request.getRemoteAddress().getHostString();
        // 拿着clientIp去黑名单中查询,存在的话就决绝访问
        if(blackList.contains(clientIp)) {
            // 决绝访问,返回
            response.setStatusCode(HttpStatus.UNAUTHORIZED); // 状态码
            log.debug("=====>IP:" + clientIp + " 在黑名单中,将被拒绝访问!");
            String data = "Request be denied!";
            DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
            return response.writeWith(Mono.just(wrap));
        }

        // 合法请求,放行,执行后续的过滤器
        return chain.filter(exchange);
    }


    /**
     * 返回值表示当前过滤器的顺序(优先级),数值越小,优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

过滤器定义好后,无须其他配置。 只要被spring容器扫描到成为一个bean,即可生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经理的工作岗位职责描述10篇

经理的工作岗位职责描述&#xff08;篇1&#xff09; 1、销售工具的开发和制作 2、负责各类媒体、渠道的软文撰写&#xff0c;产品信息推广; 3、筹办重点客户&#xff0c;潜在客户的讲座论坛会议; 4、市场推广活动&#xff1a;展会seminar oadshow等活动 5、产品上市沟通&#…

IIC协议通信解析,内附完整代码。

一&#xff1a;硬件接口 1.1&#xff1a;功能引脚 1.2&#xff1a;IIC总线通信注意事项 二&#xff1a;通信协议 &#xff08;1&#xff09;空闲状态&#xff1a; &#xff08;2&#xff09;起始位&#xff1a; &#xff08;3&#xff09;有效数据位 &#xff08;4&#x…

最近跳槽,压力真大...

前几天&#xff0c;跟个老朋友吃饭&#xff0c;他最近想跳槽去大厂&#xff0c;觉得压力很大&#xff0c;问我能不能分享些所谓的经验套路。 每次有这类请求&#xff0c;都觉得有些有趣&#xff0c;不知道你发现没有大家身边真的有很多人不知道怎么面试&#xff0c;也不知道怎…

【玩转Docker小鲸鱼叭】MacOS系统配置Docker镜像加速器

当我们通过 docker pull拉取镜像时&#xff0c;如果不指定仓库&#xff0c;默认从 Docker Hub &#xff08;docker.io&#xff09;获取镜像&#xff0c;而国内用户访问Docker Hub仓库时&#xff0c;通常速度很忙&#xff0c;经常超时导致拉取镜像失败&#xff0c;所以通常要通过…

上海亚商投顾:沪指震荡调整 CPO概念股持续大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡调整&#xff0c;保险等权重板块走低&#xff0c;上证50跌超1.5%&#xff0c;创业板指较为抗跌。CPO、…

【新固态格式化】

新固态格式化 初始化硬盘 从管理进入磁盘管理 Windows 7及其以后的系统建议使用GPT MBR 是 Master Boot Record 的缩写&#xff0c;是一种传统而常用的磁盘布局。GPT 是 Globally Unique Identifier Partition Table 的缩写&#xff0c;是一种与 UEFI 相关的新磁盘布局。其…

Day23 实战篇 ——Jmeter压力测试实战

Day23 实战篇 ——Jmeter压力测试实战 文章目录 Day23 实战篇 ——Jmeter压力测试实战一、分布式压测原理二、分布式环境配置Slaves机器配置Master机器配置参数化文件配置三、分布式压测执行Slave机器执行Master机器执行四、常见问题处理问题一问题二问题三问题四项目中使用Jme…

redis缓存设计-Redis(八)

上篇文章介绍了redis缓存设计&#xff0c;热点key&#xff0c;bigkey注意事项。 原创 redis缓存设计-Redis&#xff08;七&#xff09;https://blog.csdn.net/ke1ying/article/details/131268967 命令使用 hgetall&#xff0c;lrange&#xff0c;smembers&#xff0c;zrange…

【初识Linux】——01Linux系统

目录索引 Linux介绍&#xff1a;Linux历史&#xff1a;Linux系统应用&#xff1a;*服务器系统&#xff1a;**嵌入式系统&#xff1a;**桌面应用系统&#xff1a;**版本&#xff1a;* Linux系统的安装&#xff1a;虚拟机&#xff1a;安装VMware&#xff1a;安装centOS操作系统&a…

【AI实战】开源可商用的中英文大语言模型baichuan-7B,从零开始搭建

【AI实战】开源可商用的中英文大语言模型baichuan-7B&#xff0c;从零开始搭建 baichuan-7B 简介baichuan-7B 中文评测baichuan-7B 搭建参考 baichuan-7B 简介 baichuan-7B 是由百川智能开发的一个开源可商用的大规模预训练语言模型。基于 Transformer 结构&#xff0c;在大约…

解决安卓12限制32个线程

Android 12及以上用户在使用Termux时&#xff0c;有时会显示[Process completed (signal 9) - press Enter]&#xff0c;这是因为Android 12的PhantomProcesskiller限制了应用的子进程&#xff0c;最大允许应用有32个子进程。 这里以ColorOS 12.1为例&#xff08;其他系统操作略…

状态机编程实例-嵌套switch-case法

嵌入式软件开发中&#xff0c;状态机编程是一个比较实用的代码实现方式&#xff0c;特别适用于事件驱动的系统。 本篇&#xff0c;以一个炸弹拆除的小游戏为例&#xff0c;介绍状态机编程的思路。 C/C语言实现状态机编程的方式有很多&#xff0c;本篇先来介绍最简单最容易理解…

uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器

前言 最近在使用uni-app写H5移动端&#xff0c;有一个从手机拍摄从相册选择获取图片上传到文档服务器功能。 查阅uni-app发现关于上传图片&#xff0c;uni-file-picker文件上传&#xff0c;uni.chooseImage&#xff0c;uni.uni.uploadFile 它和pc端原理差不多&#xff0c;都是…

5年测试经验,测试老鸟总结功能测试——全测试点覆盖

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 功能测试主要包括…

使用vscode编写并运行typescript代码

1.安装vsCode Visual Studio Code - Code Editing. Redefined 2.安装nodejs 下载 | Node.js 中文网 3.打开vscode&#xff0c;在vscode里面打开终端&#xff08;快捷键是ctrl~) 查看是否成功安装node和npm&#xff1a; node -v npm -v 在终端中输入如下命令并…

ELK详细安装配置

1.安装jdk1.8&#xff08;略&#xff09; 2.安装配置本机防火墙&#xff08;略&#xff09; 3.ELK版本选择 参考&#xff1a;支持一览表 | Elastic 选择支持java8的版本 4.版本6安装 root依次用户执行 wget https://artifacts.elastic.co/downloads/elasticsearch/elast…

C++基础(1)——程序内存模型和引用

前言 本文主要介绍了C中内存模型的四区及存放的数据&#xff0c;引用的基本语法。 1.1&#xff1a;代码区&#xff08;程序运行前&#xff09; 1&#xff1a;存放CPU执行的机器指令 2&#xff1a;代码区是共享的&#xff0c;共享的目的是对于频繁被执行的程序&#xff0c;只…

在Centos Stream 9上Docker的实操教程(七) - Docker上实现MYSQL实现主从复制

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

第3章 作业(268EF)【网络安全】

第3章 作业【网络安全】 前言推荐第3章 作业268EF如何不用计算机计算求模 最后 前言 2023-6-19 15:49:17 以下内容源自《网络安全》 仅供学习交流使用 推荐 第2章 作业&#xff08;2456&#xff09;【网络安全】 第3章 作业 2 3.2什么是MAC? MAC&#xff1a;消息认证码…

网页设计实习周记范文5篇(合集)

网页设计实习周记(一) 本周主要是做网站维护更新。 网站要注意经常维护更新内容&#xff0c;保持内容的新鲜&#xff0c;不要一做好就放在那儿不变了&#xff0c;只有不断地给它补充新的内容&#xff0c;才能够吸引住浏览者。 通过目前的实习&#xff0c;在设计方面我感觉自己有…