微服务:一篇博客带你学会Gateway(路由、过滤、跨域问题配置)

文章目录

  • Gateway
    • 搭建
    • 路由断言工厂
    • 路由过滤器
    • 全局过滤器
    • 过滤器执行顺序
    • 网关的core跨域配置
      • 跨域问题
      • 配置

Gateway

在这里插入图片描述

网关功能:

  • 身份认证、权限校验
  • 服务路由、负载均衡
  • 请求限流

搭建

gateway也算一个服务
所以创建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>

编写启动类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

编写配置:

server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定路由地址,不推荐使用uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面加服务名称predicates: # 路由断言,判断请求是否符合路由规则的条件- Path=/user/**   # 按照路径匹配,只要以/user/开头就符合要求- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**

这里路由user和order服务,可以根据注释自行模仿编写所有路由配置。

运行:
在这里插入图片描述

在这里插入图片描述

可以看到我们利用gateway,成功路由到了每个服务中。

利用gateway调用原理:
在这里插入图片描述

路由断言工厂

有十一种断言工厂
在这里插入图片描述

没必要都记住,用到的时候查就行,这里就不举例了。
不符合条件则请求404.

路由过滤器

对进入网关的请求和微服务返回的响应做处理。

在这里插入图片描述

一共有将近40种过滤器配置

在这里插入图片描述

也是不用记,需要的时候查即可,官网种都有样例配置。

例如请求头上加一共hello。
主要看filter位置:

server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址(指定固定路由地址)uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面加服务名称predicates: # 路由断言,判断请求是否符合路由规则的条件- Path=/user/**   # 按照路径匹配,只要以/user/开头就符合要求\filters:- AddRequestHeader=Truth, hello! # 添加请求头只对当前服务有效- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**

user服务中编写Controller,验证:

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

在这里插入图片描述

也可以直接配置 全部服务 的过滤
主要看default-filters位置,与routes同级,就是配置的全部服务。

server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址(指定固定路由地址)uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面加服务名称predicates: # 路由断言,判断请求是否符合路由规则的条件- Path=/user/**   # 按照路径匹配,只要以/user/开头就符合要求\- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**default-filters: # 默认过滤项- AddRequestHeader=Truth, hello!

全局过滤器

作用与一切进入的网关的请求和服务器响应。

与GatewayFilter作用一致,区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现,比较灵活。

例如,验证请求参数中,权限是否为admin,若是,放行。

//@Order(-1) // 过滤器优先级,越小越高
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 通过上下文获取请求ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> queryParams = request.getQueryParams();// 2. 获取authorization 参数String authorization = queryParams.getFirst("authorization");// 3. 判断是否是adminif ("admin".equals(authorization)) {// 是,放行return chain.filter(exchange); // 传递给下一个过滤链}// 否,设置状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); // 无权限// 拦截,返回return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return -1;}
}

过滤器优先级可以通过实现Rrdered接口,或用@Order注解,越小,优先级越高。

调用试试:

当参数不是admin时,401
在这里插入图片描述

通行,可以访问:
在这里插入图片描述

过滤器执行顺序

gateway三类过滤器:路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将 当前路由过滤器、DefaultFilter、GlobalFilter 合并到一个过滤器链中,排序后依次执行每个过滤器。

在这里插入图片描述

排序的规则:

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或添加@Order注解来指定order值
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

网关的core跨域配置

跨域问题

主要是因为浏览器保护机制同源策略,当域名、端口、协议不同时就会发生跨域问题。

简单来说,就是你去肯德基(网页)让店员去买一份麦当劳汉堡(跨域请求),虽然很不合理,但是店员还是去了(询问),虽然买回来了,但是店员不给你,因为这里是肯德基(不安全,被网页拦截)。

配置

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

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

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

相关文章

AIGC智能办公实战 课程,祝你事业新高度

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融分析&#xff0c;AI助手正在改变我们的工作方式和生活质量。那么&#xff0c;你是否想过自己也能从零开始&#xff0c;…

Redis学习笔记【实战篇--短信登录】

开篇导读 实战篇有什么样的内容 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&#xff0c;让小伙伴的对于这些概念的理解不仅仅是停留在概念上&#xff0c;更…

音视频直播(一)

协议基础篇 直播协议基础推流与拉流推流拉流 直播传输协议RTMP传输协议 && HTTP-FLV协议为什么RTMP做推流&#xff0c;反而很少做拉流&#xff1f;HTTP-FLV协议 RTSP协议HLS协议SRT协议 WebRTC协议应用于直播 直播协议基础 从网络上搜寻到的有关推流与拉流的示意图 从…

Java项目对接redis,客户端是选Redisson、Lettuce还是Jedis?

JAVA项目对接redis&#xff0c;客户端是选Redisson、Lettuce还是Jedis&#xff1f; 一、客户端简介1. Jedis介绍2. Lettuce介绍3. Redisson介绍 二、横向对比三、选型说明 在实际的项目开发中&#xff0c;对于一个需要对接Redis的项目来说&#xff0c;就面临着选择合适的Redis客…

如何从浅入深理解transformer?

前言 在人工智能的浩瀚海洋中&#xff0c;大模型目前无疑是其中一颗璀璨的明星。从简单的图像识别到复杂的自然语言处理&#xff0c;大模型在各个领域都取得了令人瞩目的成就。而在这其中&#xff0c;Transformer模型更是成为大模型技术的核心。 一、大模型的行业发展现状如…

QT5:调用qt键盘组件实现文本框输入

目录 一、环境与目标 二、Qt VirtualKeyboard 1.勾选Qt VirtualKeyboard 2.ui设计流程 3.注意事项及问题点 三、参考代码 参考博客 一、环境与目标 qt版本&#xff1a;5.12.7 windows 11 下的 Qt Designer &#xff08;已搭建&#xff09; 目标&#xff1a;创建一个窗…

二叉树的顺序实现-堆

一、什么是堆 在数据结构中&#xff0c;堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;用数组存储&#xff0c;通常被用来实现优先队列。 堆具有以下特点&#xff1a; 堆是一棵完全二叉树&#xff08;Complete Binary Tree&#xff09;&#xff0c;即…

下载安装nvm,使用nvm管理node.js版本

目录 一、下载安装nvm&#xff08;windows&#xff09; 二、使用nvm管理node.js版本 &#xff08;1&#xff09;nvm命令行 &#xff08;2&#xff09; 使用nvm管理node.js版本 ①查看nvm版本 ②显示活动的node.js版本 ③列出可供下载的node.js版本 ④安装node.js指定版本 ⑤列出…

HTML+CSS 响应式侧边栏菜单

效果演示 实现了一个响应式的侧边栏菜单,当用户点击菜单按钮时,菜单会从左侧滑出,同时页面内容会向右移动,展示菜单选项。菜单选项包括一个头像和用户名,以及其他的菜单项,当用户将鼠标悬停在菜单项上时,菜单项会高亮显示。这段代码使用了CSS的flex布局和过渡效果,以及…

Oracle登录时出现ERROR: ORA-01031 insufficient privileges

情况&#xff1a; 1.环境&#xff1a; - 操作系统版本&#xff1a;64位win10- Oracle版本&#xff1a;64位 oracle 11g解决方法&#xff1a; 利用DOS命令添加系统用户到ora_dba用户组 2.查看用户组 net localgroup–查看用户组&#xff1b; 3.查看ora_dba用户组下的具体用户&…

input输入框的一些复习

<template><div><div style"text-align: center;margin: 10px 0;"><span style"font-size: 15px;font-weight: bold;">input输入框的基本应用</span></div><el-descriptions :column"3" size"defau…

tinycudann安装

在安装完torch等 直接运行下面的指令会出现错误 pip install githttps://github.com/NVlabs/tiny-cuda-nn/#subdirectorybindings/torch大部分错误是下面的 大概看了一下都是因为虚拟环境里面的include文件下缺少文件&#xff0c;将之前的一些.h文件全部复制过来在执行上面的…

【vue3|第5期】Vue3响应式数据:ref 与 reactive 的深入解析

日期&#xff1a;2024年5月31日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

vue3 前端实现导出下载pdf文件

这样的数据实现导出 yourArrayBufferOrByteArray 就是后端返回数据 // 创建Blob对象const blob new Blob([yourArrayBufferOrByteArray], { type: application/pdf });// 创建一个表示该Blob的URLconst url URL.createObjectURL(blob);// 创建一个a标签用于下载const a doc…

Redis常用命令大全

目录 1、五大数据类型的基本命令 1.1 字符串 1.2 列表 1.3 哈希 1.4 集合 1.5 有序集合 2、与key相关 2.1 查看redis数据的类型 2.2 查看当前redis库中的所有key命令 3、除了五大数据类型外常见命令 3.1 键操作 3.2 服务器操作 3.3 连接操作 3.4 发布/订阅 3.5 事…

大模型时代的具身智能系列专题(六)

UCSD 王小龙组 王小龙是UCSD电子与计算机工程系的助理教授。他曾在加州大学伯克利分校与Alexei Efros和Trevor Darrell一起担任博士后研究员&#xff0c;在CMU RI获得了机器人学博士学位&#xff0c;师从Abhinav Gupta。他的研究重点是通过视频和物理机器人交互数据来学习3D和…

Vue 2.0使用Vue-count-to给数字添加增长动画

在开发后台管理系统时&#xff0c;时常会遇到数据汇总&#xff0c;为了页面展示更生动&#xff0c;用户体验更好&#xff0c;通常会对汇总的数字加一个逐步递增动画。 实现这个效果一般是用的 Vue-count-to这个插件&#xff0c;这是一款简单好用的一个数字滚动插件&#xff0c;…

如何申请微信支付0.2%-0.3%的手续费优惠? 详细步骤

随着微信支付在日常交易中的普及&#xff0c;许多商家开始关注如何降低支付手续费的问题。近期&#xff0c;微信支付推出了一项新的费率优惠政策&#xff0c;允许商家享受0.2%-0.3%的费率优惠。这一政策无疑为商家带来了实质性的成本节约。那么&#xff0c;商家如何申请这一费率…

如何在 c++ 里,让子类访问到父类的私有数据成员?答案之一:使用第三方友元类或友元函数

看 STL 库的代码时候&#xff0c;见有这种写法&#xff0c;感觉挺神奇的。故简化逻辑后&#xff0c;写个玩具验证一下。本来这是很别扭的做法。既然父类让数据成员私有了&#xff0c;还要让子类去调用&#xff0c;何苦呢&#xff1f;但看大师们的写法&#xff0c;果然 c 编译器…