统一网关--gateway(仅供自己参考)

news/2024/9/24 8:09:09/

1、网关的概念:

2、网关的功能:

  (1):身份认证和权限校验

    (2):服务路由(具体的业务路由到具体的服务),负载均衡(多台服务的话,服务之间进行负载均衡)

(3):请求限流(不能超过服务承受的最大请求)

3、springcloud中网关实现的两种方式:

(1):zuul

(2):gateway

两个的优缺点:zuul是基于servlet实现的阻塞式编程,而gateway是基于spring5提供的webflux实现的响应式的编程。gateway的性能比较好,吞吐量比较好

二、

1、gateway的基本配置

2、路由断言工厂(Route Predicates Factory):

  + :我们配置文件中配置的路由字符串规则会被factory路由工厂读取,然后将这些字符串规则转为判断条件。当有请求进入,看这个请求是否符合这些条件。符合则向服务器转发, 不符合则返回404

三、路由过滤器(GatewayFilter)可以对进入网关的请求和微服务的响应做处理

1、局部路由过滤器:(在相应路由的微服务生效)

添加方式:

    gateway:routes:- id: user-service  #路由id,唯一即可#uri: http://loaclhost:8080  目标地址也可以是这样,但常用的是下方的uri: lb://user-server  #路径的目标地址,lb负载均衡。user-service是具体的服务名称predicates:- Path=/user/**- id: order-serviceuri: lb://order-serverpredicates:- Path=/order/**default-filters:- AddRequestHeader=truth,cc is awesome #全局default
#          filters:
#            - AddRequestHeader=truth,cc is awesome  #局部

2、默认路由过滤器:default-filters(所有的微服务都可以生效)

3、全局过滤器(GlobalFilter):在已经有了一个default-filter全局的情况下为什么还需要这个全局的呢?因为全局过滤器可以更好地实现逻辑的处理。default-filter是配置的情况,复杂逻辑难以实现,所以产生了全局过滤器。

package org.example.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
@Order(1)   //设置过滤器的等级,越小等级越高,负数也可以
public class AuthGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();  //请求requestHttpHeaders headers = request.getHeaders();MultiValueMap<String, String> queryParams = request.getQueryParams(); //request中携带的参数String auth = queryParams.getFirst("auth"); //获取某一个参数if("admin".equals(auth))    //参数相等则继续到下一个过滤器{return chain.filter(exchange);  //放行}exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置响应codereturn exchange.getResponse().setComplete();    //拦截返回}
}

4、过滤器的执行顺序,局部和默认过滤器的order值为1,如果下面有多个则依次增大。

如果全局和局部和默认过滤器的order值相等的话,则依次按照默认->局部->全局的执行顺序

五、Gateway的cors的跨域问题:

跨域:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

跨域出现的情况:

  1. 不同协议:比如从 http://example.com 请求 https://example.com

  2. 不同域名:从 http://example.com 请求 http://another-domain.com

  3. 不同端口:从 http://example.com:80 请求 http://example.com:8080

解决方案:CORS

spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':  #拦截所有请求,所有请求都必须经过跨域allowedOrigins: # 允许哪些网站的跨域请求- "http://localhost:8090"- "http://www.leyou.com"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期


http://www.ppmy.cn/news/1529722.html

相关文章

2024.9.23 Python会议室,堆的使用,用最少数量的箭引爆气球,字典遍历的操作,找到字符串中所有字母异位词,丑数

1.会议室 II 给你一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;返回 所需会议室的最小数量 。 示例 1&#xff1a; 输入&#xff1a;intervals [[0,30],[5,10],[15,20]] 输出&#xff1a;2…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略&#xff08;CSP&#xff09;用于定义脚本和其他资源可以从何处加载或执行&#xff0c;本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞&#xff0c;它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

创新学生宿舍管理:Spring Boot框架实践

第2章 开发环境与技术 学生宿舍管理系统的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对学生宿舍管理系统用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xff0c;没…

力扣 困难 154.寻找旋转排序数组中的最小值 II

文章目录 题目介绍题解 题目介绍 题解 题源&#xff1a; 153.寻找旋转排序数组中的最小值 在此基础上&#xff0c;进行二分之前&#xff0c;单独处理一下左指针和最后一个数相同的情况就好了。 class Solution {public int findMin(int[] nums) {int left 0, right nums.le…

匈牙利算法详解与实现

匈牙利算法是一种高效的二分图最大匹配或最优分配算法&#xff0c;常用于解决任务分配问题&#xff0c;例如将工人分配给任务以最小化成本。该算法通过多步矩阵操作和调整来寻找最优匹配&#xff0c;保证了分配成本的最小化。 算法概述 1. 矩阵减法 首先对矩阵进行行列减法&a…

【JavaEE】——多重锁,死锁问题和解决思路

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;加锁的“可重入性” 1&#xff1a;问题引入 2&#xff1a;问题分析 3&#xff1a;可重…

新建flask项目,配置入口文件,启动项目

pycharm新建flask项目时&#xff0c;会提供一个创建flask项目的导向&#xff0c;自动设置虚拟环境&#xff0c;并且安装flask及其依赖而vscode新建flask项目时&#xff0c;需要手动设置虚拟环境并安装flask&#xff0c;需要在终端使用pip install flask命令来安装flask及其依赖…