Spring 获取从Zuul+;将请求转发到的服务器的主机名/IP:端口;丝带
我使用Eureka进行服务发现,使用Zuul+ribbon作为反向代理和负载平衡器。 我在Eureka下注册了2个实例,如下所示: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:
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。谢谢:)你能列出其他可能的方法吗?这将在日志文件中打印出来。我需要一个实际的拦截器之类的东西,就在服务器和请求对象一起被选中之后。