如何根据HTTP方法进行Zuul动态路由并通过“serviceId”解析目标主机?

2024-06-25

如何基于Zuul进行动态路由HTTP方式(获取/发布/放置...)? 例如,当您需要路由POST请求给不同的主机而不是'中描述的默认值zuul.routes.*'...

zuul:
  routes:
    first-service:
      path: /first/**
      serviceId: first-service
      stripPrefix: false

    second-service:
      path: /second/**
      serviceId: second-service
      stripPrefix: false

IE。当我们要求'获取/首先' 然后 Zuul 将请求路由到 '优先服务',但如果我们要求'发布/首先' 然后 Zuul 将请求路由到 '二次服务'.


要实现基于 HTTP 方法的动态路由,我们可以创建一个自定义的 'route https://spring.io/guides/gs/routing-and-filtering/#_add_a_filter' type ZuulFilter并通过以下方式解析“serviceId”DiscoveryClient。例如:

@Component
public class PostFilter extends ZuulFilter {

    private static final String REQUEST_PATH = "/first";
    private static final String TARGET_SERVICE = "second-service";
    private static final String HTTP_METHOD = "POST";

    private final DiscoveryClient discoveryClient;

    public PostOrdersFilter(DiscoveryClient discoveryClient) {
        this.discoveryClient = discoveryClient;
    }

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

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

    @Override
    public boolean shouldFilter() {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String method = request.getMethod();
        String requestURI = request.getRequestURI();
        return HTTP_METHOD.equalsIgnoreCase(method) && requestURI.startsWith(REQUEST_PATH);
    }

    @Override
    public Object run() {

        RequestContext context = RequestContext.getCurrentContext();
        List<ServiceInstance> instances = discoveryClient.getInstances(TARGET_SERVICE);
        try {
            if (instances != null && instances.size() > 0) {
                context.setRouteHost(instances.get(0).getUri().toURL());
            } else {
                throw new IllegalStateException("Target service instance not found!");
            }
        } catch (Exception e) {
            throw new IllegalArgumentException("Couldn't get service URL!", e);
        }
        return null;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据HTTP方法进行Zuul动态路由并通过“serviceId”解析目标主机? 的相关文章

随机推荐

  • 从该函数内部确定函数名称(不使用回溯)

    在Python中 不使用traceback模块 有没有办法从该函数内确定该函数的名称 假设我有一个模块foo有一个函数bar 执行时foo bar 有没有办法bar知道bar的名字 或者更好的是 foo bar s name foo py
  • 使用 rxjs 来限制回调

    我正在使用一个 API 在其中注册一个经常发生的回调 function myCallback event do things with event something computationally intensive const some
  • 在 google chrome 上选择网络摄像头

    当您有多个网络摄像头时 您可以在 chrome 上选择网络摄像头 设置 gt 内容 gt 媒体 但是 我想从脚本中选择相机 如何通过 Html5 或 javascript 选择相机 Check 这是巨大的代码 所以我没有将其粘贴到这里 这是
  • 在 JQGrid 中创建链接

    我需要在 JQgrid 中创建一个列的所有单元格 一个链接 该链接使用单元格值调用 javascript 函数 以传递给服务器端的某些查询 我见过jqGrid 中的 html 链接列 https stackoverflow com ques
  • C# Console.Writeline 和 .Write 差异

    我刚刚开始学习 C 有人向我指出 Microsoft 自己的开发网站提供绝对的初学者教程 以便我可以开始学习正确的语法 然而 在第一个教程挑战中 他们希望你打印控制台 This is the first line This is the s
  • 非常简单的自定义标签库功能不起作用

    我正在绞尽脑汁为什么我的自定义 taglib 函数不起作用 该示例正在使用Math cos and Math sin 这是课程 package foo tags public class Math public java lang Doub
  • 范围输入拇指随着时间的推移而偏移

    我查遍了 Stackoverflow 似乎所有带有拇指标签的范围滑块都有这个问题 例如 这个答案 https stackoverflow com a 35419875几乎没有 但仍然有 基本上你可以计算value max得到left范围值标
  • 自定义标记在某些设备上不显示(Google 地图 Android SDK)

    我在 Android 应用程序上使用自定义标记运行 Google Maps SDK 在我们的测试手机 S3 S5 和 DROID 上一切正常 但是 当我在 Nexus 5 硬件上运行该应用程序时 一种类型的自定义标记不再显示在地图上 虽然标
  • Microsoft Visual Studio 10.0\VC\include\io.h 提供了什么?

    我安装了 Visual Studio 2010 它给了我 C 编译器 C Program Files x86 Microsoft Visual Studio 10 0 VC vcvarsall bat 然而 当我尝试构建一个应用程序 一个P
  • AVR C++ uint32_t 奇怪的行为

    uint32 t a 65536 uint32 t b 1 lt lt 16 Why is a b在这里 但是 uint32 t a 65536 uint32 t b 65536 here a b尽管技术上应该是相同的 我使用 CLion
  • Play 框架使用复选框提交布尔值?

    使用 Play 2 3 x 我试图了解如何在表单中处理复选框 这个问题 https stackoverflow com questions 9499279 play framework checkbox processing对于旧版本的 P
  • 从 GCM/FCM 的生产证书添加 SHA-1

    我有一个使用 FCM 的应用程序 我已将程序包添加到 FCM 它显示 调试签名证书 SHA 1 可选 因此一切按预期工作 现在我正在准备发布 想知道我是否需要将此 SHA 1 证书更改为发布证书中的值 或者它不是必需的 并且在发布时我应该保
  • 未调用NotificationServiceExtension

    iOS 10发布后 我使用NotificationServiceExtension用于图像通知 效果很好 但最近我发现有些不对劲 UNNotificationServiceExtension 中的代码不再调用 我不确定原因 所以我创建了一个
  • JavaFx 无法正确渲染

    我的代码由两个类组成 一是 MainGUI java 二是 Screen java 我打算为不同的屏幕创建不同的类并在需要时渲染它们 这是我当前的代码MainGUI java import javafx application Applic
  • RSpec:重新打开类时存根 Rails.application.config 值不起作用?

    我在应用程序配置中定义了一个选项 我想要测试的类是在 gem 中定义的 不是我编写的 我想重新开课 Myclass class eval do if Rails application config myoption value1 some
  • 如何在reactjs中动态加载组件?

    我正在开发一个 Reactjs React motion 项目 在 模态窗口 比方说 中 我想动态安装或加载组件 如果可能的话 到目前为止我的解决方案 我找不到一种方法 所以看起来更容易将组件放置到位并隐藏它 然后在状态更改时切换类或样式
  • 如何将参数传递给 Flash 投影仪 (Windows)?

    有什么方法可以将命令行参数传递到 Windows 中的 Flash 投影仪吗 我有另一个应用程序 在本例中为安装程序 需要与 Flash 投影仪通信 与 flashvars 的工作方式相同 我无法在网上找到任何信息 一切似乎都集中在使用 F
  • Git 更新文件时更改默认 umask

    我的 Git 有问题 我在 Google 和 StackOverflow 中搜索了解决方案 但没有任何帮助 问题是 每次 git 更新工作目录中的某些文件时 当我签出分支或合并分支等时 文件权限都会更改 以便添加 可写到组 标志 如果该文件
  • SQL Case 语句会失败吗?

    有没有办法让 SQL 中的 CASE 语句像 C 中的 case 语句一样失败 我不想做的是下面的例子 但如果这是我唯一的选择 我想我会选择它 EXAMPLE NewValue CASE WHEN MyValue 1 THEN CAST M
  • 如何根据HTTP方法进行Zuul动态路由并通过“serviceId”解析目标主机?

    如何基于Zuul进行动态路由HTTP方式 获取 发布 放置 例如 当您需要路由POST请求给不同的主机而不是 中描述的默认值zuul routes zuul routes first service path first serviceId