springcloud Alibaba中gateway和sentinel联合使用

看到这个文章相信你有一定的sentinel和gateway基础了吧。
官网的gateway和sentinel联合使用有些过时了,于是有了这个哈哈,给你看看官网的:
在这里插入图片描述
才sentinel1.6,现在都几了啊,所以有些过时。
下面开始讲解:
首先我们总的回顾一下,sentinel就是需要运行一个jar包,开启dashbord页面,来显示流控信息。
然后运行我们的程序,调用需要的接口,该接口就会在dashbord上面显示了对吧。
但是啊,gateway和sentinel进行配合之后,两个dashbord内容是不同的:
下面我们来对比一下:
这个是gateway和sentinel配合之后的控制台:
在这里插入图片描述
这个是配合之前的控制台:
在这里插入图片描述
可以看到有明显的差别。。。

回忆到这里,我们在浏览器输入接口名称,调用接口的时候,如果接口调用错误就直接显示404啊,而且呀控制台也会报错:
'org.springframework.web.reactive.function.server.ServerResponse$BodyBuilder org.springframework. web.reactive.function.server.ServerResponse.status(org.springframework.http.HttpStatus)'
那现在我不想让他在控制台报错,不然就影响的对bug的判断了。我想让他按照我的想法来显示指定的页面或者指定的字符串该怎么做?
下面有具体几种做法:
1.文件配置添加scg:

server:port: 7009spring:application:name: gateway-sentinel-namecloud:nacos:discovery:server-addr: localhost:8848password: nacosusername: nacosgateway:routes:- id: gateway_sentineluri: lb://consume-name1predicates:- Path=/consume/**   #**/filters:- StripPrefix=1sentinel:transport:port: 8719dashboard: localhost:8080eager: truefilter:enabled: false
=====================================================================================
#此时如果你在sentinel进行限流每秒两次。如果超过两次就会进行报错:'org.springframework.web.reactive.function.server.ServerResponse$BodyBuilder org.springframework.web.reactive.function.server.ServerResponse.status(org.springframework.http.HttpStatus)'并且加载不出数据
#上面的scg的配置可以解决这个异常哦!!!
#      scg: 
#        fallback:
#          mode: redirect #这个redirect是直接跳转新的地址
#          redirect: https://www.baidu.com
#下面这个可以自定义异常处理方式::[下面这个处理就是自定义的了,你想给前端返回啥就在这里定义就好]
#      scg: #这个是解决超过流控限制的时候进行什么操作(添加这个后,就算超过流控了,也不会正在控制套打印啥错误了,而是直接跳转指定页面!!!非常的方便的!!)
#        fallback:
#          mode: response
#          response-status: 429
#          response-body: '{"status":429,"msg":"请求过于频繁"}'
#          content-type: "application/json"

2.API方式,就是写的代码,不是配置文件配置了。

##嘿嘿还有其他处理方式:::编码处理方式:(使用Gateway API)
#  //        如果使用配置的方式就卸载配置文件中,如果使用编码方式就写在启动类里面!!!
##使用编码处理方式的时候。就是在网关回调的时候进行出来被拦截的请求!!!
#那网关回调是啥?官网可以看到哦,就是请求经过网关与两个过程,一个是经历网关过滤器,经过过滤器后会进行服务调用。调用后在返回给网关,网关在传给前端信息。@SpringBootApplicationpublic class GatewaySentinelApplication {public static void main(String[] args) {SpringApplication.run(GatewaySentinelApplication.class, args);GatewayCallbackManager.setBlockHandler(new RedirectBlockRequestHandler("https://www.baidu.com"));}
}#编码处理方式(自定义)这个就是自定义的了,是不是和application.xml配置的自定义的很像呢!@SpringBootApplicationpublic class GatewaySentinelApplication {public static void main(String[] args) {SpringApplication.run(GatewaySentinelApplication.class, args);GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {Map<String,Object> map1=new HashMap();map1.put("status",HttpStatus.TOO_MANY_REQUESTS);map1.put("msg","请求过于频繁");return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(map1));}
});
}
}
网关流控规则

在这里插入图片描述

上面的这个具体的网关流控规则配置页面了。
你可以在针对参数属性里面选中Client IP ,然后选中属性值配置,在匹配传中添加127.0.0.1,你会发现,这次配置的流控规则只会对ip为127.0.0.1的ip有用。localhost都不会受这个流控规则的管制。
其他的参数属性也是如此。

我们可以清楚的看到上面的API类型是Route ID类型的。那要是我们有多个接口都想设置相同的流控规则呢?我们可以把API类型设置为API分组。

在这里插入图片描述

设置成API分组前首先在API分组管理先设置匹配模式(就是在分组,就是说把哪些接口分组在一个起)。

在这里插入图片描述
然后访问接口的时候就要按照流控规则了。比如我设置的是每秒只能访问一次,超过这个次数就返回我设置好的字符串了。
在这里插入图片描述

api方式书写流网关限流规则

上面我们是通过dashbord方式进行限流的。这样可以直观的操作页面,但是重启程序就没了。接下来我们通过api方式书写在程序里吧。。
里面需要的各种参数可以看官方文档:github上的网关限流api

下面直接上代码:


/*** @ClassName GatewayFlowRuleConfig* @Description TODO* GatewayFlowRule : 专为 API 网关设计的流规则,支持对不同路由或自定义 API 分组进行流控。* 它还支持通过请求属性(例如 HTTP 标头、客户端 IP 和 URL 参数)进行流量控制。* @Author zyhh* @version: 1.0*/
@Configuration
public class GatewayFlowRuleConfig {@PostConstructpublic void initRules(){Set<GatewayFlowRule> rules=new HashSet();GatewayFlowRule rule=new GatewayFlowRule();rule.setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID);rule.setResource("zyhh");
//        对应阈值类型rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//        对应QPS阈值rule.setCount(1);
//        对应间隔时间rule.setIntervalSec(1);
//        对应流控方式(默认的:快速失败)rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
//        对应流控方式的排队
//        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
//        对应设置突发流量rule.setBurst(2);//        针对属性来源GatewayParamFlowItem paramFlowItem=new GatewayParamFlowItem();paramFlowItem.setFieldName("token");
//        对应参数属性paramFlowItem.setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP);
//        对应匹配模式paramFlowItem.setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT);
//        设置匹配模式paramFlowItem.setPattern("12345");rule.setParamItem(paramFlowItem);rules.add(rule);GatewayRuleManager.loadRules(rules);}
}

然后重启程序,再打开sentinel的dashbord发现结果如下:就给自己加上了。
在这里插入图片描述
那如果我想使用代码的方式配置api分组呢?接下来贴上代码:
这个代码写在了springboot启动类里面,我本来是写在Configuration类里面的,运行之后sentinel没显示,于是就配置在springboot启动类里面了,就成功呢了。如果有小伙伴知道原因,可不可以在评论区指点一二,感激不尽。。
下面贴上我在springboot启动类运行成功的代码:


@SpringBootApplication
public class GatewaySentinelApplication {public static void main(String[] args) {SpringApplication.run(GatewaySentinelApplication.class, args);GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {initCustomizedApis();initRules();}private static void initCustomizedApis() {System.out.println("=====================================进api分组");Set<ApiDefinition> definitions = new HashSet<>();
//        对应完成了api分组ApiDefinition api1 = new ApiDefinition("zyhh_api").setPredicateItems(new HashSet<ApiPredicateItem>() {{add(new ApiPathPredicateItem().setPattern("/consume/get/1").setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT));add(new ApiPathPredicateItem().setPattern("/product/.*").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_REGEX));}});definitions.add(api1);GatewayApiDefinitionManager.loadApiDefinitions(definitions);}public static void initRules(){Set<GatewayFlowRule> rules=new HashSet();
//        ====接下来我们设置分组流控规则=======================GatewayFlowRule rule2=new GatewayFlowRule();rule2.setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME);rule2.setResource("zyhh_api");rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);rule2.setCount(2);rule2.setIntervalSec(1);rule2.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);rule2.setBurst(2);rules.add(rule2);
//===============分组流控api结束=============================GatewayRuleManager.loadRules(rules);}
}

运行成功后sentinel在dashbord就显示这样了,就说明成功了:
在这里插入图片描述
==================== over=============================

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

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

相关文章

虚拟服务器的监控和管理

IT 网络中虚拟环境的出现给 IT 管理员带来了一些挑战&#xff0c;虚拟环境降低了管理硬件和软件的成本和复杂性&#xff0c;同时&#xff0c;他们通常需要 IT 管理员管理更多的空间&#xff0c;以确保完全可见和快速解决问题。 虚拟服务器在现代 IT 基础架构中越来越普遍&…

LabVIEW模拟荧光显微管滑动实验

LabVIEW模拟荧光显微管滑动实验 在现代生物医学研究中&#xff0c;对微观生物过程的精准模拟和观察至关重要。本案例展示了如何利用LabVIEW软件和专业硬件平台&#xff0c;创新地模拟荧光显微管在滑动实验中的动态行为&#xff0c;这一过程不仅提升了实验效率&#xff0c;还为…

基于冯·诺依曼架构能否实现有主动思想的AI

冯诺依曼架构是一种计算机体系结构&#xff0c;由冯诺依曼在20世纪40年代设计并提出。它是现代计算机设计的基础&#xff0c;并广泛应用于当前的计算机系统。冯诺依曼架构的核心思想是将程序和数据存储在同一个存储器中&#xff0c;并通过控制单元、算术逻辑单元、存储器和输入…

pycharm学生认证免费使用专业版

进入pycharm官网Monthly and yearly plans with JetBrains Toolboxhttps://www.jetbrains.com/store/?fromMenu#discounts ​​​ 按照要求填写&#xff0c;但是如果遇到这个提示&#xff0c;恭喜你&#xff0c;你的学校获得了美国商务部认证。 ​ 遇到这个不要慌&#…

美创科技助力江苏有线通过DSMM二级认证

近日&#xff0c;经中国信通院泰尔认证中心评审&#xff0c;美创科技助力江苏省广电有线信息网络股份有限公司&#xff08;以下简称“江苏有线”&#xff09;顺利通过DSMM数据安全能力成熟度二级认证&#xff0c;成为广电行业内首家获得二级认证的单位&#xff01; 背景概述 江…

什么是防火墙?

目录 什么是防火墙&#xff0c;为什么需要防火墙&#xff1f;防火墙与交换机、路由器对比防火墙和路由器实现安全控制的区别防火墙的发展史1989年至1994年1995年至2004年2005年至今 什么是防火墙&#xff0c;为什么需要防火墙&#xff1f; “防火墙”一词起源于建筑领域&#x…

ChatGPT 和 文心一言 的优缺点及需求和使用场景

ChatGPT和文心一言是两种不同的自然语言生成模型&#xff0c;它们有各自的优点和缺点。 ChatGPT&#xff08;Generative Pre-trained Transformer&#xff09;是由OpenAI开发的生成式AI模型&#xff0c;它在庞大的文本数据集上进行了预训练&#xff0c;并可以根据输入生成具有上…

GitHub 异常 - 无法连接22端口 Connection timed out

GitHub 异常 - 无法连接22端口 Connection timed out 问题描述 错误信息&#xff1a; 今天突然用ssh方式 pull GitHub的项目报:ssh: connect to host xx.xx.xx.xx port 22: Connection timed out 表明 SSH 连接在尝试通过 22 端口连接到远程服务器时超时。这可能是由于网络环…

部署本地GPT

在现实生活中&#xff0c;很多公司或个人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果&#xff1a; 查资料不用愁 家教不…

【SpringBoot框架篇】35.kafka环境搭建和收发消息

kafka环境搭建 kafka依赖java环境,如果没有则需要安装jdk yum install java-1.8.0-openjdk* -y1.下载安装kafka kafka3.0版本后默认自带了zookeeper&#xff0c;3.0之前的版本需要单独再安装zookeeper,我使用的最新的3.6.1版本。 cd /usr/local wget https://dlcdn.apache.…

Web3.0是如何影响未来互联网发展的

随着技术的不断进步和互联网的快速发展&#xff0c;我们已经进入了一个全新的数字时代。从Web1.0时代的静态网页到Web2.0时代的社交媒体和在线互动&#xff0c;互联网正在不断演化。最近&#xff0c;关于Web3.0的概念开始引起人们的关注。那么&#xff0c;什么是Web3.0&#xf…

Element UI Input组件内容格式化:换行时行首添加圆点

<el-input v-model"input"placeholder"请输入"type"textarea":rows"8"focus"handleFocus"input.native"handleInput" /> 解释一下&#xff1a; Element UI对 input 事件做了一层包装&#xff0c;无法返回…

SQL联结表及高级联结

关系表 理解关系表的最好方法 是 来看 一个 现实 世界 中的 例子。 假如 有一个 包含 产品 目录 的 数据库 表&#xff0c; 其中 每种 类别 的 物品 占 一行。 对于 每种 物品 要 存储 的 信息 包括 产品 描述 和 价格&#xff0c; 以及 生产 该 产品 的 供应商 信息。 假如 有…

利用c 原生头文件完成JPEG全流程编码

骄傲一下&#xff0c;经过一个多月的努力&#xff0c;终于完成jpeg的全套编码。经验证此程序可以把摄像头yuv信号转为JPG图片。现在的程序还不完美&#xff0c;只能对长和宽尺寸是16倍数的信号转码。而且转码速度太慢&#xff0c;一帧1280720的图片要2秒多。此程序只能对yuv420…

SQL进阶3

二、多表连结 1、什么叫联结 下面&#xff0c;我们举个例子来说明&#xff1a; 学校的安排的课程信息&#xff0c;我们平时都会为主要人员负责的对应课程信息创建表格&#xff0c;让其更好地检索得到对应数据信息。学生可以查到自己本身的课程信息&#xff0c;而老师也可以查…

2023科技风暴:AI璀璨之旅与算法备案护航

2023年&#xff0c;中国科技界风起云涌&#xff0c;热闹非凡。在这一年里&#xff0c;我们的科学家们在前沿科研战场上一次次刷新纪录&#xff0c;展现了敢于突破、勇于创新的精神。而在这场科技盛宴中&#xff0c;AI无疑是最亮的星星。让我们体验了一波跟着AI重走2023中国科技…

Vue-19、Vue监测数据的原理_对象

1、数据代理 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vue监测数据改变的的原理</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist…

Spark---累加器和广播变量

文章目录 1.累加器实现原理2.自定义累加器3.广播变量 1.累加器实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中定义的变量&#xff0c;在Executor 端的每个 Task 都会得到这个变量的一份新的副本&#xff0c;每个 task 更新这些副本的值后&…

浅谈敏捷开发的思维

什么是敏捷 Agile&#xff08;敏捷&#xff09;来源于敏捷宣言&#xff0c;宣言明确指出&#xff0c;“敏捷”&#xff1a; 不是一种方法论也不是开发软件的具体方法更不是一个框架或者过程 “敏捷”是一套价值观&#xff08;理念&#xff09;和原则&#xff0c;帮助团队在软…

PPO 跑CartPole-v1

gym-0.26.2 cartPole-v1 参考动手学强化学习书中的代码,并做了一些修改 代码 import gym import torch import torch.nn as nn import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from tqdm import tqdmclass PolicyNet(nn.Module):def __…