Sentinel结合gateway服务发现时,router使用lb:server 动态根据服务路由时,熔断器不生效,配置只能指定固定的资源,没有办法动态根据服务名称生成熔断器,请问要怎么做?
Sentinel结合Gateway服务发现时,可以通过自定义路由规则来实现动态熔断器。具体操作如下:
application.yml
或application.properties
中配置Sentinel的相关信息,例如:spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel控制台地址
port: 8719 # Sentinel客户端与控制台通信端口
GatewayFilterFactory
,用于生成熔断器规则。例如:import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
public class SentinelGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
private final SentinelGatewayBlockExceptionHandler exceptionHandler;
public SentinelGatewayFilterFactory(SentinelGatewayBlockExceptionHandler exceptionHandler) {
super(Object.class);
this.exceptionHandler = exceptionHandler;
}
@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) -> {
String serviceName = exchange.getRequest().getURI().getHost();
if (SphU.isClusterMode()) {
// 集群模式
try (Entry entry = SphU.entry(serviceName)) {
if (!entry.tryAcquire()) {
return exceptionHandler.handle(exchange, null);
}
return chain.filter(exchange).then(a -> {
entry.exit();
return Mono.empty();
});
}
} else {
// 单实例模式
try (Entry entry = SphU.entry(serviceName)) {
if (!entry.tryAcquire()) {
return exceptionHandler.handle(exchange, null);
}
return chain.filter(exchange).then(a -> {
entry.exit();
return Mono.empty();
});
}
}
};
}
}
application.yml
或application.properties
中配置自定义的GatewayFilterFactory
:spring:
cloud:
gateway:
routes:
- id: my_route
uri: lb://my-service
filters:
- name: SentinelGatewayFilterFactory
args:
name: my-service
predicates:
- Path=/my-service/**
这样,当请求匹配到my_route
时,会根据服务名称my-service
动态生成熔断器规则。
Sentinel目前对于基于服务名动态创建资源并实现熔断器功能,可以配合Spring Cloud Gateway的插件来实现。在配置中通常需要通过BlockHandler
和fallback
机制,并结合服务名动态生成规则,确保熔断器能随服务实例变化而生效。请参阅Sentinel官方文档关于微服务治理部分的内容。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。