Динамически удалить маршрут zuul без перезапуска шлюза - PullRequest
7 голосов
/ 12 марта 2019

Привет! Я хочу удалить маршрут zuul, который был создан динамически. Я не использую облачный сервер. Я могу добавить маршруты, используя discoveryclientroutelocator.

Но я не вижу возможности отменить регистрацию добавленного маршрута динамически. Это удаление должно произойти без перезапуска шлюза. Помогите.

    ZuulRoute zuulRoute = new ZuulRoute();
    zuulRoute.setId(externalapis.getServiceId());
    zuulRoute.setServiceId(externalapis.getServiceId());
    zuulRoute.setPath(externalapis.getPath());
    zuulRoute.setUrl(externalapis.getUrl());
    zuulRoute.setRetryable(true);
    discoveryClientRouteLocator.addRoute(zuulRoute);

Ответы [ 3 ]

3 голосов
/ 21 марта 2019

Вы можете расширить DiscoveryClientRouteLocator и добавить removeRoute() метод: Вот мой пример этого

@SpringBootApplication
@EnableZuulProxy
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }


    public static class DeregistrableDiscoveryClientRouteLocator extends DiscoveryClientRouteLocator {
        private final ZuulProperties properties;
        public DeregistrableDiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, ZuulProperties properties, ServiceInstance localServiceInstance) {
            super(servletPath, discovery, properties, localServiceInstance);
            this.properties = properties;
        }
        public DeregistrableDiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, ZuulProperties properties, ServiceRouteMapper serviceRouteMapper, ServiceInstance localServiceInstance) {
            this(servletPath, discovery, properties, localServiceInstance);
        }
        //here is new method to remove route from .properties.getRoutes()
        public void removeRoute(String path) {
            this.properties.getRoutes().remove(path);
            refresh();
        }
    }

    @Bean
    DiscoveryClientRouteLocator discoveryClientRouteLocator(ServerProperties server, ZuulProperties zuulProperties, DiscoveryClient discovery, ServiceRouteMapper serviceRouteMapper, @Autowired(required = false) Registration registration) {
        return new DeregistrableDiscoveryClientRouteLocator(server.getServlet().getContextPath(),
                discovery, zuulProperties, serviceRouteMapper,
                registration);
    }

    @Component
    public static class AppRunner implements ApplicationRunner {
        @Autowired
        DeregistrableDiscoveryClientRouteLocator discoveryClientRouteLocator;

        @Override
        public void run(ApplicationArguments args) throws Exception {

            ZuulProperties.ZuulRoute zuulRoute = new ZuulProperties.ZuulRoute();
            zuulRoute.setId("google");
            zuulRoute.setServiceId("google");
            zuulRoute.setPath("/");
            zuulRoute.setUrl("http://google.com");
            zuulRoute.setRetryable(true);
            discoveryClientRouteLocator.addRoute(zuulRoute);

            //now remove the pre-added route.
            discoveryClientRouteLocator.removeRoute(zuulRoute.getPath());
        }
    }
}

Таким образом, после этого вы можете создать конечную точку отдыха, которая удалит маршрут без перезапуска сервера.

0 голосов
/ 26 апреля 2019

Я использовал приведенный ниже код для добавления, удаления и обновления. Работает без перезапуска шлюза

Добавить маршрут:

this.zuulProperties.getRoutes().put(externalapis.getServiceId(), zuulRoute);

Удалить маршрут:

this.zuulProperties.getRoutes().remove(externalapis.getServiceId());

Обновление маршрута:

this.zuulProperties.getRoutes().remove(oldExternalapis.getServiceId());

this.zuulProperties.getRoutes().put(newExternalapis.getServiceId(), zuulRoute);
0 голосов
/ 22 марта 2019

вы можете использовать аннотацию @ RefreshScope для обновления свойств:

1 .- Добавить @RefreshScope к классу

@RefreshScope
@Component
public class ApplicationTest {

    @Autowired
    DiscoveryClientRouteLocator discoveryClientRouteLocator;

    @Value("${custom.property.id}")
    private String id;

    @Value("${custom.property.serviceId}")
    private String serviceId;

    @Value("${custom.property.path}")
    private String path;

    @Value("${custom.property.url}")
    private String url;

    @Value("${custom.property.retryable}")
    private boolean retryable;


    public void buildNewRoute(){
        ZuulRoute zuulRoute = new ZuulRoute();
        zuulRoute.setId(id);
        zuulRoute.setServiceId(serviceId);
        zuulRoute.setPath(path);
        zuulRoute.setUrl(url);
        zuulRoute.setRetryable(retryable);
        discoveryClientRouteLocator.addRoute(zuulRoute);
    }
}

2 .- Добавьте свойство флага и разрешите экспозицию конечной точке /refresh, чтобы обновить новые свойства.

application.properties

    custom.property.id=1
    custom.property.serviceId=service-id-01
    custom.property.path=/this/path
    custom.property.url=http://localhost:7070
    custom.property.retryable=true
    management.endpoints.web.exposure.include=*

3 .- После изменения application.properties, например:

    custom.property.id=3
    custom.property.serviceId=service-id-03
    custom.property.path=/this/path/new3
    custom.property.url=http://localhost:9999
    custom.property.retryable=false

Тогда вы можете refresh конфигураций впрыскивать, делая:

 curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"

СПИСОК ЛИТЕРАТУРЫ - https://spring.io/guides/gs/centralized-configuration/

...