springcloud集成sentinel 《微服务》

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: sentinel本身支持qps(qps:每秒可以进来的请求数,只是进来,不管是否进来之后服务走完。只管进来不管出去。),不会创建线程池,比较轻;而远程调用服务的时候,hystrix调用一个方法就会创建一个线程池,所以hystrix特别重;sentinel本身支持有qps,远程调用不会创建线程池,如果qps大,后面的服务处理不过来,所以就要进行限流降级处理;信号量隔离hystrix远程调用会创建线程池,并且该线程池是依赖tomcat的,不会比tomcat线程多,即使多了也没意义。线程池隔离

1.安装

1.1 docker安装

docker run --name sentinel -d -p 8858:8858 -p 8719:8719 -d bladex/sentinel-dashboard

1.2 jar 安装

java -jar sentinel-dashboard-1.8.4.jar

1.3 登录

账号和密码都是sentinel

在这里插入图片描述

2.集成

Sentinel控制台修改规则:仅存在于服务的内存中,不会修改Nacos中配置值,重启后恢复原来的值 Nacos控制台修改规则:Nacos持久化规则,服务的内存也同步更新

2.1 pom 配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.lys.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-sentinel-service</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--<version>2.2.1.RELEASE</version>-->
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--  web组件      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- SpringCloud alibaba sentinel-datasource-nacos,后续做持久化用到 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>
</project>

2.2 bootstrap.yml

规则没有持久化,需要自行配置

server:
  port: 8002

nacos:
  config:
    bootstrap:
      log:
        enable: true

spring:
  application:
    name: nacos-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 10.6.8.238:8848 #Nacos作为服务注册中心地址
      config:
        server-addr: 10.6.8.238:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEFAULT_GROUP #指定在哪个group里
        namespace:
# {spring.application.name}-{spring.profiles.active}.{spring.cloud.nacos.config.file-extension}
# 实际访问的配置nacos-payment-provider.yaml
    sentinel:
      filter:
        url-patterns: /**
      transport:
        #配置sentinel,dashboard地址
        dashboard: 10.6.8.238:8858
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719
        #clientIp: 10.7.0.25

规则持久化配置

server:
  port: 8002

nacos:
  config:
    bootstrap:
      log:
        enable: true

spring:
  application:
    name: nacos-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 10.6.8.238:8848 #Nacos作为服务注册中心地址
      config:
        server-addr: 10.6.8.238:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEFAULT_GROUP #指定在哪个group里
        namespace:
# {spring.application.name}-{spring.profiles.active}.{spring.cloud.nacos.config.file-extension}
# 实际访问的配置nacos-payment-provider.yaml
    sentinel:
      filter:
        url-patterns: /**
      transport:
        #配置sentinel,dashboard地址
        dashboard: 10.6.8.238:8858
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719
        #clientIp: 10.7.0.25
      # 下面为持久化到nacos
      datasource:
        # 这里的flow名字随便取   流控规则
        flow:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            groupId: DEFAULT_GROUP
            dataId: ${spring.application.name}-flow-rules
            rule-type: flow
            data-type: json
        # 授权规则
        authority:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            dataId: ${spring.application.name}-authority-rules
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: authority
          # 降级规则
          degrade:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              dataId: ${spring.application.name}-degrade-rules
              groupId: DEFAULT_GROUP
              data-type: json
              rule-type: degrade
          # 热点规则
          param-flow:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              dataId: ${spring.application.name}-param-flow-rules
              groupId: DEFAULT_GROUP
              data-type: json
              rule-type: param-flow
          # 系统规则
          system:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              dataId: ${spring.application.name}-system-rules
              groupId: DEFAULT_GROUP
              data-type: json
              rule-type: system


nacos 增加对应的规则如:nacos-sentinel-service-flow-rules.json

[
  {
    "resource": "/testA",
    "limitApp": "default",
    "grade": 1,
    "count": 1,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  },
  {
    "resource": "/testB",
    "limitApp": "default",
    "grade": 1,
    "count": 1,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  }
]

resource:资源名称;
IimitApp:来源应用;
grade:國值类型,0表示线程数,1表示QPS;
count:单机阈值
strategy:流控模式,0表示直接,1表示关联,2表示链路
controlbehavior:流控效果,0表示快速失败,1表示 Warm Up,2表示排队等待;
cluster Mode:是否集群。

2.3 FlowLimitController

package com.lys.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * @Auther: liuysh
 * @Date: 2022/7/20 21:55
 * @Description:
 */
@RestController
@Slf4j
public class FlowLimitController {
    @GetMapping("/testA")
    public String testA() {
        return "testA";
    }

    @GetMapping("/testB")
    public String testB() {
        return "testB";
    }

    @GetMapping("/testC")
    public String testC() {
        try {
            TimeUnit.SECONDS.sleep(1);
        }catch(InterruptedException e) {
            e.printStackTrace();
        }
        log.info("testC,测试RT");
        return "testC";
    }

    @GetMapping("/testD")
    public String testD() {
        log.info("testD测试,异常比例");
        int age = 10/0;
        return "testD";
    }

    @GetMapping("/testE")
    public String testE() {
        log.info("testE测试,异常数");
        int age = 10/0;
        return "testE";
    }

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2
    ) {
        return "testHotKey";
    }
    public String deal_testHotKey(String p1, String p2, BlockException exception) {
        return "testHotKey的兜底方法deal_testHotKey执行";
    }
}

3.sentinel与hystrix对比

功能 Sentinel Hystrix 总结
隔离策略 信号量隔离(并发线程数限流)(模拟信号量) 线程池隔离/信号量隔离 Sentinel不创建线程依赖tomcat或jetty容器的线程池,存在的问题就是运行容器的线程数量限制了sentinel设置值的上限可能设置不准。比如tomcat线程池为10,sentinel设置100是没有意义的,同时隔离性不好hystrix使用自己创建的线程池,隔离性会更好
熔断降级策略 基于响应时间、异常比率、异常数 基于异常比率 快速失败的本质功能
实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于 RxJava)
动态规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 有限的支持(并发线程数或信号量大小) 快速失败的本质功能
流量整形 支持预热模式、匀速器模式、预热排队模式 不支持(排队) 支持排队好吧
系统自适应保护 支持(仅对linux生效) 不支持 所谓的自适应就是设置一个服务器最大允许处理量的阈值。(有比没有强,但是要知道最大负载量是多少。)
控制台 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 简单的监控查看接近实时数据 控制台是非常有竞争力的功能,因为能集中配置限制数据更方便,但是展示数据和实时性没有hystrix直观。
配置持久化 ZooKeeper, Apollo, Nacos Git/svn/本地文件 Sentinel客户端采用直接链接持久化存储,应用客户端引用了更多的依赖,同样的存储链接可能有多个配置
动态配置 支持 支持 hystrix可能需要手动触发,sentinel增加了额外的端口进行配置文件控制,应该也支持spring boot动态配置
黑白名单 支持 不支持 个人觉得这个功能用的不是很多
springcloud集成 非常高 Spring boot使用hystrix会更方便
整体优势 集中配置设置及监控+更细的控制规则 漂亮的界面+接近实时的统计结果 集中配置可能更有吸引力,但是配置值是多少以及让谁控制依然是很头疼的事情。运维控制可能不知道哪个应该优先哪个不优先,应该调整到多大。什么时候更适合使用sentinel?个人认为docker容器化部署之后sentinel可能更会发挥作用,但是会有另外的竞品出现做选型。
  • sentinel本身支持qps(qps:每秒可以进来的请求数,只是进来,不管是否进来之后服务走完。只管进来不管出去。),不会创建线程池,比较轻;而远程调用服务的时候,hystrix调用一个方法就会创建一个线程池,所以hystrix特别重;
  • sentinel本身支持有qps,远程调用不会创建线程池,如果qps大,后面的服务处理不过来,所以就要进行限流降级处理;信号量隔离
  • hystrix远程调用会创建线程池,并且该线程池是依赖tomcat的,不会比tomcat线程多,即使多了也没意义。线程池隔离
  • 限流方案:qps 、线程数
相关文章
|
16天前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
31 0
|
2天前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
11 1
|
14天前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
27 5
|
13天前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
77 2
|
16天前
|
Java 对象存储 开发者
微服务世界的双雄争霸:Spring Cloud与Netflix OSS——谁将引领下一次企业级应用变革的风暴?
Spring Cloud与Netflix OSS是微服务架构的核心组件集,分别以其与Spring Boot的紧密集成及为大规模分布式系统设计的特性,在Java开发社区中广受青睐。前者通过Eureka提供服务发现机制,简化服务注册与定位;后者借助Hystrix增强系统弹性和可靠性,避免雪崩效应。此外,二者还包含负载均衡(Ribbon)、声明式HTTP客户端(Feign)及API网关(Zuul)等功能,共同构建强大微服务体系,助力开发者聚焦业务逻辑,提升系统灵活性与性能。
34 0
|
16天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
16天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
2月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
71 0
|
28天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
50 3