Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 获取从Zuul+;将请求转发到的服务器的主机名/IP:端口;丝带_Spring_Spring Boot_Spring Cloud_Netflix Zuul_Netflix Ribbon - Fatal编程技术网

Spring 获取从Zuul+;将请求转发到的服务器的主机名/IP:端口;丝带

Spring 获取从Zuul+;将请求转发到的服务器的主机名/IP:端口;丝带,spring,spring-boot,spring-cloud,netflix-zuul,netflix-ribbon,Spring,Spring Boot,Spring Cloud,Netflix Zuul,Netflix Ribbon,我使用Eureka进行服务发现,使用Zuul+ribbon作为反向代理和负载平衡器。 我在Eureka下注册了2个实例,如下所示: MYSERVICE n/a (2) (2) UP (2) - MYHOST:MyService:8888 , MYHOST:MyService:9999 以下是我的zuul配置: @EnableZuulProxy @EnableDiscoveryClient zuul: debug.request: true sensitiveHeaders:

我使用Eureka进行服务发现,使用Zuul+ribbon作为反向代理和负载平衡器。 我在Eureka下注册了2个实例,如下所示:

MYSERVICE   n/a (2) (2) UP (2) - MYHOST:MyService:8888 , MYHOST:MyService:9999
以下是我的zuul配置:

@EnableZuulProxy
@EnableDiscoveryClient

zuul:
  debug.request: true
  sensitiveHeaders: 
  routes:
ecm:
   path: /myservice/**
   serviceId: MYSERVICE
   stripPrefix: false
  host:
       maxTotalConnections: 200
       maxPerRouteConnections: 30
  RibbonRoutingFilter:
       route.disable: false
我想要一个过滤器或拦截器,它可以帮助我记录我的请求URL、请求参数和Zuul选择的服务器

我尝试扩展以下内容:

@Component
public class RibbonInterceptor extends ZoneAvoidanceRule {

@Override
public Server choose(Object key) {

Server choose = super.choose(key);
System.out.println(choose);
return choose;
}
但是,这只是给了我Ribbon的服务器信息,而Ribbon只是选择了一个服务器。我想从Zuul得到这个信息以及请求的详细信息


请帮忙

对于Zuul选择的请求URL和服务器,您可以在application.properties中将
LoadBalancerContext
的日志级别设置为
DEBUG

#logging load balancing information 
logging.level.com.netflix.loadbalancer.LoadBalancerContext=DEBUG
这将创建一个日志语句,如:

2017-09-11T12:59:09.746-07:00: [DEBUG] hystrix-myserviceV3-2 com.netflix.loadbalancer.LoadBalancerContext - myserviceV3 using LB returned Server: myservice-2.abc.com:8080 for request http:///myservice/auth/users

但是不确定如何处理请求参数。

假设您使用Apache HttpClient,有很多方法可以做到这一点,但我认为最简单的方法是向Ribbon使用的
CloseableHttpClient
添加
HttpRequestInterceptor
。您可以通过提供文档[1]中提到的
CloseableHttpClient
类型的bean来定制客户机。然后,您就有了HttpClient实际使用的请求,因此您可以记录详细信息

@Bean
public HttpClient delegate(IClientConfig clientConfig)
{
    HttpClientBuilder builder = HttpClientBuilder.create();
    //set connection pool configuration

    HttpRequestInterceptor interceptor = (request, context) -> logger.info("Server : {}, headers : {}", request.getRequestLine().getUri(), request.getAllHeaders());
    builder.addInterceptorFirst(interceptor);

    return builder.build();
}

您还可以扩展
HttpClientRibbonCommand
并重写
run()
方法来打印所需内容。您可以通过提供类型为
RibbonCommandFactory
的bean来使用新类,它应该自动连接到
RibbonRoutingFilter


最后,如果您在hystrix中使用信号量隔离策略,那么除了
com.netflix.zuul.context.RequestContext
之外,您还可以像您一样使用
RibbonInterceptor
。在
RequestContext
中,您可以找到原始
HttpServletRequest
以及在
pre
过滤器中处理的解析参数和头



[1]

您是否尝试过创建Zuul
post
过滤器?可能有关于选择了哪个端点的信息,也许在标题中,evenZuul筛选器没有详细公开与功能区相关的内容。已经通过实现前置、路由和后置过滤器进行了尝试。我还没有尝试过。将尝试尽快更新pos。谢谢:)你能列出其他可能的方法吗?这将在日志文件中打印出来。我需要一个实际的拦截器之类的东西,就在服务器和请求对象一起被选中之后。