springcloud Alibaba
spring-cloud-alibaba/README-zh.md at master · alibaba/spring-cloud-alibaba · GitHub
Nacos
单节点:8848 dashboad端口 客户端、服务提供者、都需要注册进nacos,客户端需添加nacos作为配置中心
集群下:3333.4444.5555 nacos集群端口
负载均衡集群:8090nginx负载均衡端口
Nacos 作服务注册中心 (自带负载均衡)
投机取巧,赋值nacos服务 直接拷贝,虚拟端口映射
包含了Ribbon,支持负载均衡
服务提供者 9001、9002 两个服务端注册中心
服务消费端 83 一个服务消费者 (开启restTemplate负载均衡)
将需要访问当服务名写在配置中,方便消费调用 @Value("${server-url.xxxx}")
切换nacos服务 cp、ap
Nacos 作配置中心
创建客户端服务,添加配置中心依赖
两个配置文件
+
此两处文件后缀必须一样
自带动态刷新
在配置中心修改yaml内容,客户端能动态刷新
命名空间分组、DataID关系
多环境多项目管理
命名空间
修改配置
Group
如访问 : nacos-config-client-info.yaml DEV_GROUP
Namespace
读取某个配置
Nacos集群和持久化
每个nacos服务都会自带一个derby嵌入式数据库,集群部署,难保证一致性,需要切换外置高可用数据库
持久化
切换derby数据库为外置mysql数据库
新建数据库 nacos_config ,导入nacos/conf/nacos-mysql.sql,
修改nacos/conf/application.properties
nacos 启动 : sh startup.sh -m standalone (非集群) sh startup.sh ./startup.sh
奇怪:先sh startup.sh -m standalone,再./startup.sh,才能开启
nacos集群部署
配置mysql
配置cluster.conf
本机(hostname -i出来的ip)
192.168.31.138:3333
192.168.31.138:4444
192.168.31.138:5555
出问题:
单机开启集群,通过不同端口号,开启3333、4444、5555,但只会开启一个,其他但启动失败(JVM存储不够???)
(修改前先备份)修改bin/startup.sh,将JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
根据自己的实际情况调
解决:
拷贝nacos为nacos1、nacos2、nacos3 分别修改application.properties中的端口 为 3333、4444、5555
修改nacos1、nacos2、nacos3 中的startup.sh中 JAVA_OPT的 -Xms1g -Xmx2g -Xmn512m (由于查看进程内存占用情况,进行适当减少)
修改startup.sh
sh startup.sh -p xxxx
nginx.conf
Sentinel
8858 设置的dashboad、 8401 sentinel 服务访问端口
docker 部署 sentinel
=======8401服务端=======
sentinel.transport.port: 8858(sentinel服务器的端口) server.port:8401(sentinel服务的端口) nacos
懒加载:服务注册进sentinel后,需要在页面发几个请求,sentinel才会开始监控
或者
添加流控规则:单机阈值1
当请求一秒钟内超过阈值,就会返回限制信息
流控效果
直接->快速失败
----系统默认的
资源名 : @getMapping中的请求路径
针对来源:default 默认
关联
使用postman建立 请求conllection组 设置/testB 20次,每次0.3s
预热
说明公式:阙值除以coldFactor(默认值为3),经过预热时长后才会达到阙值
阈值10,初始值:10/3 ,过5秒 ,到达阈值10 (即最初,每秒3次请求就会被限流,5秒内,阈值慢慢增到10)
排队等待
只允许QPS
降级服务
慢调用(秒级)
在熔断时常内,请求数大于最小请求+大于最大RT到请求占比大于比例阈值,会发生熔断,熔断时常过后,进入待恢复状态,之后的请求如果大于RT,会再次熔断,小于恢复
异常比例(秒级)
一秒内请求大于5次,异常率高于20%,降级
异常数(分钟级)
时间窗口大于60秒
在一分钟内,异常数大于10,最小请求数大于5,熔断降级
热点限流规则(限流,需要自定义兜底方法) 用SentinelResource 设置资源名、兜底方法
如需热点限流,在请求方法中添加不必要的参数 p1、p2用来进行设定规则,并设置兜底方法
当方法第一个参数p1在1秒内请求超过一次,限流,待用自定义返回当兜底方法
参数例外项(前提是参数必须为基本类型或String)
系统自适应规则
@SentinelResource
(参数可用为作限流规则资源名,blockHandler为兜底方法)
按资源名限流(sentinelResource中的名称) ---------- byResource
按url路径限流(GetMapping中的名称) ---------- /byResource
此时流控规则存在问题:不持久化
问题:
全局自定义兜底方法:
服务熔断
http://localhost:84/consumer/fallback/5 是 调 局部兜底
sentinel整合openFeign
此时访问 http://localhost:84/consumer/paymentSQL/5,
当访问中,服务端宕机,再去访问,就会调用全局兜底
熔断框架的比较
sentinel规则持久化 (规则存入nacos)
sentinel服务端
添加规则json文件到nacos配置中心,实现持久化
[
{
"resource": "/rateLimit/byUrl",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
实现持久化
Seate处理分布式事物
修改regist.conf file.conf
启动nacos seata
seata 0.9.0 配置 (不支持集群)
idea 方配置 (1.0 后 配置 未写,整合file. registry,cpnf为yml)
file.conf、registry.conf除了要改 db nacos mySQL外 ,还要改sevice
======file.conf=====
服务间,通过openFeign调用
不加@GlobalTransactional,正常执行,
http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100没问题
当某个服务在调用过程中出现问题(方法延时发育openFeign的1秒),此时在此之前的服务会执行,之后的不会执行,造成事务的问题
====2001====
此时account端 方法超时。超时时间大于openFeign的1秒
此时,所有的数据库操作进行来,但修改订单状态没变,即钱扣了,订单请求失败
解决办法:主业务方法上加上@GlobalTransactional
补充
http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
每一个分支,执行前后都有一个快照
校验脏写,before image 还原业务数据
校验脏写:拿after image和当前数据库值 对比,一样则没有脏写 ,可以进行回退;脏数据需要人工处理
seats 的 branch表
order 的 undo_log表
rollback_info中存着 前置后置的 sql信息
出现事务错误,进行反向补偿---------------根据前置 sql操作 生成 反向sql
seats 的 global 表
seats 的 lock 表
http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100