gpt4 book ai didi

java - 来自根路径的 Zuul 路由

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:45 27 4
gpt4 key购买 nike

我用 Eureka 发现了一些微服务。他们中的大多数都提供了一些 API。我有称为“网关服务”的“边缘”服务,实际上是 Zuul 代理。问题是有一个网络应用程序。它由网关服务托管了很长时间,没有任何问题。但是现在我需要在网关后面的单独服务上托管这个客户端。这不是问题。我创建了新服务并将 Web 应用程序放在那里。但问题是网关服务上的 Zuul 有下一个配置

zuul:
ignoredServices: '*'
prefix: /api
sensitiveHeaders: Cookie, Set-Cookie
routes:
config-service:
path: /conf/**
serviceId: config-service
security-service:
path: /security/**
serviceId: security-service
stripPrefix: false
request-service:
path: /requests/**
stripPrefix: false

我需要这样做,以便用户能够从这样的根路径访问 Web 应用程序 http://app.com/。但是现在我只能通过 http://app.com/api/ 访问它,这是完全不正确的。

我的任务是:

  1. 使托管在其他服务上的网络应用程序可从根路径访问。
  2. 为所有其他服务保留 /api 前缀也非常重要。

我试图实现 ZuulFilter。但看起来它对根路径没有任何作用,并且仅在与上述任何路由匹配时才运行。

我怎样才能让它工作?

更新:我在 ZuulFilter 方面取得了一些成功。我成功了。这是 Zuul 的配置:

zuul:
ignoredServices: '*'
sensitiveHeaders: Cookie, Set-Cookie
routes:
api: /api/**
config-service:
path: /conf/**
serviceId: config-service
security-service:
path: /security/**
serviceId: security-service
stripPrefix: false
request-service:
path: /requests/**
stripPrefix: false
frontend-host-service:
path: /**

ZuulFilter本身

@Bean
public ZuulFilter apiPrefixStrip(RouteLocator routeLocator) {
return new ZuulFilter() {

@Override
public String filterType() {
return "pre";
}

@Override
public int filterOrder() {
return 0;
}

@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
return context.getRequest().getRequestURI().startsWith("/api");
}

@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
String path = context.getRequest().getRequestURI();
Route route = routeLocator.getMatchingRoute(path.substring(4));
if (route != null) {
context.put("proxy",route.getId());
context.put("requestURI", route.getPath());
context.set("serviceId", route.getLocation());
}
return null;
}
};
}

这是如何工作的:有一个属性 zuul.routes.api=/api/** 实际上没有做任何事情。它只允许将所有匹配的路径映射到 Zuul 过滤器链(described in documentation)。此处描述的所有其他路由都设置为根本没有 /api 。它允许访问这样的服务:http://app.com/requests 例如请求服务。ZuulFilter 对属性中描述的每个请求执行检查,但它仅在请求的 URI 以 /api 开头时运行,并且它以相同的方式重定向此请求,就像没有任何 /api 在路径中。

它确实有效。但我仍然不喜欢这个解决方案,因为没有 /api 前缀的端点仍然保留在网关服务上。可能有人知道如何改进它吗?

最佳答案

我会做以下事情:

  1. 删除 zuul.prefix 属性。
  2. 将 'api 的前缀添加到您的所有 zuul.routes.*.path` 属性中。
  3. 添加具有以下属性的最终路由(到列表末尾):

app:
path: /**
stripPrefix: false

(3) 非常重要,因为这里的路由顺序很重要。这是传入请求将评估路由是否匹配的顺序。在 yaml 中执行此操作也很重要,因为顺序将被保留,而属性文件可能不包含顺序(根据 documentation )。

关于java - 来自根路径的 Zuul 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875458/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com