当前位置: 首页 > news >正文

微服务技术栈-Gateway服务网关

文章目录

  • 前言
  • 一、为什么需要网关
  • 二、Spring Cloud Gateway
  • 三、断言工厂和过滤器
    • 1.断言工厂
    • 2.过滤器
    • 3.全局过滤器
    • 4.过滤器执行顺序
  • 四、跨域问题
  • 总结


前言

在之前的文章中我们已经介绍了微服务技术中eureka、nacos、ribbon、Feign这几个组件,接下来将介绍另外一个组件SpringCloud-Gateway,Gateway网关是我们服务的守门神,所有微服务的统一入口。


一、为什么需要网关

试着思考一下,我们后台的微服务是任何人都可以访问的吗?是否每个用户都有资格访问某个微服务?当微服务的数量越来越多时,我们该如何优雅的把每个请求转发到具体的某个微服务上?当请求的流量过大时,我们该如何泄洪?

因此我们需要一个网关服务,来帮助我们解决上述问题。

网关的核心功能特性

  • 请求路由:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
  • 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
  • 限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。
    在这里插入图片描述

二、Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式,基于响应式编程的实现,具备更好的性能。。
下面,我们就来搭建一下Spring Cloud Gateway,其基本步骤如下:
1.创建SpringBoot工程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.编写gateway启动类。

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

3.编写基础配置和路由规则。

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: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

上述的配置信息:将符合Path 规则的一切请求,都代理到 uri参数指定的地址。本例中,我们将 /user/**开头的请求,代理到lb://userservice,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。
在这里插入图片描述


三、断言工厂和过滤器

1.断言工厂

predicates: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件,例如Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个,有兴趣的可以自己在SpringCloudGateway的文档中学习。
在这里插入图片描述

2.过滤器

介绍完断言的概念之后,接下来我们来介绍一下过滤器的概念。GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
在这里插入图片描述
在这里插入图片描述
下面我们以请求头过滤器为例,给所有进入userservice的请求添加一个请求头。

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: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求filters: # 过滤器- AddRequestHeader=Truth, jinzihao is freaking awesome! # 添加请求头

注意:当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。接下来在方法中添加请求头参数,即可获取Truth的值。

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

如果要对所有的路由都生效,则可以将过滤器工厂写到default下,即默认过滤器。

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默认过滤项- AddRequestHeader=Truth, jinzihao is freaking awesome! 

总结:过滤器对路由的请求或响应做加工处理,配置在路由下的过滤器只对当前路由的请求生效,defaultFilters是对所有路由都生效的过滤器。

3.全局过滤器

SpringCloud-Gateway中提供了很多种过滤器,但每一种过滤器的作用都是固定的,如果我们希望拦截请求并做自己的业务逻辑,则可以使用全局过滤器。
全局过滤器的定义方式是实现GlobalFilter接口,并且重写里面的filter接口。

public interface GlobalFilter {/***  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理* @param exchange 请求上下文,里面可以获取Request、Response等信息* @param chain 用来把请求委托给下一个过滤器 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

4.过滤器执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter。
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器,过滤器的排序规则:

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

四、跨域问题

跨域:域名不一致就是跨域,主要包括以下两种情况:

  • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
  • 域名相同,端口不同:localhost:8080和localhost:8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。有关跨域问题的详情可以参考这篇文章跨域资源共享 CORS 详解

SpringCloud-Gateway解决跨域问题:在gateway服务的application.yml文件中,添加下面的配置。

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: # 路由断言,也就是判断请求是否符合路由规则的条件#  - After=2037-01-20T17:42:47.789-07:00[America/Denver]- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求filters: # 过滤器- AddRequestHeader=Truth, jinzihao is freaking awesome! # 添加请求头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 # 这次跨域检测的有效期

总结

在本篇文章中,我们又介绍了微服务技术栈的另外一个技术SpringCloud-Gateway,网关具有限流、路由、权限控制等作用,其重要性不言而喻,可以在更多实践中体会网关的魅力。


相关文章:

微服务技术栈-Gateway服务网关

文章目录 前言一、为什么需要网关二、Spring Cloud Gateway三、断言工厂和过滤器1.断言工厂2.过滤器3.全局过滤器4.过滤器执行顺序 四、跨域问题总结 前言 在之前的文章中我们已经介绍了微服务技术中eureka、nacos、ribbon、Feign这几个组件&#xff0c;接下来将介绍另外一个组…...

函数形状有几种定义方式;操作符infer的作用

在 TypeScript 中&#xff0c;函数形状可以用多种方式进行定义。下面介绍了几种常用的函数形状定义方式&#xff1a; 函数声明&#xff1a; function add(a: number, b: number): number {return a b; }在函数声明中&#xff0c;我们直接使用 function 关键字来声明函数&…...

Java / MybatisPlus:JSON处理器的应用,在实体对象中设置对象属性,对象嵌套对象

1、数据库设计 2、定义内部的实体类 /*** Author lgz* Description* Date 2023/9/30.*/ Data // 静态构造staticName&#xff0c;方便构造对象并赋予属性 AllArgsConstructor(staticName "of") NoArgsConstructor ApiModel(value "亲友", description …...

力扣 -- 1027. 最长等差数列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int longestArithSeqLength(vector<int>& nums) {int nnums.size();int ret2;unordered_map<int,int> hash;//这里可以先把nums[0]存进哈希表中&#xff0c;方便后面i从1开始遍历hash[num…...

正则验证用户名和跨域postmessage

正则验证用户名 字母数字符号大小写8-14匹配用户名的 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>form</title> …...

jsbridge实战1:xcode swift 构建iOS app

[[toc]] 环境安装 macOs: 10.15.5 xcode: 11.6 demo:app 创建 hello world iOS app 创建工程步骤 选择&#xff1a;Create a new Xcode project选择&#xff1a;iOS-> single View App填写&#xff1a; project name: swift-app-helloidentifer: smile 包名language: s…...

零基础部署nginx mysql springboot

参考&#xff1a;写给开发人员看的Docker干货&#xff0c;零基础部署nginx mysql springboot 一、连接linux 阿里云 参考&#xff1a;部署到Linux 可能需要购买&#xff1a;购买链接 二、安装docker # 先切换到root用户下 sudo su# 更新apt-get&#xff0c;保证apt-get最新…...

6-3 模式匹配

description 给出主串s和模式串t&#xff0c;其长度均不超过1000。本题要求实现一个函数BF(string s, string t)&#xff0c;求出模式串t在主串s中第一次出现的位置&#xff08;从0开始计算&#xff09;&#xff0c;如果在s中找不到t&#xff0c;则输出-1。 函数接口定义&…...

SQL JOIN 时 USING 和 ON 的异同

在数据表做 join 时&#xff0c;即可以用 using&#xff0c;也可以用 on。有什么异同点呢。 ON 是更加普遍的用法&#xff0c;可以连接表 On 一个字段&#xff0c;多个字段&#xff0c;甚至一个条件表达式。举例 SELECT * FROM world.City JOIN world.Country ON (City.Cou…...

安全学习_开发相关_JNDI介绍(注入)RMILDAP服务

文章目录 参考&本节目的JNDI概念-RMI&LDAP服务调用检索&#xff1a;在RMI服务中调用了InitialContext.lookup()的常用类有&#xff1a;在LDAP服务中调用了InitialContext.lookup()的常用类有&#xff1a; JNDI注入-使用工具生成远程调用JNDI远程调用-工具&#xff08;j…...

C#学生选课及成绩查询系统

一、项目背景 学生选课及成绩查询系统是一个学校不可缺少的部分&#xff0c;传统的人工管理档案的方式存在着很多的缺点&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以开发一套综合教务系统管理软件很有必要&#xff0c;它应该具有传统的手工管理所无法比拟的…...

【C语言】利用数组处理批量数据(一维数组和二维数组)

前言:在前面学习的程序中使用的变量都属于基本类型&#xff0c;例如整型、字符型、浮点型数据&#xff0c;这些都是简单的数据类型。对于简单的问题&#xff0c;使用这些简单的数据类型就可以了。但是对于有些需要处理的数据&#xff0c;只用以上简单的数据类型是不够的&#x…...

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…...

解决Qt msvc编译器 中文显示乱码问题

第一步&#xff1a;代码文件选择用utf8编码带bom。第二步&#xff1a;在有中文汉字的代码文件顶部加一行&#xff08;一般是cpp文件&#xff09; #pragma execution_character_set(“utf-8”) 可以考虑放在head.h中&#xff0c;然后需要的地方就引入head头文件就行&#xff0c;…...

JAVA面经整理(7)

一)什么是AQS&#xff1f; 1)AQS也被称之为是抽象同步队列&#xff0c;它是JUC包底下的多个组件的底层实现&#xff0c;Lock&#xff0c;CountDownLatch和Semphore底层都使用到了AQS AQS的核心思想就是给予一个等待队列和同步状态来实现的&#xff0c;它的内部使用一个先进先出…...

CentOS7使用技巧

1、防火墙相关 关闭防火墙 systemctl stop firewalld 关闭防火墙开机自启 systemctl disable firewalld.service 查看防火墙状态 systemctl status firewalld...

Nature Machine Intelligence | “化学元素知识+功能提示”双驱动,探索分子预测新方法

论文题目&#xff1a;Knowledge graph-enhanced molecular contrastive learning with functional prompt 论文链接&#xff1a;https://doi.org/10.1038/s42256-023-00654-0 项目地址&#xff1a;GitHub - HICAI-ZJU/KANO: Code and data for the Nature Machine Intelligence…...

CppCheck静态代码检查工具教程【Windows和Linux端】

目录 1、背景 2、特性介绍 2.1、检查结果 2.2、检查范围 2.3、支持的检查规则&#xff08;列举一些&#xff09;: 2.4、自定义规则 3、linux 端 4、windows 端 1、背景 最近调研了几款 c/c 代码静态检查工具&#xff0c;包括 cppcheck、cpplint、cppdepend、splint、ts…...

W25Q128芯片手册精读

文章目录 前言1. 概述2. 特性3. 封装类型和引脚配置3.1 8焊盘WSON 8x6 mm3.2其他封装 4. 引脚描述4.1 片选4.2 串行数据输入输出4.3 写保护4.4 保持脚4.5 时钟 5. 块图6. 功能描述6.1 SPI功能6.1.1 标准SPI6.1.2 双通道SPI6.1.3 四通道SPI6.1.4 保持功能 6.2 写保护6.2.1 写保护…...

QT商业播放器

QT商业播放器 总体架构图 架构优点&#xff1a;解耦&#xff0c;采用生产者消费者设计模式&#xff0c;各个线程各司其职&#xff0c;通过消息队列高效协作 这个项目是一个基于ijkplayer和ffplayer.c的QT商业播放器, 项目有5部分构成&#xff1a; 前端QT用户界面 后端是集成了…...

电能质量治理三相光伏逆变器设计【附程序】

✨ 长期致力于MPPT、电能质量治理、改进哈里斯鹰、重复控制、预置补偿角、模糊PI研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于混沌哈里斯鹰算法…...

从Arrays.fill()到Stream API:Java二维数组初始化的几种高效写法与性能对比

从Arrays.fill()到Stream API&#xff1a;Java二维数组初始化的几种高效写法与性能对比 在算法竞赛和数据处理应用中&#xff0c;二维数组的初始化往往是性能优化的第一个瓶颈。我曾在一个图像处理项目中&#xff0c;因为选择了不当的初始化方式&#xff0c;导致整体性能下降了…...

飞书文档批量导出工具:25分钟搞定700+文档的迁移难题

飞书文档批量导出工具&#xff1a;25分钟搞定700文档的迁移难题 【免费下载链接】feishu-doc-export 飞书文档导出服务 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 当企业需要切换办公平台或进行数据备份时&#xff0c;飞书文档的批量迁移常常成为…...

天气图片分类模型:基于迁移学习与GPU资源优化

天气图片分类模型:基于迁移学习与GPU资源优化 1. 引言 天气识别在自动驾驶、户外监控、气象服务等领域具有重要应用价值。传统方法依赖于手工设计的特征(如纹理、颜色直方图),鲁棒性不足。深度学习尤其是卷积神经网络(CNN)能够自动从图像中学习层次化特征,显著提升分类…...

外科医生AI认知变迁:从技术好奇到价值驱动的全球调查

1. 项目概述&#xff1a;一场关于外科医生与AI认知变迁的全球对话作为一名长期关注技术与医疗交叉领域的从业者&#xff0c;我始终对一个问题抱有浓厚兴趣&#xff1a;当一项颠覆性技术从实验室走向临床&#xff0c;真正使用它的医生们究竟在想什么&#xff1f;他们的期待、困惑…...

V2X通信:自动驾驶安全冗余与混合交通协同的关键技术

1. 项目概述&#xff1a;当自动驾驶汽车遇上“沟通障碍”如果你认为自动驾驶汽车和车与车之间的通信是两个独立的问题&#xff0c;那说明你的思考还不够“渐进式”。是时候重新审视了。自动驾驶的拥护者们常常描绘一个乌托邦式的未来&#xff1a;道路零事故。但他们很少提及那个…...

Mega:基于上下文工程的Brainbase平台AI开发效率革命

1. 项目概述&#xff1a;Mega&#xff0c;你的Brainbase平台AI工程专家如果你正在使用Claude Code、Cursor或者任何能读取文件的AI编程工具来构建基于Brainbase平台的对话式AI应用&#xff0c;那么你很可能遇到过这样的困境&#xff1a;你需要花费大量时间向AI解释Brainbase的架…...

面试官追问LDA与PCA区别?用这张对比图+3个核心公式轻松讲明白

LDA与PCA本质区别&#xff1a;3个核心公式实战对比解析 当面试官要求你解释LDA和PCA的区别时&#xff0c;他们真正想考察的是什么&#xff1f;不是简单的概念复述&#xff0c;而是对两种降维技术底层逻辑的深刻理解。本文将用几何直觉、数学本质和代码实例&#xff0c;带你穿透…...

构建企业级日志监控系统:Visual Syslog Server技术架构深度解析

构建企业级日志监控系统&#xff1a;Visual Syslog Server技术架构深度解析 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog 在当今复杂的IT基础设施环境中&#…...

从平面到立体:基于OpenLayers与Cesium的无缝地图维度切换实践

1. 二维与三维地图融合的必要性 在现代WebGIS开发中&#xff0c;单纯依赖二维地图已经难以满足用户对空间数据展示的需求。想象一下&#xff0c;当你查看一个城市规划系统时&#xff0c;平面地图能告诉你道路走向&#xff0c;但只有切换到三维视图才能直观看到建筑高度、地形起…...