【问题标题】:This is about zuul and routing这是关于zuul和路由的
【发布时间】:2022-01-09 03:00:04
【问题描述】:

这个问题是关于zuul和路由的。现在在您的 application.yml 中获取 zuul 路由非常容易,您有以下内容

routes:
    silver:
      path: "/silver/**"
      serviceId: "SILVER-MICO-SERVICE"
      stripPrefix: true
    gold:
      path: "/gold/**"
      serviceId: "GOLD-MICO-SERVICE"
      stripPrefix: false

因此,如果您的 URL 中包含银牌,它将定向到银牌微服务,如果它包含金牌,则将定向到金牌微服务。

但我有第 3 项服务,我想在将服务定向到白银或黄金之前先调用它。所以我想要类似的东西

routes:
    silver:
      path: "/silver/**"
      serviceId: "SILVER-MICO-SERVICE"
      stripPrefix: true
    gold:
      path: "/gold/**"
      serviceId: "GOLD-MICO-SERVICE"
      stripPrefix: false
   throttle
     path: "/throttle/**"
      serviceId: "THROTTLE-MICO-SERVICE"
      stripPrefix: false

当说银被称为

我将在我的过滤器中包含以下内容,我将有一个throttleFilter 它将调用油门微服务。 但我不知道如何用 Java 编写 zuul 调用。

感谢您的帮助

【问题讨论】:

    标签: java netflix-zuul


    【解决方案1】:

    您不需要路由来限制微服务,因为您只能路由到一个微服务。相反,您可以编写一个预过滤器并调用油门微服务。 这是一个如何编写前置过滤器的示例

    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    
    import javax.servlet.http.HttpServletRequest;
    
    public class SimplePreFilter extends ZuulFilter {
    
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            return 1;
        }
    
        @Override
        public boolean shouldFilter() {
            //You can apply custom logic if required
            return true;
        }
    
        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            //TODO you can call throttle micro service here
            return null;
        }
    

    }

    【讨论】:

    • 谢谢,不过我想通过eureka服务器调用。我的意思是添加尤里卡,但你不能编辑这个。所以它的zuul eureka和3个服务。所以我同意我需要通过预过滤器调用,但是有没有办法可以只提供服务 ID。或者我需要使用 webclient 或 resttemplate 构建 URL 并以这种方式调用它。问题是所有服务都是通过 eureka 访问的,我想通过 eureka 访问限制。
    • 它肯定会与 webclient 或 resttemplate 一起使用,但我不确定 eureka
    • 谢谢,我担心会是这样。 Eureka 发现服务已启动并正在运行,但我无法使用它,除非路径包含限制,它不会,它将是银或金。
    【解决方案2】:

    好的,这是我想做的代码。我需要的功能是由 EurekaClient 提供的

    zuul 
        throttling:
          path: "/throttling/**"
          serviceId: "SITE-THROTTLING"
          stripPrefix: false
    

    在我的代码中

    @Autowired
    private EurekaClient eurekaClient;
    
    private boolean checkThrottling(String url) {
            
            InstanceInfo service = eurekaClient
                      .getApplication("SITE-THROTTLING")
                      .getInstances()
                      .get(0);
            StringBuilder sb = new StringBuilder(service.getHomePageUrl())
                    .append("/throttling")
                    .append("?paramUrl=")
                    .append(url);
            return webSevice.sendPost(sb.toString());
    
    public boolean sendPost(String url) {
            WebClient webClient = WebClient.create();
            Boolean flag = webClient.get()
                                           .uri(url)
                                           .retrieve()
                                           .bodyToMono(Boolean.class)
                                           .block();
            return flag;
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2019-03-16
      • 2017-02-09
      • 2017-06-12
      • 2019-07-18
      • 2017-12-02
      相关资源
      最近更新 更多