我很少有Spring Boot微服务,它们通过云环境部署到JBoss。这些引导服务是Eureka客户端,它们将自己注册到Eureka服务器。以下是一个例子:
eureka:
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: ${DISCOVERY_URL:http://localhost:8761}/eureka/
instance:
ip-address: 127.0.0.1
appname: user-regn-service-app
home-page-url-path: /user-regn-service-app
它使用名为user-regn-service-app的Eureka注册应用程序 Eureka Homepage
wildfly服务器运行在8080,user-regn-service-app部署在上下文路径/ user-regn-service-app中。 所以其余的api如下
localhost:8080/user-regn-service-app/regnUser
当我使用zuul作为api网关时,配置如下
zuul:
prefix: /api
routes:
test:
path: /test/**
service-id: USER-REGN-SERVICE-APP
strip-prefix: true
ribbon:
eureka:
enabled: true
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
registerWithEureka: false
但是每当我打电话给zuul api网关时,它都无法识别上下文路径并重定向到localhost:8080而不是localhost:8080 / user-regn-service-app。
http://localhost:8765/api/
- >找不到404
http://localhost:8765/api/user-regn-service-app/
- > Wildfly默认主页
http://localhost:8765/api/user-regn-service-app/user-regn-service-app/regnUser
- >重定向到用户注册。
预期行为:http://localhost:8765/api/test/regnUser
应重定向到用户注册。
我已经尝试过从Zuul和Eureka之间的博客中获得的所有组合,以完成以下操作,但没有运气。请告知我是否遗漏了某些东西。
我尝试过如下使用自定义zuul自定义过滤器,但它没有转发到必需的上下文路径。代码如下
@Component
public class ZuulApiFilter extends ZuulFilter{
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
System.out.println("original"+ ctx.get("requestURI"));
HttpServletRequest request = ctx.getRequest();
String requestURI = request.getRequestURI();
String contextAwareURI=requestURI.concat("user-regn-service-app/");
ctx.set("requestURI", contextAwareURI);
return null;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public int filterOrder() {
return 1;
}
@Override
public String filterType() {
return "pre";
}
}
在设置新URI之后,requestURI也没有变化 ctx.set(" requestURI",contextAwareURI); request.getRequestURI();仅显示旧的Request URI。
答案 0 :(得分:0)
您可以删除ZuulApiFilter
并尝试设置:
strip-prefix: false
并尝试将请求发送至:
http://<zuul ip>:<zuul port>/api/test/....
编辑:
@Tanmay Ghosh
以下是我将用于与Zuul相关的博客文章(仍在草稿中)的示例代码,我将在接下来的几天内发布:
Zuul
&#39; application.yml
:
...
eureka:
client:
registerWithEureka: false
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8000/eureka/
# ribbon.eureka.enabled: false
zuul:
ignoredServices: "*"
routes:
zuulDemo1:
path: /zuul1/**
# serviceId as registed with Eureka. Enabled and used when ribbon.eureka.enabled is true.
serviceId: demo-zuul-api1
# zuul.routes.<the route>.url used when ribbon.eureka.enabled is false, serviceId is disabled.
# url: http://localhost:8600/
# stripPrefix set to true if context path is set to /
stripPrefix: true
...
实际上我的Zuul服务器回购是公开的,可在以下网址找到:https://bitbucket.org/asimio/zuulserver以及http://tech.asimio.net/2017/10/10/Routing-requests-and-dynamically-refreshing-routes-using-Spring-Cloud-Zuul-Server.html
上的最新博文另一件事,Zuul服务是否也使用除/之外的应用程序上下文?如果是,您可以尝试通过Zuul发送请求:http://<zuul host>:<zuul port>/<zuul app context>/api/test/....
吗?