获取要从Zuul +功能区转发请求的服务器的主机名/ IP:端口

时间:2018-02-01 18:58:12

标签: spring spring-boot spring-cloud netflix-zuul netflix-ribbon

我使用Eureka进行服务发现,使用Zuul +功能区作为反向代理和负载均衡器。 我在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的服务器信息,这里的功能区就是选择服务器。我想从Zuul获取此信息以及请求详细信息。

请帮助!!

2 个答案:

答案 0 :(得分:0)

对于请求URL和Zuul选择的服务器,您可以在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

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

答案 1 :(得分:0)

假设您使用Apache HttpClient,有很多方法可以做到这一点,但我认为最简单的方法是将HttpRequestInterceptor添加到Ribbon使用的CloseableHttpClient。您可以通过提供文档[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<YourExtendedRibbonCommand>类型的bean来使用新类,它应自动连接到RibbonRoutingFilter

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

[1] https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_zuul_http_client