从零开始搭建高负载java架构(06):gateway网关节点(sentinel篇)

目录

1. 安装sentinel管理后台

2. 网关集成sentinel

3. sentinel常用的规则


1. 安装sentinel管理后台

1. 下载sentinel 1.8.6最新版本
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
2. 启动sentinel控制后台
java -Dserver.port=6003 -Dcsp.sentinel.dashboard.server=localhost:6003 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
其中,6003是控制后台的端口,启动后,通过网页访问:http://127.0.0.1:6003

默认的登录名和密码:sentinel

2. 网关集成sentinel

1. 修改pom.xml, 添加依赖:

<!-- 引入sentinel进行服务降级熔断 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- gateway网关整合sentinel进行限流降级 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>

2. 修改网关的nacos配置,添加以下配置项:

spring:
  cloud:
    sentinel:
      filter:
        enabled: false
      eager: true ## 立即加载
      transport:
        port: 7101  ## sentinel规则通过此端口通知网关
        dashboard: localhost:6003 ## sentinel控制台地址
      #配置限流之后的响应内容
      scg:  
        fallback:
          # 两种模式:一种是response返回文字提示信息,一种是redirect,重定向跳转,需要同时配置redirect(跳转的uri)
          mode: response
          # 响应的状态
          response-status: 426
          # 响应体
          response-body: '{"code": 426,"message": "限流了,稍后重试!"}'

启动网关节点,登录sentinel, 则可看到新加的网关服务:

3. sentinel常用的规则

        Sentinel支持基于网关路由的Rule ID和网关访问的API路径的限流和熔断规则,临时的限流和熔断规则可以通过Sentinel的管理后台进行添加,但后台添加的规则在网关重启后会丢失,因此常规的规则需要硬代码方式编写,具体是实现一个Sentinel相关的配置,在配置类里初始化相关规则,示例代码如下:

package com.cloudservice.gateway_service.sentinel;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;
import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import jakarta.annotation.PostConstruct;
@Configuration
public class GatewaySentinelConfig {
    private final List<ViewResolver> viewResolverList;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public GatewaySentinelConfig(ObjectProvider<List<ViewResolver>> viewObjectProvider, 
                                ServerCodecConfigurer serverCodecConfigurer) 
    {
        this.viewResolverList = viewObjectProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        return new SentinelGatewayBlockExceptionHandler(viewResolverList, serverCodecConfigurer);
    }
    @Bean
    @Order(-1)
    public GlobalFilter sentinelGlobalFilter() {
        return new SentinelGatewayFilter();
    }
    // 配置对象初始化时执行,初始化Route和API的过滤规则
    @PostConstruct
    public void doInit() {
        initCustomizedApis();
        initGatewayRules();
    }
    // 初始化API的规则
    // SentinelGatewayConstants.URL_MATCH_STRATEGY_EXACT 精确匹配
    // SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX 前缀匹配
    // SentinelGatewayConstants.URL_MATCH_STRATEGY_REGEX 正则表达式匹配
    private void initCustomizedApis() {
        Set<ApiDefinition> definitions = new HashSet<>();
        ApiDefinition api = new ApiDefinition("自定义api规则")
            .setPredicateItems(new HashSet<ApiPredicateItem>() {{
                add(new ApiPathPredicateItem()
                    .setPattern("/test")
                    .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
            }});
        definitions.add(api);
        GatewayApiDefinitionManager.loadApiDefinitions(definitions);
    }

    // 初始化Route的规则
    private void initGatewayRules() {
        Set<GatewayFlowRule> rules = new HashSet<>();
        rules.add(new GatewayFlowRule("order-service")
                    .setCount(2)
                    .setIntervalSec(1));
        GatewayRuleManager.loadRules(rules);
    }
}

[上一篇]从零开始搭建高负载java架构(05)——gateway网关节点(权限验证篇)

​[下一篇]从零开始搭建高负载java架构(07):Caffeine缓存

【参考资料】
[1]Spring Cloud Gateway 整合 sentinel 实现流控熔断 
[2]参考示例代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Gateway Sentinel是一种限流技术,它可以在层面对请求进行限流,防止过多的请求对后端服务造成压力。它可以根据不同的规则对请求进行限制,例如根据IP地址、请求路径、请求参数等进行限制。同时,Gateway Sentinel还可以对请求进行统计和监控,帮助开发人员了解系统的负载情况,及时调整系统配置,保证系统的稳定性和可靠性。 ### 回答2: Gateway sentinel是如今常用的一种限流技术。其作用和传统的限流技术类似,主要是用来保护服务的可用性和稳定性,避免因过多请求而导致的服务宕机或系统崩溃等问题。但是与传统技术不同的是,Gateway sentinel的限流策略更加精细和灵活,可以根据实际情况进行动态调整,使得限流更加准确和效。 Gateway sentinel主要有以下几个特点: 一、有多种限流策略可供选择:针对不同的场景和需求,Gateway sentinel提供了多种不同的限流策略,如令牌桶限流、漏桶限流、并发数限流等等。管理员可以根据实际情况选择适合自己的限流策略。 二、支持动态调整:Gateway sentinel可以根据流量的变化动态调整限流策略和参数,使得限流更加准确和效。同时,还可以根据实时数据进行分析和预测,预判可能出现的问题,提前进行限流和调整,避免系统崩溃。 三、集成了监控和报警系统:Gateway sentinel不仅可以实现限流功能,还具备监控和报警功能。管理员可以根据需要设置监控指标和报警规则,及时获取系统状态和异常信息,保证系统的可用性和可靠性。 四、易于使用和扩展:Gateway sentinel是一个基于插件架构的限流框架,可以集成在各种不同的Web应用程序和微服务框架中。同时,其还提供了友好的API和文档,方便开发者进行二次开发和定制化。 总之,Gateway sentinel是一种功能强大、灵活性、易于使用和扩展的限流技术,对于保障服务的稳定性和可用性有着重要的作用,是现代企业必不可少的一项技术。 ### 回答3: Gateway sentinel限流是一种防止DDoS攻击的络安全机制,它通过限制络请求的访问频率来保护服务端资源免受过多的请求而崩溃的风险。这种机制可用于所有类型的Web应用程序,包括本地安装的Web应用程序、云服务和SaaS软件。 这项限流工具可以通过对每个请求进行流量监测来识别是否存在异常请求,并采取适当的措施来处理它们。在正常的络流量条件下,所有来自客户端的请求都会在层进行处理和审核。但如果层检测到来自一个IP地址的数据包进行了多次重复的无效请求,它就会限制该IP地址的访问频率,以防止它进一步地消耗服务器资源。 此外,限流机制还可以实时监测络流量,检测和分析异常攻击流量,并将攻击行为数据传递给安全级性工具,从而加强安全防御体系。 在安装和配置软件之后,管理员可以选择合适的阈值来控制限流,根据您的需求进行配置,以便确保服务器和络能够在意外流量流入的情况下顺利运行。 总之,限流是一种可靠而安全的防御工具,它可以让您的Web应用程序不受攻击,从而保障用户的数据和络安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好的兆头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值