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

Spring Cloud -- GateWay

  1. 为什么需要网关

在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例如:
客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
认证复杂,每个微服务都有独立认证
存在跨域请求,在一定场景下处理相对复杂

提供统一的入口和统一的出口

  1. 网关对比

  • Zuul 1.x

Netflix开源的网关,基于Servlet框架构建,功能丰富,使用JAVA开发,易于二次开发 问题:即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。

  • Zuul 2.x

Zuul2 采用了Netty实现异步非阻塞编程模型,每个 CPU 核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。

  • GateWay

Spring公司为了替换Zuul而开发的网关服务,底层为Netty,将在下面具体介绍。

  • Nginx+lua

使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用,lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本,性能很强,问题在于:无法融入到微服务架构中

  • Kong

基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

带有Nginx的性能要远远高于zuul和gateway,但是nginx不支持微服务,所以一般使用zuul和gateway。gateway的性能要高于zuul,所以我们来学习gateway

  1. 官网地址

https://spring.io/projects/spring-cloud-gateway
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

  1. 特点

1.性能强劲:是Zuul的1.6倍

2. 功能强大:内置了很多实用的功能,例如转发、监控、限流等

3. 设计优雅,容易扩展

不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。

  1. gateway工作流程图:

客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler 处理程序。此处理程序通过特定于请求的Fliter链运行请求。Fliter被虚线分隔的原因是Fliter可以在发送代理请求之前(pre)和之后(post)运行逻辑。执行所有pre过滤器逻辑。然后进行代理请求。发出代理请求后,将运行“post”过滤器逻辑。

  1. 过滤器作用

  • Filter在pre类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等。

  • Filter在post类型的过滤器可以做响应内容、响应头的修改、日志输出、流量监控等

  • 这两种类型的过滤器有着非常重要的作用

  1. 核心概念

  • Route(路由)

路由是构建网关的基础模块,它由ID,目标URI,包括一些列的断言和过滤器组成,如果断言为true则匹配该路由

  • Predicate(断言)

参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),请求与断言匹配则进行路由

  • Filter(过滤)

指的是Spring框架中GateWayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

  • 三个核心点连起来:

当用户发出请求到达GateWay,GateWay会通过一些匹配条件,定位到真正的服务节点,并在这个转发过程前后,进行一些及细化控制。其中Predicate就是我们匹配的条件,而Filter可以理解为一个拦截器,有了这两个点,再加上目标URI,就可以实现一个具体的路由了。

  1. spring boot和spring cloud的对应关系

  1. gateway项目搭建:

引入GateWay一定要删除spring-boot-starter-web依赖,否则会有冲突无法启动

  1. 父项目引入

<!--spring cloud Hoxton.SR5-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-gateway-varsion}</version><type>pom</type><scope>import</scope>
</dependency>
  1. 子项目

因为GateWay也需要注册进Nacos,所以也需要Nacos的依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 配置yml

server:port: 9999
spring:application:name: cloud-gateway-servicecloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true #开启注册中心路由功能routes:  # 路由- id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名uri: http://localhost:9001/nacos-provider # 匹配提供服务的路由地址predicates: # 断言- Path=/msb/** # 断言,路径相匹配进行路由

代码中也可以添加配置

@Configuration
public class GateWayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){// 构建routesRouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();// 具体的路由地址routes.route("path_msb",r -> r.path("/msb/**").uri("http://localhost:9001/nacos-provider")).build();// 返回所有的理由规则return routes.build();}
}

  1. 路由

  1. 自动路由

gateway自带负载均衡

gateway.discovery.locator.enabled: true , 开启自动路由功能

不配置具体的routes,自动路由时访问需要加serviceId

localhost:9999/ServiceID/xxx/

2. 手动负载均衡(更常用)

uri中加lb表示负载均衡

 routes: # 路由- id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名uri: lb://nacos-provider # 匹配提供服务的路由地址predicates: # 断言- Path=/msb/** 

routes中配置了以后,走routes中的配置,不走gateway.discovery.locator.enabled

  1. 断言Predicate

当满足条件后才会进行转发,如果是多个,那就是满足所有条件才会转发

断言种类

  1. After:匹配在指定日期时间之后发生的请求。

  1. Before:匹配在指定日期之前发生的请求。

  1. Between:需要指定两个日期参数,设定一个时间区间,匹配此时间区间内的请求。

  1. Cookie:需要指定两个参数,分别为name和regexp(正则表达式),也可以理解Key和Value,匹配具有给定名称且其值与正则表达式匹配的Cookie。

  1. Header:需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。

  1. Host:匹配当前请求是否来自于设置的主机。

  1. Method:可以设置一个或多个参数,匹配HTTP请求,比如GET、POST

  1. Path:匹配指定路径下的请求,可以是多个,用逗号分隔

  1. Query:需要指定一个或者多个参数,一个必须参数和一个可选的正则表达式,匹配请求中是否包含第一个参数,如果有两个参数,则匹配请求中第一个参数的值是否符合正则表达式。

  1. RemoteAddr:匹配指定IP或IP段,符合条件转发。

  1. Weight:需要两个参数group和weight(int),实现了路由权重功能,按照路由权重选择同一个分组中的路由

具体用法:

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

  1. 过滤器Filter

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。

过滤器分为内置过滤器和自定义过滤器

内置Filter

  1. GateWay内置的Filter生命周期为两种:pre(业务逻辑之前)、post(业务逻辑之后)

  1. GateWay本身自带的Filter分为两种: GateWayFilter(单一)、GlobalFilter(全局)

  1. 单一的有32种,全局的有9种

  1. 官方网址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

自定义Filter(常用)

需要实现两个接口:GlobalFilter、 Ordered

@Component
@Slf4j
public class MyFilter implements Ordered, GlobalFilter {/*** @param exchange 可以拿到对应的request和response* @param chain 过滤器链* @return 是否放行*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String username = exchange.getRequest().getQueryParams().getFirst("username");log.info("*************MyFilter:"+new Date());if(username == null){log.info("**********用户名为null,非法用户,请求被拒绝!");//如果username为空,返回状态码为406,不可接受的请求exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}/*** 加载过滤器的顺序* @return 整数,数字越小优先级越高*/@Overridepublic int getOrder() {return 0;}
}

相关文章:

Spring Cloud -- GateWay

为什么需要网关在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例…...

【C语言】memcpy , memset等内存操作函数使用方法与注意事项

这个章节&#xff0c;我们探讨C语言内存操作函数。 重点介绍处理内存操作函数使用和注意事项 和内存函数如何模拟实现。 内存函数所需头文件 #include<string.h> 文章目录memcpymemcpy 函数模拟实现memmovememmove 函数模拟实现memcmpmemcmp 函数模拟实现memsetmemset 函…...

尚融宝04-mybatis-plus插件和条件构造器

目录 一、分页插件 1、添加配置类 2、添加分页插件 3、测试分页 二、XML自定义分页 1、UserMapper中定义接口方法 2、定义XML 3、测试 三、乐观锁 1、场景 2、乐观锁方案 3、乐观锁实现流程 4、优化流程 四、wapper介绍 1、Wrapper家族 2、创建测试类 五、Qu…...

面试重难点问题(C++)

持续更新&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 网络部分 1.问&#xff0c;四次挥手的过程&#xff0c;和双方状态变化&#xff1f; 挥手这前&#xff0c;两边都是established状态&#xff0c;客户端发起断开请求&#xff0c;向服务器发送fin请求&…...

androidx.appcompat 升级到1.5.1 趟过的坑

APP 要上google play&#xff0c;Android SDK 版本要升级到32&#xff1b;接了一个第三方SDK&#xff0c;不巧的是这个SDK引用appcompat是1.5.1&#xff0c;顺手把appcompat 包升级到1.5.1&#xff0c;这草率的一升&#xff0c;带来的不止一地鸡毛&#xff0c;还有精神上被残忍…...

[C++]反向迭代器

目录 前言&#xff1a; 1 对反向迭代器的构造思想 2 实现反向迭代器 3 完整代码 前言&#xff1a; 本篇文章主要介绍了STL容器当中的反向迭代器&#xff0c;可能有朋友会说&#xff1a;“反向迭代器有什么好学的&#xff1f;不一样还是迭代器吗&#xff0c;我正向能写出来&…...

解析Python编程中的包结构

假设你想设计一个模块集&#xff08;也就是一个“包”&#xff09;来统一处理声音文件和声音数据。通常由它们的扩展有不同的声音格式&#xff0c;例如&#xff1a;WAV&#xff0c;AIFF&#xff0c;AU&#xff09;&#xff0c;所以你可能需要创建和维护一个不断增长的各种文件格…...

【前端】深入浅出缓存原理

缓存的基本原理 对于前端来说&#xff0c;缓存主要分为浏览器缓存&#xff08;比如 localStorage、sessionStorage、cookie等等&#xff09;以及http缓存&#xff0c;也是本文主要讲述的。 当然叫法也不一样&#xff0c;比如客户端缓存大概包括浏览器缓存和http缓存 所谓htt…...

单调栈图文详解(附Java模板)

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349;&#x1f95d; 啥是"单调栈"&#xff0c;它能解决什么样的问题&#xff1f; 文章目录&#x1f9a9;单调栈的概念&a…...

彻底理解Session、Cookie、Token,入门及实战

文章目录Session Cookie的使用Token的使用Session Cookie的使用 1. Session存储数据 HttpSession session request.getSession(); //Servlet底层通过的SESSIONID&#xff0c;获取Session对象。 session.setAttribute("loginTime",new Date()); out.println(&q…...

为什么运营商大数据可以精准获客?

“获客难”&#xff0c;“获客成本高”&#xff0c;一直是困扰企业的大问题&#xff0c;身边的许多朋友在吐槽客户的意向度不高&#xff0c;总是无法成交&#xff0c;员工非常积极主动去跟踪客户了&#xff0c;但始终事倍功半&#xff0c;这就像是老人们常说的一句老话“热脸贴…...

【数据结构】栈的实现

&#x1f4af;&#x1f4af;&#x1f4af; 本篇主要利用数组来实现栈&#xff0c;对于栈的各种操作都作详细介绍&#xff0c;压栈&#xff0c;出栈以及获取栈中元素的操作都是学习栈的必备知识&#xff0c;快来学起来吧&#xff01;&#xff01;&#xff01;©Ⅰ.栈的概念及…...

【链表OJ题(六)】链表分割

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(六)1. 链表…...

C++类中的三大函数(构造,析构,拷贝)

下面一段话与大家共勉&#xff1a;每个人的一生都会遇到很多边界&#xff0c;有些边界可以突破&#xff0c;有些则不能。那些无法突破的边界就是你的极限&#xff0c;而划分边界的标准就是“阈值”。每次突破阈值之后&#xff0c;人生轨迹就会发生剧烈变化&#xff0c;其间需要…...

【2024考研】计算机考研,4轮复习时间安排

文章目录&#x1f3a8;第1轮复习&#xff08;暑假前&系统课&#xff09;英语1/2数学1/2专业课408&#x1f3a8;第2轮复习&#xff08;开学前&真题&#xff09;英语1/2试卷数学1/2试卷专业课408试卷&#x1f3a8;第3轮复习&#xff08;报名前&政治&#xff09;政治试…...

(十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据

系列文章: python网络爬虫专栏 目录 序言 本节学习目标 特别申明 4.7 使用BeautfulSoup解析h...

【经验】项目管理:瀑布式、Scrum

1、瀑布式开发 流程关键词关键人员输出立项简述、周期、预算领导立项申请表、立项评审表策划计划项目经理、QA、CM各种计划书&#xff08;项目、配置、测试等&#xff09;&#xff0c;评审需求功能项目经理功能列表、需求规格书、需求开发计划等&#xff0c;评审设计UML开发设…...

Learning C++ No.17【STL No.7】双端队列

引言&#xff1a; 北京时间&#xff1a;2023/3/17/7:18&#xff0c;刚刚快乐的早锻炼回来&#xff08;不对 &#xff0c;应该说回来有一会了&#xff09;&#xff0c;因为此时我已经吃完早饭&#xff0c;洗过澡了&#xff1b;现在回想起上学期&#xff0c;就算是第二天需要晨跑…...

Snackbar

1.简介 位于底部的提示View 支持侧滑消失 同一时间只有一个 不支持跨Activity展示 国内使用率很低 2.基础使用 2.1 基本展示 Snackbar.make(view, "Content", Snackbar.LENGTH_LONG).show()2.2 设置点击事件 注意不设置点击事件回调&#xff0c;点击按钮的文字不…...

HummerRisk 使用教程:主机检测

1. 概述 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生环境的安全和治理问题。核心能力包括混合云的安全治理和容器云安全检测。 本文将介绍HummerRisk中的主机检测部分功能&#xff0c;包括如何管理主机、管理凭证&#xff0c;以及使用主机检测规…...

【Arduino无线气象站项目】

【Arduino无线气象站项目】 1. 概述2. Arduino无线气象站电路图3. 定制设计电路板4. Arduino无线气象站代码5. 总结1. 概述 使用DHT22传感器测量室外温度和湿度,并使用NRF24L01收发器模块将这些数据无线发送到室内机。在室内机,还有另一个用于测量室内温度和湿度的DHT22传感…...

HTTP详解

一&#xff0c;什么是HTTPHTTP(全称为“超文本传输协议”)&#xff0c;是一种应用非常广泛的应用层协议&#xff0c;之前在《初识网络原理》的博客(初识网络原理_徐憨憨&#xff01;的博客-CSDN博客)中&#xff0c;有详细讲解过TCP/IP五层模型&#xff0c;其中应用层描述了数据…...

cpufreq--处理器功耗控制

cpu 功耗控制 参考框架&#xff1a; cpufreq 框架。 cpufreq 框架提供 cpu 功耗管理接口&#xff0c;以及功耗管理方案。 用户可以通过功耗管理接口&#xff08;以文件形式提供&#xff09;来选择管理方案&#xff0c;并设置相关参数。 管理方案的实现则由具体的驱动来完成。…...

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…...

Oracle 常见报错问题汇总

Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/password; logon denied报错:ORA-01031: insufficient privileges报错:"ORA-01034: ORACLE not available" 和 "ORA-27101: shared memory realm does not exist"报错:“ORA-00119: invalid…...

单片机连接有人云上传数据

首先采用有人物联网的模块 &#xff0c;连接有人云平台服务器 看云平台相关配置配置连接设备在线后 添加设备添加设备完成后 添加变量模板 变量模板的添加方式如下 &#xff1a;本次采用的是标准的MODbus 协议添加一个温度变量温度变量如下显示云平台 下发数据 采集01 03 00 00…...

系统集成项目管理工程师:第18章项目风险管理学习笔记

第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险...

【笔试强训选择题】Day3.习题(错题)解析

文章目录 前言一、Day3习题&#xff08;错题&#xff09;解析二、Day3习题&#xff08;原题&#xff09;练习总结前言 今天我们将进入到第三天的练习&#xff0c;希望能一直坚持下去&#xff0c;不断反思总结错误&#xff0c;得到进步&#xff1b; 一、Day3习题&#xff08;错…...

基于GPT-4的免费代码生成工具

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

Android开发的这一年里,Jetpack的Room源码是怎么狠狠奖励我的?

简述 Android Jetpack的出现统一了Android开发生态&#xff0c;各种三方库逐渐被官方组件所取代。Room也同样如此&#xff0c;逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份&#xff0c;更是因为其良好的开发体验&#xff0c;大大降低了SQLite的使用门槛…...

成都市网站建设公司/网络营销的盈利模式

参数传递&#xff1a;将主程序变量传递给子例程形式参数传递类型值传&#xff1a;子例程中参数变量的值的改变&#xff0c;不影响外部程序实际变量的值. DATA:A TYPE I VALUE 3,B TYPE I VALUE 6,C TYPE I. WRITE:A,A,B,B,C,C. PERFORM ADD USING A B CHANGING C. WRITE:/ SY-…...

做网站可以申请专利吗/各大网站推广平台

目录 模块 模块的使用 if __name__ "__main__": 包 模块 当代码量很大的时候&#xff0c;我们不可能把所有的代码写在一个文件中&#xff0c;所以这时候就需要分多个.py文件进行写代码。一个.py文件就是一个模块。如文件名为main.py&#xff0c;那么模块名就为…...

wordpress自定义tag页面/网址收录入口

http://blog.csdn.net/yuedong56/article/details/21524557 Cornerstone是mac操作系统上一款比较流行的SVN版本管理工具。 如何恢复到某一版本呢&#xff1f; 1。选中你要恢复的工程 2.点击“Working Copy”--->>"Revert..."。 3. 选择你要恢复的版本号&…...

php开发网站 用java做后台?/优化师培训机构

今天介绍一下django开发中&#xff0c;定义模型时用到的相关字段类型和字段选项。先说说常用的字段类型:1) AutoField: 自增字段类型&#xff0c;当自定义自增类型的id时&#xff0c;可以使用此类型&#xff1b;2) BigAutoField: 64位的整数自增类型&#xff1b;3) BigIntegerF…...

如何做积分商城网站/软文营销写作技巧有哪些?

2019独角兽企业重金招聘Python工程师标准>>> Node 主要用在开发 Web 应用&#xff0c;koa 是目前 node 里最流行的 web 框架。 在 Node 开启一个 http 服务简直易如反掌,官网 demo。 const http require("http");const server http.createServer((req, …...

网站方案制作/网站建设需要啥

原文&#xff1a;借助Canvas黑魔法&#xff0c;实现营销增益模型Uplift Model | 人人都是产品经理 在后互联网时代&#xff0c;随着营销成本的高涨&#xff0c;如何从存量人群中精准找到营销敏感人群进行触达&#xff0c;进而提高ROI一直是业务中重要的课题。 这样的业务场景…...