面试题答案
一键面试整体思路
- Sentinel与Dubbo集成:利用Sentinel对Dubbo服务调用进行流量控制、熔断降级等,保障高并发下服务的稳定性。
- Seata与Dubbo集成:在Dubbo服务间的分布式事务场景中,Seata协调事务的各个分支,确保数据一致性。
- Sentinel与Seata集成:Sentinel对Seata事务相关的资源进行保护,防止因高并发导致事务处理异常。
关键实现要点
- Sentinel与Dubbo集成
- 引入依赖:在
pom.xml
文件中添加Sentinel与Dubbo的集成依赖,如spring-cloud-starter-alibaba-sentinel
和com.alibaba.csp:sentinel-apache-dubbo-adapter
。 - 配置Sentinel数据源:可以使用Nacos等配置中心作为Sentinel的规则数据源,动态配置流量控制、熔断降级规则。例如在
application.yml
中配置:
- 引入依赖:在
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: ${nacos.address}
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow
- **Dubbo过滤器配置**:在Dubbo配置中增加Sentinel的过滤器,如在`dubbo.xml`或`application.yml`中配置:
<dubbo:provider filter="sentinelDubboProviderFilter"/>
<dubbo:consumer filter="sentinelDubboConsumerFilter"/>
- Seata与Dubbo集成
- 引入依赖:在
pom.xml
文件中添加Seata与Dubbo的集成依赖,如io.seata:seata-spring-boot-starter
和io.seata:seata-all
以及Dubbo相关依赖。 - 配置Seata:在
application.yml
中配置Seata的事务组、事务日志存储等信息,例如:
- 引入依赖:在
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
my_test_tx_group: default
grouplist:
default: 127.0.0.1:8091
client:
rm:
async-commit-buffer-limit: 10000
lock:
retry-interval: 10
retry-times: 30
retry-policy-branch-rollback-on-conflict: true
tm:
commit-retry-count: 5
rollback-retry-count: 5
- **Dubbo事务拦截器**:自定义Dubbo的事务拦截器,在服务调用前后开启、提交或回滚Seata事务。例如创建一个实现`MethodInterceptor`接口的类:
public class SeataDubboInterceptor implements MethodInterceptor {
@Override
public Object invoke(Invocation invocation) throws Throwable {
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
try {
tx.begin();
Object result = invocation.proceed();
tx.commit();
return result;
} catch (Exception e) {
tx.rollback();
throw e;
}
}
}
然后在Dubbo配置中注册该拦截器。 3. Sentinel与Seata集成 - Sentinel保护Seata事务资源:将Seata事务相关的资源(如事务发起、事务分支等操作)纳入Sentinel的保护范围。可以通过自定义资源的方式,例如:
Entry entry = null;
try {
entry = SphU.entry("seata-tx-resource");
// Seata事务相关操作
} catch (BlockException e) {
// 处理限流、熔断等情况
} finally {
if (entry != null) {
entry.exit();
}
}
- **调整Sentinel规则适应Seata事务**:根据Seata事务处理的特点和性能要求,调整Sentinel的流量控制、熔断降级规则,避免因过度限制导致事务无法正常进行。例如适当放宽针对Seata事务资源的限流阈值。