目录
分布式流量防护_SentinelResource配置详解之fallback和 blockHandler都配置
分布式流量防护_实时监控数据
分布式流量防护_Sentinel为什么需要持久化
分布式流量防护_Sentinel组件二次开发
分布式事物处理_认识本地事物
数据库事务的四大特性ACID
/**
* 根据id查询支付信息
* 测试fallback
* @param id
* @return
*/
@SentinelResource(value = "orderfindById",
// fallback = "testFallBack",fallbackClass = PaymentServiceFallback.class)
fallback = "testFallBack",fallbackClass = PaymentServiceFallback.class,
blockHandler = "testBlockHeader",blockHandlerClass =PaymentServiceFallback.class)
@GetMapping("findById")
public String test(String id){
if (id.equals("1")){
throw new RuntimeException("制造接口异常.");
}
return iPaymentFeginService.findById(id);
}
总结
1、fallback是针对方法出现异常了,则会进入fallback方法。
2、blockhandler是针对流控设置,超出规则,则会进入blockhandler方法。
3、blockHandler 和 fallback 都进行了配置,则被限流降级而抛出BlockException时只会进入 blockHandler 处理逻辑。
4、若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出。
实时效果反馈
1.下列描述SentinelResource注解fallback和blockHandler都配 置正确的是。
A 全部进入fallback
B 全部进入blockHandler
C 限流降级进入blockHandler,接口异常进入fallback
D 以上都是正确
Sentinel 提供对所有资源的实时监控。如果需要实时监控,客户端需引入以下依赖(以 Maven 为例):
com.alibaba.csp
sentinel-transport-netty-http
1.8.3
注意: 引入上述依赖后,客户端便会主动连接 Sentinel 控制台。通过 Sentinel 控制台即可查看客户端的实时监控。
设定启动参数
只使用基本的流控功能的话,是不用额外指定启动参数的。但如果要接入Dashboard进行实时监控,则需要在应用启动时加入JVM参 数指定控制台地址和端口。
内容如下
-
Dcsp.sentinel.dashboard.server=192.168.66.101:8858
其他相关参数有:
界面展示
应用的监控指标数据已经保存到Dashboard了,这个时候,我们在控制台界面来查看监控数据:
为什么需要持久化
Sentinel的所有规则都是内存存储,重启后所有规则都会丢失。在 生产环境下,我们必须确保这些规则的持久化,避免丢失。
项目启动成功日志打印
Sentinel支持三种规则管理模式
原始模式
Sentinel的默认模式,将规则保存在内存,重启服务会丢失。
pull模式
控制台将配置的规则推送到Sentinel客户端,而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中 查询,更新本地规则。
push模式
控制台将配置规则推送到远程配置中心,例如Nacos。Sentinel客户端监听Nacos,获取配置变更的推送消息,完成本地配置更新。
实时效果反馈
1.Sentienl为什么需要配置持久化_____。
A 解决单点故障问题
B 解决数据安全问题
C 解决重启后所有规则都会丢失
D 以上都错误
2. Sentienl规则管理模式哪种是将配置规则推送到远程配置中心 ____。
A pull模式
B push模式
C 原始模式
D 以上都是错误
在开始二次开发之前,我们需要将Sentinel 的代码下载到本地。你可以从GitHub 的Releases页面中找到1.8.3版本,在该版本下的 Assets面板中下载 Source code源文件。
下载地址https://github.c om/alibaba/Sentinel/releases
改造过程三个步骤
1 修改 Nacos 依赖项的应用范围,将其打入jar 包中;
2 后端程序对接 Nacos,将 Sentinel 限流规则同步到 Nacos;
3 开放单独的前端限流规则配置页面。
修改Nacos依赖项
首先,你需要打开 sentinel-dashboard 项⽬的 pom.xml 文件,找到其中的依赖项 sentinel-datasource-nacos,它是连接 Nacos Config 所依赖的必要组件。
com.alibaba.csp
sentinel-datasourcenacos
后端程序对接Nacos
首先,你需要打开 sentinel-dashboard 项目下的 src/test/java目 录。定位到com.alibaba.csp.sentinel.dashboard.rule.nacos目录下。
解释:
NacosConfig:初始化 Nacos Config 的连接;
NacosConfigUtil:约定了 Nacos 配置⽂件所属的 Group 和⽂件命名后缀等常量字段;
FlowRuleNacosProvider:从 Nacos Config 上获取限流规则;
FlowRuleNacosPublisher:将限流规则发布到 Nacos Config。
为了让这些类在 Sentinel 运行期可以发挥作用,你需要在 src/main/java 下创建同样的包路径,然后将这四个文件从 test 路 径拷贝到 main 路径下。
实现Nacos数据同步
@Bean
public ConfigService nacosConfigService() throws Exception {
Properties properties = new Properties();
// Nacos服务地址
properties.setProperty("serverAddr","192.168.66.101:8848");
// NameSpace id
properties.setProperty("namespace","a26e7bb2-04df-4574-8313-3d8728ae88ba");
return ConfigFactory.createConfigService(properties);
}
FlowControllerV2接入Nacos
解释:
在代码中,我通过Qualifer标签将FlowRuleNacosProvider注入 到了ruleProvier变量中,又采用同样的方式将 FlowRuleNacosPublisher注入到了rulePublisher变量中。 FlowRuleNacosProvider和 FlowRuleNacosPublisher就是上一 步我们刚从 test目录 Copy到main目录下的两个类。
查看FlowRuleNacosPublisher源码
@Override
public List getRules(String appName) throws Exception {
// 发布到Nacos上的配置文件名
// app + NacosConfigUtil.FLOW_DATA_ID_POSTFIX +NacosConfigUtil.GROUP_ID
String rules = configService.getConfig(appName +NacosConfigUtil.FLOW_DATA_ID_POSTFIX,
NacosConfigUtil.GROUP_ID, 3000);
if (StringUtil.isEmpty(rules)) {
return new ArrayList<>();
}
return converter.convert(rules);
}
解析: 我们就完成了对后端程序的改造,将 Sentinel 限流规则同步到 了 Nacos。接下来我 们需要对前端页面稍加修改,开放⼀个独立的页面,用来维护那些被同步到 Nacos 上的限流规则。
前端页面改造
首先,我们打开 sentinel-dashboard 模块下的 webapp 目录,该 目录存放了 Sentinel 控制台的前端页面资源。我们需要改造的文件是 sidebar.html,这个 html文件定义了控制台的左侧导航栏。
新增内容
流控规则
微服务改造
微服务端的改造非常常简单,我们不需要对代码做任何改动,只需要添加⼀个新的依赖项,并在配置文件中添加 sentinel datasource 连接信息就可以了。
com.alibaba.csp
sentinel-datasource-nacos
我们在 application.yml 配置文件中找到 spring.cloud.sentinel 节点,在这个节点下添加⼀段Nacos 数据源的配置。
datasource:
# 数据源key 可以自由命名
geekbang-flow:
# 指定当前数据源是Nacos
nacos:
# 设置Nacos的连接地址,命名空间和GroupID
server-addr: 192.168.66.101:8848
# Nacos 命名空间
namespace: a26e7bb2-04df-4574-8313-3d8728ae88ba
groupId: SENTINEL_GROUP
# 设置Nacos中配置⽂件的命名规则
dataId: ${spring.application.name}-flow-rules
# 必填的重要字段,指定当前规则类型是"限流"
rule-type: flow
重点强调
1、我们在微服务端的 sentinal 数据源中配置的 namespace 和 groupID,⼀定要和 Sentinal Dashoboard 二次改造中的中的配置相同,否则将无法正常同步限流规则。
2、dataId 的文件命名规则,需要和 Sentinel 二次改造中的FlowRuleNacosPublisher 类保持⼀致。
验证限流规则同步效果
启动Sentinel-dashboard子项目,找主启动类启动Sentinel控制台。
请求http://localhost:8080,你可以登录 Sentinel Dashboard 服务。这时你会看到左侧的导航栏多了⼀个“流控规则”的选项。 你可以点击这个选项,并手动在当前页面右上方点击“新增流控 规 则”,为 requestCoupon 添加⼀条“QPS=1 快速失败”的流控规则。
最后,打开 Nacos Config 的配置列表页,你就可以看到⼀个 cloud-sentinel-payment- flow-rules 的配置文件被创建了出来。
什么是事物
事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组 成,同一个事务的操作具备同步的特点,事务中的语句要么都执行,要么都不执行。
举个栗子: 你去小卖铺买东西,一手交钱,一手交货就是一个事务的例 子,交钱和交货必须全部成功,事务才算成功,任一个活动失败,事务将撤销所有已成功的活动。
什么是本地事物
在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务 器,所以基于关系型数据库的事务又被称为本地事务。
解释:
Business∶我们具体的业务代码
Storage∶ 库存业务代码;扣库存
Order∶订单业务代码;保存订单
Account∶账号业务代码;减账户余额
总结
数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个 不可分割的执行单元,该执行单元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚。
实时效果反馈
1.基于关系型数据库的事务又被称为_____。
A 分布式事物
B 本地事务
C 关系型事物
D 以上都错误
2. 下列不属于数据库事务特性的是____。
A 一致性
B 隔离性
C 原子性
D 安全性