来自根路径的 Zuul 路由
Zuul route from root path
我用 Eureka 发现了一些微服务。他们中的大多数提供了一些API。
我有 "edge" 名为 "Gateway service" 的服务,它实际上是 Zuul Proxy。
问题是有一个网络应用程序。它由网关服务托管了很长时间,没有任何问题。
但是现在我需要在网关后面的单独服务上托管这个客户端。
这不是问题。我创建了新服务并将 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/
访问它,这是完全不正确的。
我的任务是:
- 使托管在其他服务上的 Web 应用程序可从根路径访问。
- 为所有其他服务保留
/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
前缀的端点仍然保留在网关服务上。可能有人知道如何改进它吗?
我会做以下事情:
- 删除
zuul.prefix
属性。
- 添加'api
to all of your
zuul.routes.*.path`属性的前缀。
- 添加具有以下属性的最终路由(到列表末尾):
app:
path: /**
stripPrefix: false
(3) 非常重要,因为这里的路线顺序很重要。这是传入请求将评估路由是否匹配的顺序。在 yaml 中执行此操作也很重要,因为顺序将被保留,而属性文件中可能没有(根据 documentation)。
我用 Eureka 发现了一些微服务。他们中的大多数提供了一些API。 我有 "edge" 名为 "Gateway service" 的服务,它实际上是 Zuul Proxy。 问题是有一个网络应用程序。它由网关服务托管了很长时间,没有任何问题。 但是现在我需要在网关后面的单独服务上托管这个客户端。 这不是问题。我创建了新服务并将 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/
访问它,这是完全不正确的。
我的任务是:
- 使托管在其他服务上的 Web 应用程序可从根路径访问。
- 为所有其他服务保留
/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
前缀的端点仍然保留在网关服务上。可能有人知道如何改进它吗?
我会做以下事情:
- 删除
zuul.prefix
属性。 - 添加'api
to all of your
zuul.routes.*.path`属性的前缀。 - 添加具有以下属性的最终路由(到列表末尾):
app:
path: /**
stripPrefix: false
(3) 非常重要,因为这里的路线顺序很重要。这是传入请求将评估路由是否匹配的顺序。在 yaml 中执行此操作也很重要,因为顺序将被保留,而属性文件中可能没有(根据 documentation)。