2016-10-24 5 views
2

런타임시 Eureka에 등록 된 마이크로 서비스에 대한 Zuul 경로를 비활성화하려고합니다 (스프링 부트를 사용하고 있습니다).Spring Zuul : 동적으로 서비스 경로를 사용 중지합니다.

그 두
localhost/hello 
localhost/world 

microservices가 등록되어 있습니다

는 일례이다. 나는 그것들 중 하나에 대한 경로를 종료하지 않고 런타임에 비활성화하고자합니다.

이 방법이 있습니까?

클라우드 구성을 사용하여,

+0

역동적으로 코드를 통해 ... 클라우드 설정을 사용하는 경우 zuul 속성에서 라우팅을 제거하고 액추에이터를 통해 새로 고침하면 라우팅이 수행되지 않습니다. 이는 내게 역동적 인 것입니다 ... –

답변

0

많은 노력 끝에 나는이 해결책을 생각해 냈습니다. 첫째, Netflix Archaius를 사용하여 속성 파일을 보았습니다.

public class ApplicationRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator { 

public ApplicationRouteLocator(String servletPath, ZuulProperties properties) { 
    super(servletPath, properties); 
} 


@Override 
public void refresh() { 
    doRefresh(); 
} 
} 

이 인터페이스 RefreshableRouteLocator의 오버라이드 (override) 하나의 방법을 SimpleRouteLocator을 확장하고 호출하여 doRefresh() 메소드의 공개 다음과 같이 그럼 진행. 파일의 속성은 이벤트가 트리거 된 수정 된

@Configuration 
@EnableConfigurationProperties({ ZuulProperties.class }) 
public class ZuulConfig { 

public static ApplicationRouteLocator simpleRouteLocator; 

@Autowired 
private ZuulProperties zuulProperties; 

@Autowired 
private ServerProperties server; 

@Bean 
@Primary 
public RouteLocator routeLocator() { 
    logger.info("zuulProperties are: {}", zuulProperties); 
    simpleRouteLocator = new ApplicationRouteLocator(this.server.getServletPrefix(), 
      this.zuulProperties); 


    ConfigurationManager.getConfigInstance().addConfigurationListener(configurationListener); 

    return simpleRouteLocator; 
} 


private ConfigurationListener configurationListener = 
     new ConfigurationListener() { 

      @Override 
      public void configurationChanged(ConfigurationEvent ce) { 

          // zuulProperties.getRoutes() do something 
          // zuulProperties.getIgnoredPatterns() do something 
          simpleRouteLocator.refresh(); 
         } 



       } 

} 

모든 시간과 ConfigurationEvent는 (하면 getPropertyName()와 getPropertyValue 처리 할 수 ​​있었다 :

는 그럼 난 내 사용자 정의 구현에 빈 RouteLocator을 재정의()를 사용하여 이벤트에서 데이터를 추출하십시오. 필자도 ZuulProperties를 Autowired했기 때문에 그것에 접근 할 수있었습니다. 올바른 규칙으로 나는

zuul.ignoredPatterns 

Zuul

의 속성을 따라 ZuulProperties에서의 값을 변경 수정되었는지 여부를 찾을 수 있습니다.

0

또는

나노 감사, 사용자 정의 ZuulFilter 사용할 수 있습니다. blackList 응용 프로그램 ID의 목록 (봄 부팅 응용 프로그램 이름)을 포함

public class BlackListFilter extends ZuulFilter { 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 
    ... 
    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     String uri = ctx.getRequest().getRequestURI(); 
     String appId = uri.split("/")[1]; 
     if (blackList.contains(appId)) { 
      ctx.setSendZuulResponse(false); 
      LOG.info("Request '{}' from {}:{} is blocked", 
        uri, ctx.getRequest().getRemoteHost(), ctx.getRequest().getRemotePort()); 
     } 
     return null; 
    } 

} 

일부의 RESTful API를 통해 예를 들어 관리 : 비슷해 (부분 구현은 개념을 표시).

+0

필터에 대해서도 생각했지만 Zuul의 기본 속성을 사용하려고했습니다. :) – Nano

0

새 라우팅 규칙을 추가하거나 기존 규칙을 제거하지 않는 한 새로 고침 컨텍스트가 작동해야합니다. 라우팅 규칙을 추가하거나 제거하는 경우 ZuulProperties에 대한 새 bean을 추가하고 표시해야합니다 @RefreshScope, @Primary.

예를 들어 refreshEndpoint bean을 autowire하고 listener에 refreshEndpoint.refresh()를 적용 할 수 있습니다.

사용자 정의 RouteLocator를 1 차로 표시하면 zuul에 이미 동일한 유형의 bean이 primary로 표시되므로 문제가 발생할 수 있습니다.

관련 문제