# 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

# 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

# 流量控制
流量控制(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,否则无效

# 持久化配置
# 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、降级策略:慢调用比例,异常比例,异常数

# 熔断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、限流阈值(对应的阈值)

# 系统规则
从应用级别的入口流量进行控制,从单台机器的 load、CPU使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能泡在最大吞吐量的同时保证系统整体稳定性。
#系统规则参数解释
1、Load 自适应(仅对 Linux/Unix-like 机器生效)
2、平均 RT
3、并发线程数
4、入口 QPS
5、CPU使用率

# 授权规则
授权规则可以对请求方来源做判断和控制。
#授权规则参数解释
资源名:/order/{orderId}
流控应用:lx-gateway
白名单:来源(origin)在白名单内的调用者允许访问
黑名单:来源(origin)在黑名单内的调用者不允许访问

# 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"



← Dubbo Spring Cloud →