当前位置: 首页 > 知识库问答 >
问题:

Zuul代理-如何根据请求路径将请求转发到服务

农存
2023-03-14
    null

例如,get http://user-application/api/users将返回JSON格式的用户。

用户应用程序也有一个HTTPendpoint,它应该将请求转发给其他应用程序--让我们将其中一个称为作业应用程序。

此endpoint为http{ANY_METHOD}/api/proxy/{dynamic-service}/{dynamic-path}。例如,get http://user-application/api/proxy/jobs-application/api/jobs

请注意,初始请求到达用户应用程序,然后它被转发到作业应用程序。

我把我思考的一些方法。也许你过去做过类似的事情,所以你可以分享你这样做的经验。甚至改进我的一种方法。

我将使用映射/proxy在用户应用程序中创建ProxyController

@Controller
@RequestMaping("/proxy/**")
ProxyController

public void proxy(final HttpServletRequest request, HttpResponse response) {
    final String requestUri = request.getRequestUri();
    if (!requestUri.startsWith("/api/proxy/")) {
        return null; // Do not proxy
    }

    final int proxyIndex = "/api/proxy/".lenght(); // Can be made a constant
    final String proxiedUrl = requestUri.subString(proxyIndex, requestUri.lenght());

    final Optional<String> payload = retrievePayload(request);
    final Headers headers = retrieveHeaders(request);

    final HttpRequest proxyRequest = buildProxyRequest(request, headers);
    payload.ifPresent(proxyRequest::setPayload);
    final HttpResponse proxyResponse = httpClient.execute(proxyRequest)
    pdateResponse(response, proxyResponse);
}
    null
@Component
public class ProxyFilter extends ZuulFilter {

    private static final String PROXY_PART = "/api/proxy";
    private static final int PART_LENGTH = PROXY_PART.length();

    @Autowired
    public ProxyFilter() {
    }

    @Override
    public boolean shouldFilter() {
        final RequestContext context = RequestContext.getCurrentContext();
        final String requestURI = retrieveRequestUri(context);
        return requestURI.startsWith(PROXY_PART);
    }

    @Override
    public Object run() {
        final RequestContext context = RequestContext.getCurrentContext();
        final String requestURI = retrieveRequestUri(context);
        final String forwardUri = requestURI.substring(PART_LENGTH);
        context.setRouteHost(buildUrl(forwardUri));

        return null;
    }

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

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

    private String retrieveRequestUri(final RequestContext context) {
        final HttpServletRequest request = context.getRequest();
        return request.getRequestURI();
    }

    private URL buildUrl(final String uri) {
        try {
            return new URL(uri);
        } catch (MalformedURLException e) {
            throw new RuntimeException(String.format("Failed to forward request uri %s}.", uri), e);
        }
    }
}

这段代码允许我以较少的精力转发请求。然而,我们也使用客户端负载平衡丝带和断路器Hystrix在Spring云Zuul开箱。如何启用这些功能?是否可以在context.setRouteHost(forwardUrl)中开箱即用启用它们;

共有1个答案

宋成天
2023-03-14

我想补充另一种做法,也许它也能奏效。

这种方法不需要动态Zuul过滤器。

application.yml

zuul:
  routes:
    user-application:
      path: /api/users/**
      serviceId: user-service
      stripPrefix: false
      sensitiveHeaders:

    #  I have to define all other services similarly.

    jobs-application:
      path: /api/proxy/jobs/**
      serviceId: jobs-application
      stripPrefix: true
      sensitiveHeaders:
 类似资料:
  • 我们当前的项目需求是将一些请求路由到第三方外部api服务器。为此,我们使用的是基于spring祖尔的路由器服务。 现在的要求是,对于某些endpoint,到外部api服务器的请求已经通过不属于我们的外部代理服务器路由, 如何通过卷曲完成此操作: 通过给定的代理重定向请求。如何通过spring-祖尔服务器做到这一点? 我有一条线索?https://github.com/spring-cloud/sp

  • 我使用的是spring boot微服务。我已经配置了eureka、zuul代理和另一个微服务(帐户)。如果我直接从账户上打电话,效果很好。帐户和zuul服务器都显示在eureka上。 当我尝试使用zuul代理命中它得到状态代码但没有得到任何结果 下面是我对zuul的配置 控制台日志到目前为止 路由匹配=ZuulRoute{id='account',path='/account/**',servic

  • 引导 servlet 服务请求的请求路径由许多重要部分组成。以下元素从请求URI路径得到,并通过请求对象公开: Context Path:与ServletContext相关联的路径前缀是这个Servlet 的一部分。如果这个上下文是基于Web服务器的URL命名空间基础上的“默认”上下文,那么这个路径将是一个空字符串。否则,如果上下文不是基于服务器的命名空间,那么这个路径以“/”字符开始,但不以“/

  • 我有一个小应用程序(HTML表单、servlet作为控制器和jsp文件),我试图弄清楚为什么我不能将请求从servlet转发到jsp文件。 问题是从html提交后,显示“HTTP状态404” null 谢谢! 项目层次结构:http://s23.postimg.org/kgt7r7lwb/capture.jpg main.html: 更新:问题可能出在Controller.java。当我尝试下面的

  • 我试图使用Postman而不是Web服务的API文档提供的终端命令来请求数据。 curl命令如下: 我怎么能在邮递员内申请这个?我尝试添加和作为请求参数,但这不起作用

  • 问题内容: 我有两个Web应用程序,分别是web1和web2。我想将请求从web1 / servlet1转发到web2 / servlet2。可能吗?请帮忙! 问题答案: 这是一个两步过程: 掌握代表 获得从对应 因此,从内部开始是这样的: 所有这些都有一个很大的警告- 容器可能未配置为允许跨上下文转发,因为这存在潜在的安全风险。如果是这种情况,将返回。