springcloud Alibaba中gateway和sentinel联合使用

news2024/11/16 0:33:18

看到这个文章相信你有一定的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: 7009

spring:
  application:
    name: gateway-sentinel-name
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        password: nacos
        username: nacos
    gateway:
      routes:
        - id: gateway_sentinel
          uri: lb://consume-name1
          predicates:
            - Path=/consume/**   #**/
          filters:
            - StripPrefix=1
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080
      eager: true
      filter:
        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)
#  //        如果使用配置的方式就卸载配置文件中,如果使用编码方式就写在启动类里面!!!
##使用编码处理方式的时候。就是在网关回调的时候进行出来被拦截的请求!!!
#那网关回调是啥?官网可以看到哦,就是请求经过网关与两个过程,一个是经历网关过滤器,经过过滤器后会进行服务调用。调用后在返回给网关,网关在传给前端信息。
  @SpringBootApplication
  public class GatewaySentinelApplication {

  public static void main(String[] args) {
  SpringApplication.run(GatewaySentinelApplication.class, args);

  GatewayCallbackManager.setBlockHandler(new RedirectBlockRequestHandler("https://www.baidu.com"));

}
}

#编码处理方式(自定义)这个就是自定义的了,是不是和application.xml配置的自定义的很像呢!
  @SpringBootApplication
  public class GatewaySentinelApplication {

  public static void main(String[] args) {
  SpringApplication.run(GatewaySentinelApplication.class, args);

  GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
  @Override
  public 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 {

    @PostConstruct
    public 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.coloradmin.cn/o/1391005.html

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

相关文章

JAVAEE初阶 文件IO(一)

这里写目录标题 一. 计算机中存储数据的设备1.1 CPU1.2 内存1.3 硬盘1.4 三种存储的区别 二.文件系统2.1 相对路径2.2 绝对路径2.3 .和..的含义2.4 例子2.5 everything工具 三.文件3.1 文本文件3.2 二进制文件 四. JAVA对于文件的API4.1 getParent getName getPath getAbsolute…

Dubbo服务降级:保障稳定性的终极指南【六】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Dubbo服务降级&#xff1a;保障稳定性的终极指南【六】 前言服务降级概述服务降级配置服务降级最佳实践 前言 在构建分布式系统时&#xff0c;不可避免地会面临高流量、网络故障和服务不可用等问题。…

Python | 三、函数

函数的形参和实参&#xff08;对应卡码网11题句子缩写&#xff09; 除非实参是可变对象&#xff0c;如列表、字典和集合&#xff0c;则此时形参会复制实参的地址&#xff0c;即此时二者指向同一个地址&#xff0c;因此在函数内对形参的操作会影响到实参除这种情况外&#xff0…

FlinkAPI开发之处理函数

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 之前所介绍的流处理API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c…

Kafka-RecordAccumulator分析

前面介绍过&#xff0c;KafkaProducer可以有同步和异步两种方式发送消息&#xff0c;其实两者的底层实现相同&#xff0c;都是通过异步方式实现的。 主线程调用KafkaProducer.send方法发送消息的时候&#xff0c;先将消息放到RecordAccumulator中暂存&#xff0c;然后主线程就…

HCIA—— 16每日一讲:HTTP和HTTPS、无状态和cookie、持久连接和管线化、(初稿丢了,这是新稿,请宽恕我)

学习目标&#xff1a; HTTP和HTTPS、无状态和cookie、持久连接和管线化、HTTP的报文、URI和URL&#xff08;初稿丢了&#xff0c;这是新稿&#xff0c;请宽恕我&#x1f636;‍&#x1f32b;️&#xff09; 学习内容&#xff1a; HTTP无状态和cookieHTTPS持久连接和管线化 目…

Angular系列教程之MVC模式和MVVM模式

文章目录 MVC模式MVVM模式MVC与MVVM的区别Angular如何实现MVVM模式总结 在讨论Angular的时候&#xff0c;我们经常会听到MVC和MVVM这两种设计模式。这两种模式都是为了将用户界面(UI)和业务逻辑分离&#xff0c;使得代码更易于维护和扩展。在这篇文章中&#xff0c;我们将详细介…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码&#xff08;直接在cmd命令提示符中&#xff0c;不需要打开Python&#xff09; pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

Android 11以上根据package name查询应用是否安装,Koltin

Android 11以上根据package name查询应用是否安装&#xff0c;Koltin Android 11和过去较早Android版本不同&#xff0c;需要在Androidmanifest.xml里面配置<queries>属性&#xff1a; <manifest xmlns:android"http://schemas.android.com/apk/res/android&quo…

ACL【新华三与华为的区别】

【解释】acl简单点解释就是&#xff0c;一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务&#xff0c;但不能访问 FTP 服务 【操作步骤】 {易混点 }&#xff1a;1. …

端智能在大众点评搜索重排序的应用实践

1 引言 随着大数据、人工智能等信息技术的快速发展&#xff0c;云计算已经无法满足特定场景对数据隐私、高实时性的要求。借鉴边缘计算的思想&#xff0c;在终端部署 AI 能力逐渐步入大众的视野&#xff0c;“端智能”的概念应运而生。相比于传统的云计算&#xff0c;在智能手…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例&#xff1a;优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建&#xff0c;并在…

【project】estimate Aβ-PET pattern

1.17 1.16 1.14 写一个函数&#xff0c;输入是每个文件的地址&#xff0c;然后能做这一系列的操作 用AFM0095进行bbr的配准 方法一&#xff0c;间接配准&#xff0c;frmi先到str&#xff0c;再到mni&#xff08;str2fmri后再fmri2str&#xff09; fmri2str 只需要dof 6,6个自…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

爬虫之Cookie获取:利用浏览器模拟一个cookie出来、面对反爬虫、加密的cookie的应对方法

爬虫之Cookie获取&#xff1a;利用浏览器模拟一个cookie出来、面对反爬虫、加密的cookie的应对方法 在爬虫或模拟请求时&#xff0c;特别是获取验证码的时候&#xff0c;反爬虫的网站的cookie或定期失效&#xff0c;复制出来使用是不行的为了应对这种方式&#xff0c;我们可能…

Qt 状态机框架:The State Machine Framework (一)

一、什么是状态机框架 状态机框架提供了用于创建和执行状态图/表[1]的类。这些概念和表示法基于Harel的Statecharts&#xff1a;一种复杂系统的可视化形式&#xff0c;也是UML状态图的基础。状态机执行的语义是基于状态图XML&#xff08;SCXML&#xff09;的。 状态图提供了一…

实人认证(人像三要素)API:加强用户身份验证

前言 在当今数字化时代&#xff0c;随着互联网应用的广泛普及&#xff0c;用户身份验证的重要性日益凸显。实人认证&#xff08;人像三要素&#xff09;API作为一种新型的身份验证方式&#xff0c;凭借其高效、安全和便捷的特性&#xff0c;正在成为加强用户身份验证的强大工具…

八、K8S metrics-server

下载yaml文件 wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml 改名&#xff1a;mv high-availability.yaml metrics-server.yaml 查看镜像地址 查看镜像地址 grep -rn image high-availability.yaml 150: …

深入浅出Spring AOP

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天要聊的是Java中Spring框架的AOP&#xff08;面向切面编程&#xff09;。对于程序员来说&#xff0c;理解AOP对于掌握Spring框架来说是超级关键的。它像是魔法一样&#xff0c;能让咱们在不改变原有代码的…

kylin集群负载均衡(kylin3,hbaseRIF问题)

hbase历险记 目录 hbase历险记 寻找问题 分析原因 解决方案 方案1&#xff08;资源问题、失败&#xff09; 方案2&#xff08;成功&#xff09; 寻找问题 不知道你是不是有这样的疑惑。我kylin是个单机&#xff0c;我使用的hbase是个集群&#xff0c;但内存全在某一台机…