springCloud 阿里巴巴

阮喜
2023-12-01

springClud 阿里巴巴

1.nacos的配置

1.nacos的单机启动 
   startup.cmd -m standalone     windows启动
   sh startup.sh -m standalone       linux启动
   macos的默认的访问路径     http://localhost:8848/nacos
注意:nacos如果不配置集群,如果不使用单机启动可能会报错

2.限流,降级,热点sentinel

2.1sentinel介绍,sentinel已经被打包成为了一个可以执行的jar包,在阿里的官网上面可以下载

以下是可执行文件的命令,包括启动的时候:1.这是监听端口,设置服务名

java  -Dserver.port=8849  -Dcsp.sentinel.dashboard.server=localhost:8849  -Dproject.name=sentinel-dashboard   -jar  sentinel-dashboard-1.8.0.jar

2.2sentinel需要在bootstrap的配置

1.maven的客户端的依赖
      <!--监控与限流sentinel-->
     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
     </dependency>
     
     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-cloud-actuator</artifactId>
        </dependency>

spring:
   cloud:
      sentinel:
      transport:
        port: 8099 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: localhost:8180 #指定sentinel控制台的地址
        eager: true #如果访问该资源sentinel控制台才会显示,开启后不访问sentinel也会在控制台显示
1.在

2.3限流

1.阈值限流
2.关联限流
3.链路限制流(例如: 现在要有人在浏览A商品,有人准备购买A商品,不管是浏览A商品还是购买A商品都要对A商品进行查询,这个时候比如我可以对添加购物车这一条链路进行限流)

2.4降级

1.慢调用比例降级

所谓慢调用比例,就是我们自己给定一个慢调用的时间比如100ms,和一个慢调用的比例,比如是50%,也就是说在该资源被调用的过程中如果,响应时间大于100ms的情况入过大于50%那么该服务调用就是降级,也就是说在10次的请求中如果有五次请求的时间都是在100ms以上那么该资源的调用就会降级

2.异常处理降级

所谓的异常处理降级,就是该请求的处理过程中如果发生了异常情况的话,设置的异常比例比如为0.5,最小的请求数量为10,那么在十次的请求过程中如果发生了五次的异常的处理情况下,那么就要进行熔断的处理

2.5热点数据

所谓的热点数据的限流,降级主要是针对于具体的数据,也就是访问的参数进行限流降级处理,比如,我现在访问一个id=10的热点新闻数据,我将此请求中的参数设置为id=10那么的话,当平凡是的访问该数据的时候就进行限流

2.6.sentinel的数据的持久化

2.6.1与持久化到nacos配置中心

1)导入依赖

 <!--将sentinel客户端的数据持久化到nacos的配置中心-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

2)在bootstrap中配置数据源

spring:
  cloud:
    sentinel:
      # nacos 持久化数据
      datasource:
        # 可配置多个规则
        # 可自定义key-流控规则
        dashboard-flow:
          nacos:
            server-addr: http:localhost
            dataId: ${spring.application.name}-flow
            file-extension: json
            rule-type: flow
            namespace: ${spring.profiles.active}
        # 可自定义key-系统规则
        dashboard-system:
          nacos:
            server-addr: http:localhost
            dataId: ${spring.application.name}-system
            file-extension: json
            rule-type: system
            namespace: ${spring.profiles.active}

3)配置中心的配置
流控规则

[
  {
    // 资源名
    "resource": "/test",
    // 针对来源,若为 default 则不区分调用来源
    "limitApp": "default",
    // 限流阈值类型(1:QPS;0:并发线程数)
    "grade": 1,
    // 阈值
    "count": 1,
    // 是否是集群模式
    "clusterMode": false,
    // 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待)
    "controlBehavior": 0,
    // 流控模式(0:直接;1:关联;2:链路)
    "strategy": 0,
    // 预热时间(秒,预热模式需要此参数)
    "warmUpPeriodSec": 10,
    // 超时时间(排队等待模式需要此参数)
    "maxQueueingTimeMs": 500,
    // 关联资源、入口资源(关联、链路模式)
    "refResource": "rrr"
  }
]

降级规则
根据实际的需要改变减少对应的参数即可

[
  {
  	// 资源名
    "resource": "/test1",
    "limitApp": "default",
    // 熔断策略(0:慢调用比例,1:异常比率,2:异常计数)
    "grade": 0,
    // 最大RT、比例阈值、异常数
    "count": 200,
    // 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
    "slowRatioThreshold": 0.2,
    // 最小请求数
    "minRequestAmount": 5,
    // 当单位统计时长(类中默认1000)
    "statIntervalMs": 1000,
    // 熔断时长
    "timeWindow": 10
  }
]

热点规则
根据实际的需要改变减少对应的参数即可

[
  {
  	// 资源名
    "resource": "/test1",
    // 限流模式(QPS 模式,不可更改)
    "grade": 1,
    // 参数索引
    "paramIdx": 0,
    // 单机阈值
    "count": 13,
    // 统计窗口时长
    "durationInSec": 6,
    // 是否集群 默认false
    "clusterMode": 默认false,
    // 
    "burstCount": 0,
    // 集群模式配置
    "clusterConfig": {
      // 
      "fallbackToLocalWhenFail": true,
   	  // 
      "flowId": 2,
      // 
      "sampleCount": 10,
      // 
      "thresholdType": 0,
      // 
      "windowIntervalMs": 1000
    },
    // 流控效果(支持快速失败和匀速排队模式)
    "controlBehavior": 0,
    // 
    "limitApp": "default",
    // 
    "maxQueueingTimeMs": 0,
    // 高级选项
    "paramFlowItemList": [
      {
      	// 参数类型
        "classType": "int",
      	// 限流阈值
        "count": 222,
      	// 参数值
        "object": "2"
      }
    ]
  }
]

系统规则
负值表示没有阈值检查。不需要删除参数

[
  {
  	// RT
    "avgRt": 1,
    // CPU 使用率
    "highestCpuUsage": -1,
    // LOAD
    "highestSystemLoad": -1,
    // 线程数
    "maxThread": -1,
    // 入口 QPS
    "qps": -1
  }
]

受权规则

[
  {
    // 资源名
    "resource": "sentinel_spring_web_context",
  	// 流控应用
    "limitApp": "/test",
    // 授权类型(0代表白名单;1代表黑名单。)
    "strategy": 0
  }
]

3.Gateway网关

3.1配置网关

3.1.1配置网管需要加入的依赖

        <!--springClud中网关的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
       <!--nacos服务的注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

注意:nacos的服务的注册与发现的依赖并非必须的,但是如果gataway想要获取相关的服务,可以直接在服务注册发现中心进行配置,当然不配置网关的话也可,但是提供网关的服务的时候会变得异常的复杂,其次在进行负载均衡的时候,网管可以根据同一个服务找到相关的实例进行负载均衡

3.1.2配置网关中bootstrap配置文件中相关的配置

spring:
   cloud:
    gateway:
      routes:
        # 路由id,可以任意
        - id: user-service-route
          # 代理的服务地址
          #uri: http://127.0.0.1:9091
          # lb表示从eureka中获取具体服务
          uri: lb://user-service
          # 路由断言: 可以匹配映射路径
          predicates:
            #- Path=/user/**
            #- Path=/**
            - Path=/api/user/**
          filters:
            # 添加请求路径的前缀
            #- PrefixPath=/user
            #1表示过滤1个路径,2表示两个路径,以此类推
            - StripPrefix=1
            - MyParam=name
      # 默认过滤器,对所有路由都生效
      default-filters:
        - AddResponseHeader=X-Response-Foo, Bar
        - AddResponseHeader=abc-myname,heima
        #跨域配置
      globalcors:
        corsConfigurations:
          '[/**]':
            #allowedOrigins: * # 这种写法或者下面的都可以,*表示全部
            allowedOrigins:
              - "http://docs.spring.io"
            allowedMethods:
              - GET

3.1.3通过代码的方式配置路由

@Configuration
public class GateWayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();

        //下面是完整的添加路由机制
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        return   routes.route("roulte03", new Function<PredicateSpec, Route.AsyncBuilder>() {
            @Override
            public Route.AsyncBuilder apply(PredicateSpec predicateSpec) {
                predicateSpec.query("username","zhangsan");//查询参数的断言
                predicateSpec.path("/user/**");
                //predicateSpec.header("token","admin");  //匹配请求头的断言
                //predicateSpec.before();添加时间的断言
                predicateSpec.query("username").filters(f -> {
                    return f.addRequestParameter("password", "123456");//添加参数的的过滤器
                });
                Route.AsyncBuilder asyncBuilder = predicateSpec.uri("lb://jt-auth");
                return asyncBuilder;
            }
        }).build();

         //下面是简化版的路由的配置
         routes.route("path_rote_xiaozhi",
                r -> r.path("/guonei")
                        .uri("http://news.baidu.com/guonei")).build();
        return routes.build();
    }
    @Bean
    public RouteLocator customRouteLocator2(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("path_route_xiaozhi2", r -> r.path("/guoji").uri("http://news.baidu.com/guoji")).build();
        return routes.build();
    }
}

3.2网关的三个核心的概念

  1. 路由(route)路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
  2. 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。
  3. 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

3.2.3几种常见的断言方式

  1. 请求路径上的断言 path 路径
  2. 请求方式上的断言 Method 请求行
  3. 请求参数上的断言 Query 请求体,请求行
  4. 请求头上的断言 Head 请求头
  5. 时间上的断言 Before,After,Between

3.2.4常见的几种过滤的方法

  1. 请求行上添加或者删除路径
  2. 请求体上添加或者删除请求头的键值对
  3. 请求体中途添加或者删除请求的参数

3.2.5全局过滤器

3.2.6自定义过滤器

public class AuthGobalFilter  implements GlobalFilter, Order {
    @Override
    public Class<? extends Annotation> annotationType() {
        return null;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return null;
    }

    @Override
    public int value() {
        return 0;
    }
}

3.3网关层面的限流,将gateway与settinel结合起来

3.3.1加入sentinel与gateway-sentinel适配器之间的依赖

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>


        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
            <version>RELEASE</version>
        </dependency>

2.参数的设置,打开项目的配置
将vm-opton设置为:-Dcsp.sentinel.app.type=1

注意版本之间的控制

3.3.2.限流的规则有如下几种

阀值得类型:QPS 与 线程数
匹配的方式:精确,子串,正则
匹配的内容:clint-ip,head请求头,cookie缓存,URL请求的参数,Remote port 远程端口
自定义分组限流:通过分组的方式进行限流,但是这种方式只进行路径的匹配,不能进行参数的匹配

3.3.3自定义的限流之后的返回的值,下面是限流之后自定义的返回限流之后的效果,参考实例

@Configuration
public class GatewayReturnConfig {

    public   GatewayReturnConfig(){
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                ServerHttpResponse response = serverWebExchange.getResponse();
                String json="{\"code\":200,\"message\":\"您现在访问过于频繁,请稍后再访问\"}";
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(json), String.class);
                return body;
            }
        });
    }
}

 类似资料: