【SpringCloud组件——GateWay】

news2025/3/1 9:31:44

前言:

在我们之前所用的Nacos和Feign以及Eureka,这些组件都是用与系统内部之间进行互相访问的,但是当用户访问系统时,我们没有采取任何措施,举个例子:系统管理员可以访问哪些接口并具备哪些操作权限,普通用户又可以访问哪些接口以及访问权限。这些我们都是没有做限制的,因此,我们需要一个组件来对访问的请求进行一些处理,这就可以使用我们接下来要讲的GateWay了。

一、网关(GateWay)的作用

1、身份认证和权限校验

对用户的身份信息以及操作权限进行校验。

2、服务路由、负载均衡

将用户发送的请求路由到某个微服务,如果该微服务存在多个实例,路由时就会采用负载均衡。

3、请求限流

当请求过载时,就会限制请求的路由量。

二、GateWay搭建

1、导入依赖

         <!--gateway网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- nacos客户端依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

 2、编写路由配置及Nacos地址

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:80
    gateway:
      routes: #配置路由规则
        - id: user-service #路由标识,必须唯一
          uri: lb://userservice #路由的目标地址 lb表示loadBalance(负载均衡)
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/** #判断路径是否是以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

 3、启动微服务,查看Nacos控制台微服务实例详细信息

 我们启动了三个userService实例和一个orderService实例。

4、通过网关访问微服务系统

4.1、浏览器输入地址:

http://localhost:10010/user/1
http://localhost:10010/order/101

4.2、查看页面响应:

 

 4.3、查看系统后台控制台信息

我们分别输入用户id为1、2、3,访问三次,查看控制台信息得知,此时gateway的负载均衡采用的是随机规则,即将请求随机发送给某服务的某个实例。

4.4、流程图

 4.5、总结

三、路由断言工厂

 1、Spring当中为我们提供的断言规则有哪些

 2、案例演示(Before和After)

2.1、order-service断言配置

        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
            - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

 2.2、user-service断言配置

        - id: user-service #路由标识,必须唯一
          uri: lb://userservice #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/** #判断路径是否是以/user开头,如果是则符合
            - After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

 2.3、浏览器测试

系统测试时间:

(1)order-service

 (2)user-service

(3)结论

断言规则After表示,请求访问时间是否在此时间之后,如何是,则允许请求路由到微服务实例当中进行处理,否则404.

断言规则Before表示,请求访问时间是否在此时间之前,如果是,则允许请求路由到微服务实例当中进行处理,否则404.

3、总结

四、路由过滤器(GatewayFilter)

1、路由过滤器的作用

 用户发送的请求,首先会抵达网关,网关并不会直接将请求路由到对应的微服务当中去执行,而是将请求传递给过滤器,由过滤器对请求做出一系列处理之后才转发到微服务当中,同理,微服务处理完请求后也不会直接将响应传递到路由上,也是经过一系列过滤器之后才抵达路由,由路由对用户的访问进行响应。

 2、如何实现

案例一(局部——添加请求头信息):

(userService)网关配置:

        - id: user-service #路由标识,必须唯一
          uri: lb://userservice #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/** #判断路径是否是以/user开头,如果是则符合
          filters:
            - AddRequestHeader=Truth,ZYP IS SO aowsome!

userController代码调整:

    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,
                          @RequestHeader(value = "Truth",required = false) String truth) {
        System.out.println(truth + ">>>>>>>>>>>>>>>>");
        return userService.queryById(id);
    }

效果验证:

 案例二(全局——添加请求头信息):

全局网关配置:

    gateway:
      routes: #配置路由规则
        - id: user-service #路由标识,必须唯一
          uri: lb://userservice #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/** #判断路径是否是以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
      default-filters:
        - AddRequestHeader=Truth,My mother holds a special place in my heart.

效果验证:

五、全局过滤器(GlobalFilter)

全局过滤器是对路由过滤器功能的一种补充和扩展。

@Component
@Order(0)//过滤器的顺序,越小优先级越高
public class AuthorizeFilter implements GlobalFilter{
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String,String> params = request.getQueryParams();
        //2.获取参数中的authorization参数
        String value = params.getFirst("authorization");
        //3.判断参数值是否为admin
        if (value.equals("admin")){
            //4.是就放行            
           //chain是过滤器链,调这个方法类似于找到这个过滤器的下一个过滤器,调用他的filter方法
            return chain.filter(exchange);
        }else {
            //5.否就拦截
            //5.1、设置状态码
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //5.2、拦截请求
            return exchange.getResponse().setComplete();
        }
    }
}

效果测试:

 总结:

 

 六、过滤器链的执行顺序

路由过滤器、DefaultFilter、GlobalFilter。

 

 七、跨域问题处理

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

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

相关文章

chatgpt赋能python:Python中0的SEO优化综述

Python中0的SEO优化综述 在Python编程中&#xff0c;数字0是一个非常重要的数值&#xff0c;它有许多用途和应用。在SEO优化中&#xff0c;合理地应用0可以帮助我们提高网站排名和用户体验。本文将介绍Python中0的一些具体应用以及如何进行合理的SEO优化。 0的应用 0作为标记…

张小飞的Java之路——第四十一章——File

写在前面&#xff1a; 视频是什么东西&#xff0c;有看文档精彩吗&#xff1f; 视频是什么东西&#xff0c;有看文档速度快吗&#xff1f; 视频是什么东西&#xff0c;有看文档效率高吗&#xff1f; 介绍 诸小亮&#xff1a;从今天开始&#xff0c;我们学习 IO 流 张小飞…

CAPL(vTESTStudio) - CAPL控制程控电源IT6332A

目录 为什么要使用CAPL控制程控电源? 一、程控电源的选择 二、程控电源通信协议

Junit5单元测试框架详解

前面我们学习了Selenium自动化测试框架&#xff0c;但是有的时候测试用例会很多&#xff0c;我们需要一个工具来管理这些测试用例&#xff0c;而Junit就是一个很好的管理工具&#xff0c;简单点来说&#xff0c;Junit就是一个针对Java的单元测试框架&#xff1b; 目录 一. 关于…

凸优化系列——凸集

1.最优化问题概述 最优化问题是决策问题&#xff0c;选择一些可以执行的策略使得目标最优;一个最优化问题包括 决策变量;一个或多个目标函数;一个由可行策略组成的集合&#xff0c;可由等式或者不等式刻画; 最优化问题的形式&#xff1a; 最优化问题的分类 无约束优化问题和…

【C++】函数 - 定义,调用,值传递,常见样式,声明,分文件编写

文章目录 1. 函数的定义2. 函数的调用3. 值传递4. 常见的样式5. 函数的声明6. 函数的分文件编写 所谓数组&#xff0c;就是一个集合&#xff0c;里边存放了相同类型的数据元素。 特点1&#xff1a;数组中的每个数据元素都是相同的数据类型 特点2&#xff1a;数组是由连续的内存…

chatgpt赋能python:Python在SEO中的作用:不简单的搜索引擎优化工具

Python在SEO中的作用&#xff1a;不简单的搜索引擎优化工具 Python作为一种强大的编程语言&#xff0c;已经在各个领域中得到了广泛的应用。在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;Python也发挥了重要作用。 Python在SEO中的应用 程序化爬虫 很多SEO工…

(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)

目录 例子&#xff1a; 思路方法&#xff1a; ​编辑 &#xff08;分板块&#xff09;代码的实现&#xff1a; 一.字符串的获取&#xff08;3种简单的方法&#xff09; 1.用gets&#xff08;&#xff09;函数&#xff0c;即使中间有空格也会读取 2.用fgets&#xff08;&am…

RK3588平台开发系列讲解(项目篇)RKNN-Toolkit2 的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、RKNN-Toolkit2安装二、模型转换和模型推理三、性能和内存评估沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 NPU 是专门用于神经网络的处理单元。它旨在加速人工智能领域的神经网络算法,如机器视觉和自…

c#快速入门(2)

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;类、对象、类成员简介&#x1f449;&#x1f3fb;语句…

chatgpt赋能python:Python的不断循环:了解你需要知道的

Python的不断循环&#xff1a;了解你需要知道的 Python是一个流行的编程语言&#xff0c;它被许多开发者用于构建各种应用程序和工具。 在Python中&#xff0c;有一个常见的编程概念&#xff0c;它被称为“循环”。 循环可以让程序在不停止执行的情况下重复执行一些代码。 在本…

人体行为足力特征分析及其应用研究_kaic

第一章 绪论 随着社会现代化的发展和科技的不断进步&#xff0c;我国航天事业蓬勃发展&#xff0c;与此同时产生了很多亟待解决的难题&#xff0c;康复医疗成为航天医学和康复领域的重要课题之一。载人航天实践证明&#xff0c;失重对航天员生理功能有很大影响&#xff0c;这不…

(2020)高频成分有助于解释卷积神经网络的泛化

High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 高频成分 & CNN 的泛化 3.1 CNN 利用高频成分 3.2 鲁棒性和准确性之间的权衡 4. 在重新思考泛化之前…

安装远程软件rustdesk中报错 Error! Could not locate dkms.conf file. File: does not exist.

解决方法 省流&#xff1a;uname -r 查看当前内核&#xff0c;找到/usr/src/目录下的多余的内核文件&#xff0c;删除残留多余的内核文件 原因可能是当时安装nvidia显卡驱动的时候没删除掉旧的内核文件&#xff0c;某些模块或驱动程序可能与特定内核版本相关联&#xff0c;如…

chatgpt赋能python:Python中5!怎么算的?一篇简易教程

Python中5&#xff01;怎么算的&#xff1f;一篇简易教程 在Python中&#xff0c;可以使用一段小小的代码来进行阶乘的计算。本篇文章将带领您了解如何使用Python计算5的阶乘&#xff0c;为您的程序设计带来便利。 介绍 计算阶乘是一项非常基础的数学计算&#xff0c;它常常…

django+python协同过滤推荐算法网上购物商城系统的n9u33

本毕业设计的内容是设计实现一个基于 Django框架的智能推荐算法。它是以 Python语言&#xff0c;MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。智能推荐算法的功能已基本实现&#xff0c;主要包括用户、商品分类、购物商品、订单等。本项目软件架构选择…

《数据库应用系统实践》------ 包包销售系统

系列文章 《数据库应用系统实践》------ 包包销售系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#xff…

vector的实现(c++)

前言 vector是很重要的数据结构&#xff0c;所以了解它的底层的核心原理是很有必要的&#xff0c;如何了解它的底层原理呢&#xff1f;除了阅读原码外&#xff0c;自己实现一下vector的核心逻辑也是不错的选择。 目录 1.四个默认成员函数 2.迭代器的实现 3.增删查改 4. 容…

栈踩踏实验

程序的存储结构 分布 在磁盘和内存中的分布如下&#xff1a; 节视图 .data&#xff1a;已经初始化的全局变量/局部静态变量 .bss&#xff1a;未初始化的全局变量/局部静态变量 .got.plt&#xff1a;全局偏移量表&#xff0c;保存全局变量引用的地址 .rodata&#xff1a;只读…

2023 Idea 热部署 JRebel 插件激活方法

2023 Idea 热部署 JRebel 插件激活方法 1. 下载源代码 进入下面 github 地址 clone 代码到本地 https://github.com/Byron4j/JrebelLicenseServerforJava 2. 编译和打包 cd /Users/daixiaohu/Desktop/JrebelLicenseServerforJavamvn clean package3. 运行项目 cd target/jav…