# Spring Cloud Alibaba

# Nacos

注册中心,配置中心

# pom
    <!-- Nacos Config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

        <exclusions>
            <exclusion>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </exclusion>
        </exclusions>
    </dependency>



#docker命令启动
docker run --name nacos -e MODE=standalone -p 8848:8848 nacos/nacos-server:2.0.3


#访问
http://172.17.110.248:8848/nacos
nacos/nacos

#本地启动nacos
startup.cmd -m standalone
http://127.0.0.1:8848/nacos
nacos/nacos

nacos鉴权
https://blog.csdn.net/qq_71416673/article/details/138067843

image-20240621155753939

# Spring Cloud Gateway

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。



# pom
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
# yml

spring:
  cloud:
     gateway:
       httpclient:
        connect-timeout: 60000
        response-timeout: 300s
       discovery:
         locator:
           lowerCaseServiceId: true
           enabled: true
       routes:
        # =====================================
        - id: cs-auth
          uri: lb://cs-auth
          order: 8000
          predicates:
          - Path=/api/auth/**
          filters:
          - StripPrefix=2
        - id: cs-admin
          uri: lb://cs-admin
          order: 8001
          predicates:
          - Path=/api/admin/**
          filters:
          - StripPrefix=2

# Sentinel

Sentinel是面向分布式服务框架的轻量级流量控制框架

主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性。

在SpringCloud体系中,sentinel主要是为了替换原Hystrix的功能,与Hystrix相比,sentinel的隔离级别更加精细,提供的Dashboard可以在线更改限流熔断规则,而且使用也越加方便。

#路径
/usr/local/docker/sentinel

#设置
vim docker-compose.yml

version: "3"
services:
  sentinel-dashboard:
    image: registry.cn-beijing.aliyuncs.com/meteorplan/bladex-sentinel-dashboard:1.8.7
    container_name: sentinel-dashboard
    restart: always
    ports: #避免出现端口映射错误,建议采用字符串格式 8080端口为Dockerfile中EXPOSE端口
      - "8858:8858"
    volumes:
      - ./sentinel/log:/root/logs

#启动
docker-compose up -d

#访问sentinel控制台
http://172.17.110.248:8858/#/login
http://127.0.0.1:8080/#/login
sentinel/sentinel


#sentinel控制台更新到nacos解决方案
https://blog.csdn.net/qq_41190902/article/details/127284398

lx-alibaba项目
CustomSentinelProperties
CustomConfigService
CustomSentinelService
CustomSentinelController

#同步sentinel后台到nacos
http://localhost:9092/restful/updateSentinelRule


image-20240625113605577

# 流量控制

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

#流量规则解释
1、资源名:唯一名称,默认请求路径。
2、针对来源:Sentinel 可以针对调用这进行限流,填写微服务名,默认 default(不区分来源)。
3、阈值类型/单击阈值:
(1)QPS(每秒钟的请求数量):当调用该 API 的 QPS 达到阈值的时候,进行限流。
(2)线程数:当调用该 API 的线程数达到阈值的时候,进行限流。
4、是否集群:不需要集群(指 Sentinel)。
5、流控模式:
(1)直接:API 达到限流条件时,直接限流。
(2)关联:当关联的资源达到阈值时,就限流自己。
(3)链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【 API 级别的针对来源】。
6、流控效果:
(1)快速失败:直接失败,抛异常。
(2)Warn Up:根据 coldFactor (冷加载因子,默认3)的值,从阈值/coldFactor,经过预热时长,才达到设置的 QPS 阈值。
(3)排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为 QPS,否则无效

image-20240625131122493

# 持久化配置

# pom
<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

# 流控yml配置
spring:
  cloud:
    sentinel:
      enabled: true
      eager: true
      transport:
        dashboard: 127.0.0.1:8080
        port: 8719
      datasource:
        flow:
          nacos:
            server-addr: 127.0.0.1:8848
#            namespace: f26426cf-fc62-48f6-88d8-d9e00a23e1bc
            data-id: ${spring.application.name}-sentinel
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: flow
#nacos添加   nacos-consumer-feign-sentinel
[
    {
        "resource": "getAll",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
持久化参数
resource:资源名,即限流规则的作用对象
limitApp:流控针对的调用来源,若为 default 则不区分调用来源
grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
count:限流阈值
strategy:流控模式 0 表示直接,1 表示关联,2 表示链路
controlBehavior:流量控制效果(0 表示快速失败,1 表示Warm up,2 表示排队等待)
clusterMode:是否为集群模式(false 表示否,true 表示是)


/**
 * 网站查询所有
 * @author
 */
@GetMapping("getAll")
@SentinelResource(value = "getAll",blockHandler = "handleException")
public Mono<ResponseEntity<SystemResponse<Object>>> getAll() {
	log.info("webSite getAll 查询所有网站");
	List<WebSite> list = webSiteService.list();
	return success(list);
}

/**
 * 自定义异常策略
 * 返回值和参数要跟目标函数一样,参数可以追加BlockException
 */
public Mono<ResponseEntity<SystemResponse<Object>>> handleException(BlockException exception){
	log.info("flow exception{}",exception.getClass().getCanonicalName());
	return error(SystemResponse.FormalErrorCode.SERVER_ERROR,"达到阈值了,不要再访问了!");
}


# 熔断降级

Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。

#熔断降级规则解释
1、资源名:唯一名称,默认请求路径。
2、降级策略:慢调用比例,异常比例,异常数

image-20240625132710451

# 熔断yml配置
spring:
  cloud:
    sentinel:
      datasource:
        degrade:
          nacos:
            server-addr: 127.0.0.1:8848
#            namespace: f26426cf-fc62-48f6-88d8-d9e00a23e1bc
            data-id: ${spring.application.name}-sentinel-degrade
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: degrade
# nacos添加 nacos-consumer-feign-sentinel-degrade
[
    {
    "resource": "/getAll",
    "count": 0.5,
    "grade": 1,
    "passCount": 0,
    "timeWindow": 2
  }
]

resource:资源名,即降级规则的作用对象
count:阈值
grade:降级模式 0:RT 1:异常比例 2:异常数
timeWindow:时间窗口(单位秒)



# 热点 key

#热点 key规则解释
1、资源名:唯一名称,默认请求路径。
2、参数索引(接口的第几个参数)
3、单机阈值(索引对应的字段传参时)
参数例外项
4、参数值(具体传参值)
5、限流阈值(对应的阈值)

image-20240625135830424

# 系统规则

从应用级别的入口流量进行控制,从单台机器的 load、CPU使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能泡在最大吞吐量的同时保证系统整体稳定性。

#系统规则参数解释
1、Load 自适应(仅对 Linux/Unix-like 机器生效)
2、平均 RT
3、并发线程数
4、入口 QPS
5、CPU使用率

image-20240625143035710

# 授权规则

授权规则可以对请求方来源做判断和控制。

#授权规则参数解释
资源名:/order/{orderId}
流控应用:lx-gateway
白名单:来源(origin)在白名单内的调用者允许访问 
黑名单:来源(origin)在黑名单内的调用者不允许访问

image-20240625143121602

# SkyWalking

#路径
/usr/local/docker/skywalking

#设置
vim docker-compose.yml

version: '3' #自定义版本号
services:
  skywalking-oap:
    image: apache/skywalking-oap-server:8.4.0-es6 #此处使用8.4.0版本
    container_name: skywalking-oap #容器名
    restart: always
    ports:
      - 11800:11800 #上报端口
      - 12800:12800 #ui读取端口
    environment:
      JAVA_OPTS: "-Xms512m -Xmx512m" #限制运行大小
    volumes:
      - /etc/localtime:/etc/localtime #配置时区与宿主机一致
  skywalking-ui:
    image: apache/skywalking-ui:8.4.0 #版本号与oap一致
    container_name: skywalking-ui #容器名
    depends_on:
      - skywalking-oap
    links:
      - skywalking-oap #与容器oap建立连接
    restart: always 
    ports:
      - 3380:8080 #3380ui界面
    environment:
      SW_OAP_ADDRESS: skywalking-oap:12800 #设置读取oap的端口
    volumes:
      - /etc/localtime:/etc/localtime #配置时区与宿主机一致

#启动
docker-compose up -d

#访问
http://172.17.110.248:3380/


#修改 agent.config  ip = 127.0.0.1

#本地启动服务配置(暂未使用)
-javaagent:D:\0lx\lx-alibaba\lx-external-skywalking\agent\skywalking-agent.jar
-Dskywalking.agent.service_name="lx-gateway"
-Dskywalking.collector.backend_service="127.0.0.1"

image-20240625162126638

image-20240625162832804

image-20240625162842761