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

SpringCloud-Gateway

什么是网关?

在这里插入图片描述

网关是一个服务,是访问内部系统的唯一入口,提供内部服务的路由中转,额外还可以在此基础上提供如身份验证、监控、负载均衡、限流、降级与应用检测等功能。

Spring Cloud Gateway 与 Zuul 对比

zuul1.x与zuul2.x

Zuul 1.x 基于同步 IO

zuul2.x

基于异步io

zuul1.x 对比 zuul2.x 性能提升

在这里插入图片描述

zuul 与Gateway对比

SpringCloud Gateway 使用

断言 predicates

多个断言可以配合使用

path断言

        predicates:- Path=/mg/**

Query断言

参数值可以写正则,也可以只写参数名

        predicates:- Query=foo,ba.

Method断言

        predicates:- Method=get

Host断言

  predicates:- Host=mashibing.com

Cookie断言

        predicates:- Cookie=name,yiming

基本路由

依赖

		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

配置文件

spring:cloud:gateway:routes:- id: xxoorouteuri: http://localhost:8080  filters:- StripPrefix=2server:port: 80

整合Eureka

依赖

<!-- eureka-client -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>4.0.0</version></dependency>

配置

spring:cloud:gateway:discovery:locator:// 开启从eureka 拉取服务列表  并自动映射enabled: trueapplication:name: myGateWay
eureka:client:service-url:defaultZone: http://euk1.com:7002/eureka/server:port: 80

负载均衡

spring:cloud:gateway:discovery:locator:enabled: trueroutes:- id: mdbpredicates:- Path=/mangodb/**uri: lb://MDBfilters:- StripPrefix=1application:name: myGateWayeureka:client:service-url:defaultZone: http://euk1.com:7002/eureka/server:port: 80

自定义负载均衡

配置
MDB:ribbon:NFLoadBalancerRuleClassName: com.mashibing.admin.MyRule
package com.mashibing.admin;import java.util.List;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.Server;public class MyRule extends AbstractLoadBalancerRule{@Overridepublic Server choose(Object key) {// TODO Auto-generated method stubList<Server> list = this.getLoadBalancer().getReachableServers();System.out.println(list);// 各种逻辑~~~~System.out.println("xxoo");return list.get(0);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}}

自定义路由

@Beanpublic RouteLocator routeLocator (RouteLocatorBuilder locatorBuilder) {return locatorBuilder.routes().route(p -> p.path("/xxoo").filters(f -> f.stripPrefix(1)).uri("http://mashibing.com")).route(p ->p.path("/go").filters(f -> f.stripPrefix(1)).uri("lb://MDB")).build();}

自定义过滤器

package com.mashibing.admin;import java.util.List;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
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
public class MyFilter implements Ordered,GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> queryParams = request.getQueryParams();List<String> list = queryParams.get("id");if (null == list || list.size() ==0) {// 非法请求System.out.println("不要~");//			exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//			
//			return exchange.getResponse().setComplete();DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("xiake~!!".getBytes());exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().writeWith(Mono.just(dataBuffer));}return chain.filter(exchange);}@Overridepublic int getOrder() {// TODO Auto-generated method stubreturn 0;}}

SpringCloud Gateway

在这里插入图片描述

路由

使用webflux

	@Beanpublic RouterFunction<ServerResponse> function(){RouterFunction<ServerResponse> route = RouterFunctions.route(RequestPredicates.path("/002"),req -> ServerResponse.ok().body(BodyInserters.fromValue("xxx")));return route;}

缓存

权重与灰度发布

随机算法

      routes:- id: w1predicates:- Path=/w/**- Weight=service,95uri: lb://MDBfilters:- StripPrefix=1- id: w2predicates:- Path=/w/**- Weight=service,5uri: lb://MDB2filters:- StripPrefix=1        

过滤器

SpringCloud Gateway用于拦截用户请求和链式处理,可以实现面向切面编程,在切面中可以实现与应用无关的需求,比如安全、访问超时等

有序

order值越小 优先级越高

	@Overridepublic int getOrder() {// TODO Auto-generated method stubreturn 110;}

限流

内置令牌桶 + Redis

pom

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
      routes:- id: w1predicates:- Path=/w/**uri: lb://MDB2filters:- StripPrefix=1- name: RequestRateLimiterargs:key-resolver: '#{@userKeyResolver}'redis-rate-limiter.replenishRate: 1redis-rate-limiter.burstCapacity: 3
public class RateLimitConfig {KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));}
}

整合GoogleGuava

DefaultRateLimiter

package com.mashibing.admin;import java.util.HashMap;
import java.util.Objects;import javax.validation.constraints.DecimalMin;import org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter;
import org.springframework.cloud.gateway.support.ConfigurationService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;import com.google.common.util.concurrent.RateLimiter;import reactor.core.publisher.Mono;@Component
@Primary
public class DefaultRateLimiter extends AbstractRateLimiter<DefaultRateLimiter.Config> {public DefaultRateLimiter() {super(Config.class, "default-rate-limit", new ConfigurationService());}/*** 每秒一个请求,每秒发一个令牌*/private final RateLimiter limiter = RateLimiter.create(1);@Overridepublic Mono<Response> isAllowed(String routeId, String id) {Config config = getConfig().get(routeId);limiter.setRate(Objects.isNull(config.getPermitsPerSecond()) ? 1 : config.getPermitsPerSecond());boolean isAllow = limiter.tryAcquire();return Mono.just(new Response(isAllow, new HashMap<>()));}@Validatedpublic static class Config {@DecimalMin("0.1")private Double permitsPerSecond;public Double getPermitsPerSecond() {return permitsPerSecond;}public Config setPermitsPerSecond(Double permitsPerSecond) {this.permitsPerSecond = permitsPerSecond;return this;}}}

配置

      routes:- id: w1predicates:- Path=/w/**uri: lb://MDB2filters:- StripPrefix=1- name: RequestRateLimiterargs:rate-limiter: "#{@defaultRateLimiter}"key-resolver: "#{@userKeyResolver}"default-rate-limit.permitsPerSecond: 0.5

权限

写在filter中

hystrix

项目里讲

生命周期

在这里插入图片描述

Spring Cloud Gateway同zuul类似,有“pre”和“post”两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如上图中的user-service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。

相关文章:

SpringCloud-Gateway

什么是网关&#xff1f; 网关是一个服务&#xff0c;是访问内部系统的唯一入口&#xff0c;提供内部服务的路由中转&#xff0c;额外还可以在此基础上提供如身份验证、监控、负载均衡、限流、降级与应用检测等功能。 Spring Cloud Gateway 与 Zuul 对比 zuul1.x与zuul2.x Zu…...

【C++ qt4】操作json学习笔记

本博文源于笔者在学习c qt4操作json文件&#xff0c;qt4不支持json&#xff0c;里面的函数是json.h与jsoncpp.cpp我已经附在文末&#xff0c;大家可复制重命名用&#xff0c;里面的案例可以自己拿来敲或者直接copy也行.,一定利用好目录拖动&#xff0c;不然很长。 文章目录 1.从…...

【牛客刷题专栏】0x25:JZ24 反转链表(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…...

useEffect

useEffect 1.依赖项是什么&#xff1f;2.useEffect怎么知道依赖项数组发生了改变&#xff1f;3.依赖项的改变会导致无限渲染吗&#xff1f;4.使用 Object.is 来比较新/旧 state 是否相等&#xff0c;浅比较&#xff1f;5.为什么要用浅比较&#xff0c;而不用深比较呢&#xff1…...

如何利用splice()和slice()方法操作数组

如何利用splice&#xff08;&#xff09;和slice&#xff08;&#xff09;方法操作数组 前言splice()是什么&#xff0c;有什么用&#xff1f;怎么用&#xff1f;slice()是什么&#xff0c;有什么用&#xff1f;怎么用&#xff1f;splice和slice方法的区别小结 前言 splice&am…...

一文读懂ChatGPT(全文由ChatGPT撰写)

最近ChatGPT爆火&#xff0c;相信大家或多或少都听说过ChatGPT。到底ChatGPT是什么&#xff1f;有什么优缺点呢&#xff1f; 今天就由ChatGPT自己来给大家答疑解惑~ 全文文案来自ChatGPT&#xff01; 01 ChatGPT是什么 ChatGPT是一种基于人工智能技术的自然语言处理系统&…...

如何提升应届生职场竞争力

引言 对于应届毕业生来说&#xff0c;进入职场是既令人兴奋又具有挑战性的。面对竞争激烈的就业市场&#xff0c;提高自身的职场竞争力对于应届生来说尤为重要。本文旨在为应届生提供有价值的见解和实用的策略&#xff0c;帮助他们提升职场竞争力&#xff0c;增加在就业市场中的…...

David Silver Lecture 5: Model-Free Control

1 Introduction 1.1 内容 上一章是对一个unknown MDP进行value function的预测&#xff0c;相当于policy evaluation。这一章是对unknown MDP找到一个最优的policy&#xff0c; optimise value function. 1.2 On and Off-Policy Learning On-policy learning learn on the…...

MySQL-----事务管理

文章目录 前言一、什么是事务二、为什么会出现事务三、事物的版本支持四、事物的提交方式五、事务常见的操作方式六、事务隔离级别如何理解隔离性1隔离级别查看与设置隔离性读未提交【Read Uncommitted】读提交【Read Committed】可重复读【Repeatable Read】串行化【serializa…...

chatGPT润色中英论文软件-文章修改润色器

chatGPT可以润色英文论文吗&#xff1f; ChatGPT可以润色英文论文&#xff0c;它具备自动纠错、自动完善语法和严格全面的语法、句法和内容结构检查等功能&#xff0c;可以对英文论文进行高质量的润色和优化。此外&#xff0c;ChatGPT还支持学术翻译润色、查重及语言改写等服务…...

MacOS下安装和配置Nginx

一、安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"按回车后&#xff0c;根据提示操作&#xff1a;输入镜像序号 --> 输入Y&#xff0c;回车等待brew安装完成即可。 在终端输入brew -v后&#xff0c;会提示…...

采用UWB(超宽频)技术开发的java版智慧工厂定位系统源码

室内定位系统源码&#xff0c;采用UWB定位技术开发的智慧工厂定位系统源码 技术架构&#xff1a;单体服务 硬件&#xff08;UWB定位基站、卡牌&#xff09; 开发语言&#xff1a;java 开发工具&#xff1a;idea 、VS Code 前端框架&#xff1a;vue 后端框架&#xff1a;s…...

【2023华为OD笔试必会20题--C语言版】《04 日志采集系统》——数组

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的20道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

MySQL数据库——MySQL修改存储过程(ALTER PROCEDURE)

在实际开发过程中&#xff0c;业务需求修改的情况时有发生&#xff0c;所以修改 MySQL 中的存储过程是不可避免的。 MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程。下面将详细讲解修改存储过程的方法。 MySQL 中修改存储过程的语法格式如下&#xff1a; ALTER PROCEDURE…...

ASEMI代理ADV7125JSTZ330原装ADI车规级ADV7125JSTZ330

编辑&#xff1a;ll ASEMI代理ADV7125JSTZ330原装ADI车规级ADV7125JSTZ330 型号&#xff1a;ADV7125JSTZ330 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LQFP-48 批号&#xff1a;2023 引脚数量&#xff1a;48 工作温度&#xff1a;-40C~85C 安装类型&#xff1a;表面…...

86盒IP对讲一键报警器

86盒IP对讲一键报警器 86盒IP对讲一键报警器&#xff1a;革命性保障生命安全的利器&#xff01; 随着科技的飞速发展&#xff0c;我们的生活变得越来越方便和智能化。而86盒IP对讲一键报警器更是在这种背景下应运而生。这款产品不仅无缝对接各种手机APP&#xff0c;也可以在智…...

【高数+复变函数】傅里叶积分

文章目录 【高数复变函数】傅里叶积分2. 傅里叶积分2.1 复数形式积分公式2.2 三角形式 上一节&#xff1a; 【高数复变函数】傅里叶级数 【高数复变函数】傅里叶积分 2. 傅里叶积分 在上一节中&#xff0c;我们知道了傅里叶级数的基本知识&#xff0c;其中&#xff0c;周期为…...

【Leetcode】241. 为运算表达式设计优先级

241. 为运算表达式设计优先级&#xff08;中等&#xff09; 解法一&#xff1a;分治法 对于这道题&#xff0c;加括号其实就是决定运算次序&#xff0c;所以我们可以把加括号转化为&#xff0c;「对于每个运算符号&#xff0c;先执行处理两侧的数学表达式&#xff0c;再处理此…...

torch两个向量除法,对于分母向量中的元素为0是设置为1,避免运算错误

在gpu运行时&#xff0c;如果在进行两个向量除法的时候&#xff0c;对于分母向量中的元素为0是设置为1&#xff0c;避免运算错误。 可以使用torch的division函数以及clamp函数来解决这个问题。具体步骤如下&#xff1a; 使用division函数将分子向量除以分母向量。 使用clamp函…...

NodeJs 最近各版本特性汇总

&#xff08;预测未来最好的方法就是把它创造出来——尼葛洛庞帝&#xff09; NodeJs 官方链接 github链接 V8链接 Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...