2017-08-21 137 views
0

我有春天启动的基于微服务环境设置与此配置 -Tomcat的Zuul代理服务器不转发正确的客户端IP地址(request.getRemoteAddr())结束的microService

  1. 作为nginx的负载平衡器(配置为使用x-forwarded-for)
  2. 基于netflix zuul代理服务器的Spring Boot Powered API Gateway。 Tomcat是嵌入式容器。
  3. 基于Spring Cloud的产品微服务。 Tomcat作为嵌入式容器。

春天引导版本:1.5.6

当最终用户正在通话产品的microService,它经历的Nginx - > API网关 - >产品服务。

现在问题出现时,我想获得产品Microservice中的远程客户端IP地址。我总是得到127.0.0.1作为IP地址。这是在产品的microService是获取客户端IP

private String getClientIP() {  
    String xfHeader = request.getRemoteAddr(); 
    if (StringUtils.isBlank(xfHeader) || xfHeader.equals("127.0.0.1")) { 
     return request.getHeader("X-Forwarded-For"); 
    } 
    return xfHeader.split(",")[0]; 
} 

API网关application.properties配置为使用server.use-forward-headers: true

P.S.代码 当我尝试从tomcat切换到在我的api-gateway中时,然后我开始获取产品microservice中的真实客户端IP地址。所以问题出在我的Tomcat配置中的API网关。

回答

0

,你可以创建一个这样

zuul: 
    ignoreSecurityHeaders: false 
    routes: 
    app: 
     path: /app/** 
     sensitiveHeaders: 
     url: http://localhost:8082/app/ 
server: 
    compression: 
     enabled: true 
    port: 80 

zuul过滤器和改变位置和过滤

package smartHomeWebsite; 

import java.util.Optional; 

import org.springframework.cloud.netflix.zuul.filters.Route; 
import org.springframework.cloud.netflix.zuul.filters.RouteLocator; 
import org.springframework.stereotype.Component; 
import org.springframework.web.servlet.support.ServletUriComponentsBuilder; 
import org.springframework.web.util.UrlPathHelper; 

import com.netflix.util.Pair; 
import com.netflix.zuul.ZuulFilter; 
import com.netflix.zuul.context.RequestContext; 

@Component 
public class LocationHeaderRewritingFilter extends ZuulFilter { 

    private final UrlPathHelper urlPathHelper = new UrlPathHelper(); 
    private final RouteLocator routeLocator; 

    public LocationHeaderRewritingFilter(RouteLocator routeLocator) { 
     this.routeLocator = routeLocator; 
    } 

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

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

    public boolean shouldFilter() { 
     return extractLocationHeader(RequestContext.getCurrentContext()).isPresent(); 
    } 

    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     Route route = routeLocator.getMatchingRoute(urlPathHelper.getPathWithinApplication(ctx.getRequest())); 
     if (route != null) { 
      Pair<String, String> lh = extractLocationHeader(ctx).get(); 
      lh.setSecond(lh.second().replace(route.getLocation(), 
        ServletUriComponentsBuilder.fromCurrentContextPath().path(route.getPrefix()).build().toUriString())); 
     } 
     return null; 
    } 


    private Optional<Pair<String, String>> extractLocationHeader(RequestContext ctx) { 

     return ctx.getZuulResponseHeaders() 
       .stream() 
       .filter(p -> "Location".equals(p.first())) 
       .findFirst(); 
    } 
} 
相关问题