Spring Cloud Gateway 中的 Hystrix 命令
Posted
技术标签:
【中文标题】Spring Cloud Gateway 中的 Hystrix 命令【英文标题】:Hystrix Command in Spring Cloud Gateway 【发布时间】:2019-01-21 21:35:58 【问题描述】:我正在使用 Spring cloud starter gateway 2.0.1.RELEASE 和 Starter netflix hystrix。是否可以像下面这样在路由定义中提供 HystrixCommand?
builder.routes()
.route( r -> r.path("path")
.and().method(HttpMethod.GET)
.filters(f -> f.hystrix("myHystrixCommandName"))
.uri("/destination")
.id("route_1"));
我的目标是在不将请求转发到后备 uri 的情况下执行后备方法。 此外,我不能使用静态后备 uri 选项,因为我需要路径参数和请求参数来确定后备响应。非常感谢任何帮助!。
【问题讨论】:
目前还没有构建。为什么不能回退到 uri?在此示例中github.com/spring-cloud-samples/spring-cloud-gateway-sample/… 后备 uri 仅是“forward:/hystrixfallback”。这允许您使用本地 webflux 端点,您可以在其中访问请求参数、标头等...使用自定义命令您无法访问这些内容。 感谢@spencergibb 的回复。我无法弄清楚如何访问实际的 URI,因为我有一个作为路径参数的 id。我的路线看起来像 /api/appid/users/userid 并且我需要能够在转发 URI 中访问 appId 和 userId。我遇到的所有示例都是静态 URI。 把ServerHttpRequest
作为参数。这是一个普通的 spring webflux 应用程序。
【参考方案1】:
我遇到了同样的问题。我就是这样解决的:
首先,这些是路线:
builder.routes()
.route( r -> r.path("/api/appid/users/userid")
.and().method(HttpMethod.GET)
.filters(f -> f.hystrix("myHystrixCommandName")
.setFallbackUri("forward:/hystrixfallback"))
.uri("/destination")
.id("route_1"));
path 谓词处理 url 并提取路径变量,这些变量保存到 ServerWebExchange.getAttributes()
中,键定义为 PathRoutePredicate.URL_PREDICATE_VARS_ATTR
或 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE
你可以找到更多关于路径谓词here的信息
第二,我创建了一个@RestController
来处理来自Hystrix的转发注入ServerWebExchange
:
@RestController
@RequestMapping("/hystrixfallback")
public class ServiceFallBack
@RequestMapping(method = RequestMethod.GET)
public String get(ServerWebExchange serverWebExchange)
//Get the PathMatchInfo
PathPattern.PathMatchInfo pathMatchInfo = serverWebExchange.getAttribute(ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
//Get the template variables
Map<String, String> urlTemplateVariables = pathMatchInfo.getUriVariables();
//TODO Logic using path variables
return "result";
【讨论】:
以上是关于Spring Cloud Gateway 中的 Hystrix 命令的主要内容,如果未能解决你的问题,请参考以下文章
spring cloud gateway 报错 Unable to find GatewayFilterFactory with name
Spring Cloud Alibaba - 27 Gateway源码解析
如何在提交之前修改 Spring Cloud Gateway 中的响应正文
如何从 Spring Cloud Gateway 的 GlobalFilter 中的 SecurityContext 获取 BearerTokenAuthentication